设备介绍
设备驱动图示:

设备名字就是设备的名字,设备的id就是身份证的id,应用层通过名字open()一个设备,驱动层会找到这个名字的人(设备)可以有很多同名的人(设备),然后通过身份证id(设备id)找到具体是哪个人(设备)。
假如应用层open()一个按键文件,驱动层就open()按键相关的函数,
应用层open()-个串口,驱动层就open()串口相关的函数。关键点在于我们如何给一个东西代表按键、串口在应用层(linux是通过一个文件),然后还要对按键和串口在驱动层做多态处理。

- 字符设备驱动框架:

- 申请设备号:


proc/devices描述所有已经注册的设备(可自定义):
示例代码:






创建设备节点主要让内核创建两个结构体:struct class 和 struct device ,创建函数会返回创建好的地址,我们只需要在代码中定义指针就行。
代码中的创建就是自动创建设备文件会,在/dev/chr_cls(类)
1 | rt_err_t rt_device_register(rt_device_t dev, // rt_thread直接将linux里面的主设备号变成了一个具体的对象, |
文件io对象



应用层通过设备文件找到具体的设备(对象),然后对它进行read、write,就是调用驱动层写好的设备对象里定义好的read、wirte

rt里面应用层open,先要通过名字找到设备对象,linux是通过设备文件找到设备对象
1 | /** |
makefile修改

gcc最终效果
1 | /home/george/Linux 4412/toolchain/qcc-4.6.4/bin/arm-none-linux-gnueabi-gcc chr test.c -o chr test |
应用程序运行效果(执行了驱动程序的open、write)

驱动中要实现的read内核空间到应用空间、write用户空间到内核空间
1 | //buffer可以是malloc的全局数组和变量 |
copy_to_user()是对memcpy函数的封装,会对从用户空间传过来的buf指针进行判断,如果指针是NULL就会报错。使用copy_to_user()更安全。
返回值大于0代表还有多少个数据没有拷贝

内核控制外设的方法
MMU地址映射:通过ioremap(物理地址)返回一个内存中的虚拟地址



- 本文作者: 龙兄嵌入式
- 本文链接: https://hexo.880755.xyz/1970/01/01/zblog/download/68.设备LED驱动开发/
