生活随笔
收集整理的這篇文章主要介紹了
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'?? ? ? ?? ?? #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 内核移植(五)—— 驱动的移植的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。