一、什么是I/O包
I/O包就是内核要求设备完成的各种参数封装在一个数据结构中。这样就可以统一驱动程序功能函数的形式了。 objnode_t的数据结构中包括了各个驱动程序功能函数的所有参数。
1.创建和删除I/O包
创建I/O包就是在内存中建立objnode_t结构的实例变量并初始化它。
2.向设备发送I/O包
需要定义实现一个函数,将这个I/O发送给具体设备的驱动程序,以便驱动程序完成具体的工作。这个函数标志这一个设备驱动程序开始运行,经它之后内核就实际的控制权交给驱动程序,由驱动程序代表内核操控设备。krldev_io 函数,只接受一个参数,也就是 objnode_t 结构的指针。它会首先检查 objnode_t 结构中的 IO 操作码是不是合乎要求的,还要检查被操作的对象即设备是不是为空,然后调用 krldev_call_driver 函数。这个 krldev_call_driver 函数会再次确认传递进来的设备和 IO 操作码,然后重点检查设备有没有驱动程序。这一切检查通过之后,我们就用 IO 操作码为索引调用驱动程序功能分派函数数组中的函数,并把设备和 objnode_t 结构传递进去。
二、驱动函数实例
systick 设备驱动,systick 设备的主要功能和作用是每隔 1ms 产生一个中断,相当于一个定时器,每次时间到达就产生一个中断向系统报告又过了 1ms,即每秒钟内产生 1000 次中断。
1.systick设备驱动程序的整体框架
2.systick设备驱动程序的入口
3.配置设备和驱动
4.打开和关闭设备
5.systick 设备中断回调函数
|