以移植自己制作的驱动,学习内核移植中的驱动移植,及 驱动程序的动态编译和静态编译
硬件环境:
Linux 内核版本:Linux 3.14
主机:Ubuntu 12.04发行版
目标机:FS4412平台
交叉编译工具:arm-none-linux-gnueabi-gcc
一、静态编译
1、添加驱动文件
将写好的实验代码fs4412_led_drv.c 拷贝到 drivers/char 下
fs4412_led_drv.c 如下:
#include #include #include #include #include #include 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_regionn"); return ret; } cdev_init(&cdev, &s5pv210_led_fops); cdev.owner = THIS_MODULE; ret = cdev_add(&cdev, devno, LED_NUM); if (ret < 0) { printk("cdev_addn"); goto err1; } gpx2con = ioremap(FS4412_GPX2CON, 4); if (gpx2con == NULL) { printk("ioremap gpx2conn"); ret = -ENOMEM; goto err2; } gpx2dat = ioremap(FS4412_GPX2DAT, 4); if (gpx2dat == NULL) { printk("ioremap gpx2datn"); ret = -ENOMEM; goto err3; } writel((readl(gpx2con) & ~(0xf << 28)) | (0x1 << 28), gpx2con); writel(readl(gpx2dat) & ~(0x1<<7), gpx2dat); printk("Led initn"); 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 exitn"); } 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 下任意目录下并交叉编译测试程序 具体代码如下: #include #include #include #include #include #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 内核移植(六)—— 设备树解析
下一篇:Exynos4412 Uboot 移植(四)—— Uboot引导内核过程分析
推荐阅读最新更新时间:2024-11-10 10:43
推荐帖子
- DSP优化
- 从在DSP上做智能视频以来,看到很多优化的文档,受益非浅,在这根据俺这短短的经验,也总结一二。优化分很多方面,或者说不同的层次,不同方面的考虑的问题和优化方式完全不同,俺稍微懂点的会慢慢展开,不懂的继续学习...1)系统2)算法3)编译4)循环5)计算(定点,位计算)6)线性汇编7)汇编优化是个无底洞,不过俺觉得有几个原则:1)只要满足了系统的要求,就没必要一直做下去。一旦数上了cycles,就容易上瘾,所以花费的精力也越来越多,但是效益往往降低。2)
- svmtracking DSP 与 ARM 处理器
- CAN 网络通讯检测
- 物理层检测哪里可以做呢?CAN网络通讯检测想做什么?要得到什么结果工具:示波器+某软件如:周立功的USB转CAN(淘宝几百)Kvaser的USBCAN(几千块)Vector的VN1600(几万)
- jessica8780465 汽车电子
- 【机器人底盘说】 基于Athena2.0底盘的智能“馆长”,能导引,会乘梯
- 思岚科技的技术理念一直是软硬结合,以软件为牵引、硬件为驱动、系统为闭环,实现算法、算力和系统的全面技术突破。在科幻片《头号玩家》中,博物馆馆长凭借智能调动图书查阅相关历史和文化的能力,成功帮助韦德沃兹逐近彩蛋所在地。在现实生活中,智能图书馆馆长也并不少见。这款图书馆机器人可满足图书馆智能问答、引导、图书信息查询、查找、配送等多项功能,提高图书馆的服务效率和质量,为读者提供更加便捷、高效、个性化的服务的同时,也推动图书馆的数智化升级。
- SLAMTEC思岚科技 传感器
- EEWORLD大学堂----电机应用开发实战指南-基于STM32
- 抛砖引玉 工控电子
- MCU设备
- 田朗电子致力于---音响方案提供和收音头的生产.以收音系统(AM中波/FM调频/SW1短波1/SW2短波2)模块为基础,整合开发一体化汽车音响和家用音响方案,为终端制造厂商提供包括收音头、MCU设备,核心软件芯片、协议,音响参考设计方案(AM/FM收音、USBHOST/SD插卡MP3播放、iPod控制、蓝牙免提)和生产技术在内的整体解决方案。MCU设备
- tunersys 单片机
- 请教高手
- 在单片机编程时用KEIL编译器老出现下面警告,请问下是什么意思:***WARNINGL1:UNRESOLVEDEXTERNALSYMBOL***WARNINGL2:REFERENCEMADETOUNRESOLVEDEXTERNAL请教高手
- miaoxueming 单片机
设计资源 培训 开发板 精华推荐
- 使用 Analog Devices 的 ADP3301 的参考设计
- 使用 Microchip Technology 的 TC38C46COE 的参考设计
- 【新疆工程学院电赛】呼吸灯设计
- ADR433A 3 Vout 超低噪声 XFET 电压基准的典型应用,具有灌电流和拉电流能力
- 使用 Cypress Semiconductor 的 MB39C006A 的参考设计
- LTC2171CUKG-14、14 位、40Msps 低功耗四通道 ADC 的典型应用
- STM32开发板
- AD8615AUJZ-R2单电源缓冲网络运算放大器典型应用电路
- 使用 Semtech 的 SC1592 的参考设计
- MCP1501T-30E/RW 3.000V 负参考电压的典型应用电路