嵌入式linux学习笔记4之字符设备驱动

2019-07-12 23:02发布

Linux访问底层硬件需要利用驱动程序,linux的驱动程序有固定的框架,在框架之上加上自己要访问的硬件及操作就能编好驱动程序。 参考韦东山的《嵌入式Linux应用开发完全手册》第十九章,写一写自己的理解。 首先是设备的初始化,通过module_init(init_function_name)来指定通过insmod装载设备时调用的初始化函数,初始化函数里完成设备的注册,并制定该设备的file_oprations结构体,主设备号和设备名称,在设备对应的file_operations结构体里可以指定上层函数调用该设备时的read,write,ioctl等函数,在这些函数里可以实现具体的对硬件的访问与操作,另外值得一提的是,在linux环境下不能通过直接的物理地址来访问寄存器,一种可以通过将物理地址映射为虚拟地址之后进行访问(目前,这种我还没搞懂),另一种是直接调用系统函数来进行配置,如s3c2410_gpio_setpin(),s3c2410_gpio_cfgpin()等,通过这两种方式可以对管脚进行配置。当关闭设备时file_oprations结构体内也有close函数与之相对应,另外通过module_exit(exit_function_name)来制定通过rmmod指令来卸载设备时调用的退出函数。 驱动程序写好后,在drivers/char路径下的Makefile里添加一句obj-m += yourfilename.o,再退回到linux文件的根目录下执行make modules,在drivers/char路径下即可找到yourfilename.ko文件,通过nfs将生成的驱动拷贝到开发板上,将该.ko文件拷贝到板上的/lib/modules路径下,通过mknod /dev/yourdrivername c yourdrivernajor yourdriverminor 来添加设备。
写好测试程序,测试程序里包含open,ioctl函数等,用arm-linux-gcc编译器编译后放到开发板上,在可执行文件的目录下执行该文件即进行程序的测试。
再来说说驱动程序中中断的使用,本人对中断的理解还不深入,通过这几天的调试,能够使用中断,仅此而已。 驱动的框架跟上边的框架是一样的,不同的是在open函数里调用request_irq函数来申请中断,其中的参数包括中断号,中断处理函数的名称,中断的标志,中断的名称,中断的不同id号。中断号和中断id号是有区别的,好多中断可能会有同一个中断号,但为了将其区分,有了不同的id号(个人理解)。在注册中断的时候有中断函数的名称,在该名称的函数内即为中断处理函数,其中有两个(或者更多?)参数——中断号与中断id号来进行不同中断的区分,因为可以好多中断共用同一个中断处理函数,在中断处理函数里通过具体传入的参数来对具体的中断进行处理。