GPIO驱动可以归类为Linux设备驱动的字符设备驱动,以下是开发它的一些具体步骤。
(1)模块化驱动程序
不失Linux驱动开发的一般性,在写字符设备的驱动程序时,也要遵守模块化编程的一般规范。设备模块在用户空间的初始化和终止:
●Init mnodule()向内核注册模块提供数据结构、局部和全局变量。
●Cleanup_module()取消所有init_module在内核中的注册。
(2)设备模块在内核空间的内存申请和释放
kmalloc()函数分配一段内存,这样就实现了Chrdevs向量表中指向设备驱动程序名称的指针。使用kfree释放内存。
(3)字符设备主设备号和次设备号的分配
主设备号标志设备对应的驱动程序,内核利用主设备号将设备与相应的驱动程序对应起来。主设备号的取值范围是0~255,如果不善加规划,则容易造成主设备号的冲突。主设备号的分配有静态和动态之分,从开发设备的角度来看,推荐静态设备号的分配。
次设备号由驱动程序使用,内核的其他部分并不使用它,仅将它传递给驱动程序。一个驱动程序控制若干个设备,次设备号提供了一种区分它们的方法。
(4)设备模块在内核空间的注册与注销
字符设备的注册有2种方法,一种是常用注册方法,通过系统函数register_chrdev()将设备加入到系统设备列表中;另一种方法是devfs技术,通过系统函数devfs ̄register()实现设备的注册。注销与注册相反,分别调用unregister_chrdev()函数和devfs_unregister()函数。
(5)设备模块在内核空间提供系统调用的函数
设备驱动程序在注册成功以后,用户可以通过访问设备特殊文件(一般情况在/dev目录下)实现系统调用。
GPIO驱动程序只需要一个file_operati。ns数据结构体就可以了。这是因为GP10本身在设计阶段就定制好了接入的物理设备,接入到GPIO端口的物理设备并不需要即插即用。因此可以在开发阶段定制该接口的物理设备`也可以担这个接口的设各作为该产品的标配外设发布。
这样,在编写驱动程序的过程中,只要写好应用程序使用标准系统调用打开、读取、写和关闭等处理函数,就可以完成驱动程序的开发。其中,标准系统调用处理函数在所有的字符设备里面具有同样的功能。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。