日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Exynos4412 内核移植(五)—— 驱动的移植

發布時間:2023/12/9 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Exynos4412 内核移植(五)—— 驱动的移植 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以移植自己制作的驅動,學習內核移植中的驅動移植,及 驅動程序的動態編譯和靜態編譯


硬件環境:

Linux 內核版本:Linux 3.14

主機:Ubuntu 12.04發行版

目標機:FS4412平臺

交叉編譯工具:arm-none-linux-gnueabi-gcc


一、靜態編譯

1、添加驅動文件

? ? ? ?將寫好的實驗代碼fs4412_led_drv.c 拷貝到 drivers/char 下

fs4412_led_drv.c 如下:

[cpp]?view plaincopy
  • #include?<linux/kernel.h>??
  • #include?<linux/module.h>??
  • #include?<linux/fs.h>??
  • #include?<linux/cdev.h>??
  • ??
  • #include?<asm/io.h>??
  • #include?<asm/uaccess.h>??
  • ??
  • MODULE_LICENSE("Dual?BSD/GPL");??
  • ??
  • #define?LED_MAGIC?'L'??
  • /*?
  • ?*?need?arg?=?1/2??
  • ?*/??
  • ??
  • #define?LED_ON??_IOW(LED_MAGIC,?0,?int)??
  • #define?LED_OFF?_IOW(LED_MAGIC,?1,?int)??
  • ??
  • ??
  • #define?LED_MA?500??
  • #define?LED_MI?0??
  • #define?LED_NUM?1??
  • ??
  • #define?FS4412_GPX2CON??0x11000C40??
  • #define?FS4412_GPX2DAT??0x11000C44??
  • ??
  • static?unsigned?int?*gpx2con;??
  • static?unsigned?int?*gpx2dat;??
  • ??
  • struct?cdev?cdev;??
  • ??
  • static?int?s5pv210_led_open(struct?inode?*inode,?struct?file?*file)??
  • {??
  • ????return?0;??
  • }??
  • ??????
  • static?int?s5pv210_led_release(struct?inode?*inode,?struct?file?*file)??
  • {??
  • ????return?0;??
  • }??
  • ??????
  • static?long?s5pv210_led_unlocked_ioctl(struct?file?*file,?unsigned?int?cmd,?unsigned?long?arg)??
  • {??
  • ????int?nr;??
  • ??
  • ????switch?(cmd)?{??
  • ????????case?LED_ON:??
  • ????????????writel(readl(gpx2dat)?|?1?<<?7,?gpx2dat);??
  • ????????????break;??
  • ????????case?LED_OFF:??
  • ????????????writel(readl(gpx2dat)?&?~(1?<<?7),?gpx2dat);??
  • ????????????break;??
  • ????}??
  • ??
  • ????return?0;??
  • }??
  • ??????
  • struct?file_operations?s5pv210_led_fops?=?{??
  • ????.owner?=?THIS_MODULE,??
  • ????.open?=?s5pv210_led_open,??
  • ????.release?=?s5pv210_led_release,??
  • ????.unlocked_ioctl?=?s5pv210_led_unlocked_ioctl,??
  • };??
  • ??
  • static?int?s5pv210_led_init(void)??
  • {??
  • ????dev_t?devno?=?MKDEV(LED_MA,?LED_MI);???
  • ????int?ret;??
  • ??
  • ????ret?=?register_chrdev_region(devno,?LED_NUM,?"newled");??
  • ????if?(ret?<?0)?{??
  • ????????printk("register_chrdev_region\n");??
  • ????????return?ret;??
  • ????}??
  • ??
  • ????cdev_init(&cdev,?&s5pv210_led_fops);??
  • ????cdev.owner?=?THIS_MODULE;??
  • ????ret?=?cdev_add(&cdev,?devno,?LED_NUM);??
  • ????if?(ret?<?0)?{??
  • ????????printk("cdev_add\n");??
  • ????????goto?err1;??
  • ????}??
  • ??
  • ????gpx2con?=?ioremap(FS4412_GPX2CON,?4);??
  • ????if?(gpx2con?==?NULL)?{??
  • ????????printk("ioremap?gpx2con\n");??
  • ????????ret?=?-ENOMEM;??
  • ????????goto?err2;??
  • ????}??
  • ??
  • ????gpx2dat?=?ioremap(FS4412_GPX2DAT,?4);??
  • ????if?(gpx2dat?==?NULL)?{??
  • ????????printk("ioremap?gpx2dat\n");??
  • ????????ret?=?-ENOMEM;??
  • ????????goto?err3;??
  • ????}??
  • ??
  • ????writel((readl(gpx2con)?&?~(0xf?<<?28))?|?(0x1?<<?28),?gpx2con);??
  • ????writel(readl(gpx2dat)?&?~(0x1<<7),?gpx2dat);??
  • ??
  • ????printk("Led?init\n");??
  • ??
  • ????return?0;??
  • err3:??
  • ????iounmap(gpx2con);??
  • err2:??
  • ????cdev_del(&cdev);??
  • err1:??
  • ????unregister_chrdev_region(devno,?LED_NUM);??
  • ????return?ret;??
  • }??
  • ??
  • static?void?s5pv210_led_exit(void)??
  • {??
  • ????dev_t?devno?=?MKDEV(LED_MA,?LED_MI);??
  • ??
  • ????iounmap(gpx2dat);??
  • ????iounmap(gpx2con);??
  • ????cdev_del(&cdev);??
  • ????unregister_chrdev_region(devno,?LED_NUM);??
  • ????printk("Led?exit\n");??
  • }??
  • ??
  • module_init(s5pv210_led_init);??
  • module_exit(s5pv210_led_exit);??

  • 2、修改drivers/char/Kconfig

    ? ? ? ?在menu "Character devices"下面添加如下內容:


    可以看到 配置界面里已經有該配置選項

    打開help看一下,和我們寫的都一樣


    3、修改 drivers/char/Makefile?

    ? ? ? 在文件最后添加如下代碼



    4、將?fs4412_led_app.c 拷貝到linux 下任意目錄下并交叉編譯測試程序


    具體代碼如下:

    [cpp]?view plaincopy
  • #include?<stdio.h>??
  • #include?<fcntl.h>??
  • #include?<unistd.h>??
  • #include?<stdlib.h>??
  • #include?<sys/ioctl.h>??
  • ??
  • #define?LED_MAGIC?'L'??
  • ??
  • #define?LED_ON??_IOW(LED_MAGIC,?0,?int)??
  • #define?LED_OFF?_IOW(LED_MAGIC,?1,?int)??
  • ??
  • int?main(int?argc,?char?**argv)??
  • {??
  • ????int?fd;??
  • ??
  • ????fd?=?open("/dev/led",?O_RDWR);??
  • ????if?(fd?<?0)?{??
  • ????????perror("open");??
  • ????????exit(1);??
  • ????}??
  • ??
  • ????while(1)??
  • ????{??
  • ????????ioctl(fd,?LED_ON);??
  • ????????usleep(100000);??
  • ????????ioctl(fd,?LED_OFF);??
  • ????????usleep(100000);??
  • ????}??
  • ??
  • ????return?0;??
  • }??


  • 5、靜態編譯LED驅動

    a -- 配置內核時按“空格”選擇,配置完成后保存退出


    注意:這里是 * 號,是Y,要編進內核的


    b -- 保存退出,重新編譯后把 uImage 拷貝到tftpboot 下

    make uImage

    cp arch/arm/boot/uImage /tftpboot


    ?重啟開發板,加載內核并運行,在終端下執行下面操作

    c -- 創建設備節點

    mkdnod /dev/ledc 5000

    注:設備號 cat/proc/devices 查看


    d -- 運行測試程序并觀察現象

    ./fs4412_led_test



    二、動態編譯

    1、配置內核時按“空格”選擇,配置完成后保存退出


    注意:這里選擇是M,編成模塊。


    2、保存退出,重新編譯后把uImage 拷貝到tftpboot下,把驅動模塊拷貝到 /nfsroot/rootfs 下

    make uImage modules

    cp arch/arm/boot/uImage /tftpboot

    cp drivers/char/fs4412_led_drv.ko /nfsroot/rootfs


    重新啟動開發板,linux運行起來后在終端下操作

    a -- 創建設備節點

    mknod dev/ledc 5000


    b -- 加載LED驅動模塊

    insmod fs4412_led_drv.ko


    c -- 運行測試程序并觀察現象

    ./fs4412_led_app

    總結

    以上是生活随笔為你收集整理的Exynos4412 内核移植(五)—— 驱动的移植的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。