愿自己每天都有更新。
字符设备驱动程序之概念介绍
u-boot:启动内核
内核:启动应用
应用层,调用c库,产生中断
系统调用接口,接收中断,调用不同处理函数。
VFS,虚拟文件系统。
驱动程序框架,就是把应用程序中的open,read和write对应
驱动中的open,read和write
【我有个疑惑,为什么不把open去掉。只用读写不就行了吗???】
写驱动的路程
1.写出open、read、write等功能函数
2.告诉内核我已写出:定义file_operations结构体,然后填充它。
3.把file_operations告诉内核,register_chrdev,即注册函数。注册驱动程序。
4.驱动的入口函数。 first_drv_init(),,还可以有好几个。它调用了register_chrdev
5.修饰入口函数,用宏实现。module_init(first_drv_init),实际上是个函数指针。
【其实感觉过程有点复杂,还不如,直接指到函数???】
主设备号,次设备号。(注册的时候有主设备号。)
根据设备类型,和主设备号来找到驱动程序。
内核数组中chrdev,根据设备类型和主设备号major,找到file_operation。这是通过register_chrdev注册到数组中的。
有注册就有卸载。
有入口函数,就有出口函数
first_drv_exit
unregister_chrdev
需要修饰,用宏定义结构体,有指针指向first_drv_exit。
除此之外还要创建设备节点。
之后程序的改进,led点灯,,
【这里我想到可以把灯的函数,也就是板子上的操作写到一个地方。】
单片机是操作物理地址,但这里是操作虚拟地址。
ioremap进行映射到虚拟地址。
【还有一点,为什么要使用虚拟地址呢???】
《字符设备驱动之LED驱动程序_操作LED》
次设备号是自己规定怎么用的。
比如用次设备号,点亮不同的灯。
自动创建设备点。