700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【ARM】Linux驱动移植

【ARM】Linux驱动移植

时间:2019-10-20 08:27:56

相关推荐

【ARM】Linux驱动移植

文章目录

#1驱动模块移植过程

##1.1模块的第一种编译方法——改kconfig第一步:改kconfig

文件在:Drivers/char/kconfig;

tristate三态表示可以编译在模块<M>

bool表示只能被选择编[*]或不编[ ]

第二步:配置内核

make menuconfig后会自动生成供编译的.config文件。

wuchengbing@ubuntu:~/linux/kernel-2.6.13$ make menuconfigDevice Drivers ---> Character devices ---> [*] S3C2410 RTC Driver │ │ <M> QQ2440/mini2440 LEDs Driver │ │ <M> QQ2440/mini2440 PWM beeper Driver│ │ <M> QQ2440/mini2440 Hello Module sample │ │ <M> QQ2440 Buttons

如果make menuconfig没有出来该选项,可先cp config_n35 .config->make->make menuconfig,然后成生如下.config文件。

wuchengbing@ubuntu:~/linux/kernel-2.6.13$ gedit .config# CONFIG_WATCHDOG is not set# CONFIG_NVRAM is not set# CONFIG_RTC is not setCONFIG_S3C2410_RTC=yCONFIG_QQ2440_LEDS=mCONFIG_QQ2440_PWM_BEEPER=yCONFIG_QQ2440_HELLO_MODULE=m… …

如果选择是[*],即yes,则该驱动在系统运行自动加载;如果选择是<M>,则要使用该驱动要手工加载。

第三步:编译内核得到驱动模块

make,后生成对应的驱动模块.ko文件。

wuchengbing@ubuntu:~/linux/kernel-2.6.13$make… …LDvmlinuxSYSMAP System.mapSYSMAP .tmp_System.mapOBJCOPY arch/arm/boot/ImageKernel: arch/arm/boot/Image is readyASarch/arm/boot/compressed/head.oGZIP arch/arm/boot/compressed/piggy.gzASarch/arm/boot/compressed/piggy.oCCarch/arm/boot/compressed/misc.oLDarch/arm/boot/compressed/vmlinuxOBJCOPY arch/arm/boot/zImageKernel: arch/arm/boot/zImage is readyBuilding modules, stage 2.MODPOSTCCdrivers/char/mini2440_backlight.mod.oLD [M] drivers/char/mini2440_backlight.koCCdrivers/char/qq2440_buttons.mod.oLD [M] drivers/char/qq2440_buttons.koCCdrivers/char/qq2440_hello_module.mod.oLD [M] drivers/char/qq2440_hello_module.koCCdrivers/char/qq2440_leds.mod.oLD [M] drivers/char/qq2440_leds.koCCdrivers/char/qq2440_pwm.mod.oLD [M] drivers/char/qq2440_pwm.kowuchengbing@ubuntu:~/linux/kernel-2.6.13$

qq2440_leds.ko

wuchengbing@ubuntu:~/linux/kernel-2.6.13$ ls driver/char/…-rw-rw-r-- 1 wuchengbing wuchengbing 1368 Apr 17 20:38 qq2440_hello_module.o-rw-rw-r-- 1 wuchengbing wuchengbing 3108 Apr 17 20:38 qq2440_pwm.o-rw-rw-r-- 1 wuchengbing wuchengbing 1412 Apr 17 20:39 qq2440_hello_module.mod.o-rw-rw-r-- 1 wuchengbing wuchengbing 2247 Apr 17 20:39 qq2440_hello_module.ko-rw-rw-r-- 1 wuchengbing wuchengbing 1404 Apr 17 20:39 qq2440_leds.mod.o-rw-rw-r-- 1 wuchengbing wuchengbing 3133 Apr 17 20:39 qq2440_leds.ko-rw-rw-r-- 1 wuchengbing wuchengbing 1404 Apr 17 20:39 qq2440_pwm.mod.o-rw-rw-r-- 1 wuchengbing wuchengbing 3957 Apr 17 20:39 qq2440_pwm.ko

./mkimage.sh

wuchengbing@ubuntu:~/linux/kernel-2.6.13$ cd arch/arm/boot/wuchengbing@ubuntu:~/linux/kernel-2.6.13/arch/arm/boot$ ./mkimage.sh Image Name: linux-2.6.13Created:Mon Apr 17 20:33:08 Image Type: ARM Linux Kernel Image (uncompressed)Data Size: 1537008 Bytes = 1500.98 kB = 1.47 MBLoad Address: 0x30008000Entry Point: 0x30008040wuchengbing@ubuntu:~/linux/kernel-2.6.13/arch/arm/boot$

第四步:拷贝到文件系统,挂载板子,插入模块

运行示例程序编译出来的./a.out,板子的LED就会亮了。

License问题很需要在驱动代码加入MODULE_LICENSE("GPL");

... ...module_init(qq2440_leds_init);module_exit(qq2440_leds_exit);MODULE_LICENSE("GPL");

示例程序

应用程序,通过驱动调用板子LED。

#include <stdio.h>#include <fcntl.h>#include <sys/ioctl.h>#include <stdlib.h>int main(void){int fd;int i = 0;fd = open("/dev/leds",O_RDONLY);if(fd==-1){perror("open failed");exit(1);}while(1){ioctl(fd,0,0);ioctl(fd,0,1);ioctl(fd,0,2);ioctl(fd,0,3);sleep(1);ioctl(fd,1,0);ioctl(fd,1,1);ioctl(fd,1,2);ioctl(fd,1,3);sleep(1);}return 0;}

##1.2模块的第二种编译方法——Makefile

第一步:写Makefile 第二步:直接把内核驱动拷贝出来 第三步:编译 第四步:安装 第五步:插入模块看现象

#2Linux驱动原理

##2.0从哪里切入

开发板自带的led程序(qq2440_leds_init)【被module_init调用----知道这里就行了】

##2.1什么是注册

##2.2register_chrdev提交哪些数据

###2.2.1设备号为什么是231

怎么知道设置231

/zjjyliuweijie/article/details/7001383

设置为231是因为231没有人使用。

###2.2.2设备名随便给

###2.2.3文件操作结构体怎么设置

file_operations中各项解析

/sunsea1026/article/details/6586143

####什么是THIS_MODULE?

THIS_MODULE在代码中复制给了owner,owner顾名思义是属主的意思,当把THIS_MODULE复制给owner,表示该结构体属于当前模块,那么当前模块又是谁呢?当前模块就是:

####Open,close,read这些都好理解

##2.3register_chrdev返回什么?

###2.3.1 简洁而高效的goto

用不用goto一直是一个著名的争议话题,Linux内核源码中对goto的应用非常广泛,但一般只局限于错误处理中!这种goto用于错误处理的用法实在是简单而高效,只需保证在错误处理的时候记得注销,释放资源等!(与正常的注册,申请资源顺序相反)

###2.3.2 还记得什么是三目运算符吗?

###2.3.3 返回0表示什么?

当major为真的时候返回0,是什么意思呢?

Major为真的情况,只有可能>0,因为major的类型是unsigned。所以,当major大于0的时候,函数返回0,表示函数执行成功!

###2.3.4 什么情况下返回cd->major?

Major为假的情况,只有一种情况,等于零。那么major=0,表示什么呢?

当在调用register_chrdev函数的时候,

如果传进去的major=0,表示自己不定义设备号,由系统自动分配!如果传进去的major>0,表示传入自己定义的设备号,不用系统自动分配!

我们是怎么知道的?

###2.3.5 次设备号怎么分配呢?

###2.3.6 出错返回什么?

ENOMEM是什么?

现在能猜出cdev_add返回什么吗?

##2.4字符设备到底注册到了哪里?

##2.5devfs_mk_cdev实现了什么?

Device FileSystem Make CharDevice

主要实现在文件系统下面建立一个设备文件,设备文件的名称就是DEVICE_NAME;

###2.5.1 devfs_mk_cdev参数怎么用?

###2.5.2 MKDEV功能

Make Device

###2.5.3 访问模式

Chmod ,0777,umask

[转载]stat函数与结构体

/s/blog_6dd1df4e0100o50q.html

###2.5.4 现象

下面是驱动成功注册后,在文件系统中生成的设备文件。

##2.6file_operations结构体如何实现

###2.6.1 qq2440_leds_ioctl要实现哪些功能?

###2.6.2 s3c2410_gpio_setpin在哪里

##2.7引脚控制

这里s3c2410_gpio_cfgpins3c2410_gpio_setpin就对接上篇文章《ARM接口技术》原理了。

##2.8代码调用关系

##2.9module_init函数

参考《linux驱动的入口函数module.docx》

#附录

工具下载链接:

/1040003585/Mini2440/tree/master/Tools

Wu_Being 博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!

《【ARM】Linux驱动移植》

/u014134180/article/details/72887673

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。