"); //-->
看了我前面的文章,基本能掌握如何从0写一个最简单的驱动模块并进行测试了。那么接下来的文章都是在这个最基本的代码上不断的堆叠,添加更加复杂的功能。
1. open、read、write文件操作的第一步先填充file_operations结构体file_operations结构体的存在让应用层可以使用统一的接口访问硬件,只需要调用xxx_fops.open、xxx_fops.read等,至于你的驱动如何操作硬件的写应用程序的人不必关心,完全由驱动程序的xxx_open、xxx_read等具体的接口去实现,这也是典型的分层思想。
关于函数的命名是自由的,但为了规范,一般都是xxx_open,xxx即此设备驱动对应的设备的名字,比如key、lcd、mpu6050等。出于对设备文件的保护,所以当应用程序要使用某个设备的时候是需要先打开这个设备的,然后才能读写使用,那么当执行打开设备的动作时,内核就会调用驱动里面的这个.open函数,即我们即将实现的xxx_open函数,所以在这个函数里面我们要做的就是对设备进行初始化操作。
目前我们先实现框架,没有具体的设备,所以这个函数里面暂时什么事情都不做,只加一个打印,便于我们跟踪。
3. 实现hello驱动的hello_close函数对设备文件有打开的操作,那么必然也有关闭的操作,对应file_operations里面的.release函数,这个函数的实现我们一般命名为xxx_close函数,要实现的功能就是设备读写完毕后关闭或者释放掉这个设备所申请的所有资源,以便下一个应用程序再次操作这个设备。
4. 实现hello驱动的hello_read函数当应用程序打开设备文件,对设备文件进行读操作的时候,会调用到fops里面的xxx_read函数,所以再这个函数里面要把资源cp给应用程序。
这个地方有个需要注意的地方,我们把资源cp给应用程序,即read函数的buf参数,不是直接赋值的,而是调用的copy_to_user函数,这是因为驱动里面的数据是保存在内核空间的,而应用程序的数据是在用户空间的,这涉及到用户空间(应用程序)和内核空间(驱动)数据的交互,就不能使用简单的赋值了。
5. 实现hello驱动的hello_write函数以上就是实现open、read、write文件操作的核心代码,下一篇文章将详细讲解如何测试这个代码以及分析应用程序调用驱动的整体过程。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。