第三方驱动移植
一、驱动编译进内核Makefile
1、首先找内核中是否已经支持设备的驱动 选配
2、内核中没有的驱动移植进来 --第三方驱动移植
将第三方驱动代码放到linux源码树中的driver目录中
修改 Makefile Kconfig(界面配置)
修改过的和新添加的代码会重新编译
程序需要在板子上运行 就需要使用交叉编译工具编译
mknod /dev/led c或者b 主设备号 次设备号
二、make menuconfig、Makefile、Kconfig、.config
三者的关系
Makfile 具体编译文件
Kconfig 选配,生成图形化界面
在Kconfig中添加一个灯的选项
界面修改好了, 还需要再次修改 Makfile
[] 只有两种选项编译(y)或者不编译(n) <> 三种选项 编译(y)、不编译(n)或者编译成模块(m)
obj-y obj-n obj-$(CONFIG_XXX)
方便驱动管理
三、驱动模块
驱动模块学习 详细视频
linux 内核模块 http://www.makeru.com.cn/live/1392_586.html
驱动初级也会详细讲解
1. Makefile 编写
2. C程序代码编写
3. 编译出 ko 模块
make modules 编译所有的模块
在linux运行时,可以装载和卸载模块
通过 手动加载模块 insmod *.ko
mknod
四、黑白盒对比
黑盒移植
两种方式
1. 驱动编译进内核
选则源码目录
修改Makefile
修改Kconfig
2. 将驱动编译成独立的模块
配置为模块方式 通过修改Kconfig
使用make modules 编译为模块
装载模块 insmod xxx.ko
创建设备结点 mknod /dev/xxx c xx xx
运行测试驱动的应用程序
白盒移植
需要阅读阅读源码,熟悉驱动框架
1. 字符设备 2. 平台设备
字符设备框架
application
User Mode ||
\/
------------------------------------
System Call Interface
||
Kernel Mode \/
Virture File System(VFS)
| | |
Character Block Network
| | |
Device interface
||
\/
--------------------------------------
Hardware Physical Device (Hardware)
五、字符设备引入
1.一切设备皆文件
对设备的操作的就是 对设备文件的 read write
2. open read write ioctl
3. 将设备进行编号 设备号(主次设备号组成)
字符设备驱动相关
1. 注册获取设备号
2. 初始化设备
3. 操作设备 file_operations -- open release read write ioctl...
4. 两个宏定义 module_init module_exit 两个命令 insmod rmmod
5. 注册设备号 register_chrdev_region
6. cdev_init 初始化字符设备
7. cdev_add 添加字符设备到系统
驱动是被动调用的,是被应用程序触发的
应用程序的 open 调用到驱动的file_operations 的 open
应用程序的 read 调用到驱动的file_operations 的 read
应用程序的 write 调用到驱动的file_operations 的 write
应用程序的 ioctl 调用到驱动的file_operations 的 ioctl
应用程序的 close 调用到驱动的file_operations 的 release
六、平台设备引入
1. 寄存器的地址值是根据芯片手册 和原理图找到的
2. 对寄存器地址内容操作不能直接使用物理地址,需要ioremap
3. ioremap 将物理地址 映射到虚拟地址
4. platform 用于将硬件信息 和驱动代码做分离
5. 通过名字匹配,匹配成功执行 probe函数
6. 驱动通过 platform_get_resource 获取硬件设备资源
7. 作用 容易维护