第一篇
转载自csdn vipclx
一、建立Linux驱动框架(装载、卸载Linux驱动)
Linux内核在使用驱动时首先要装载驱动,在装载过程中进行一些初始化动作(建立设备文件、分配内存等),在驱动程序中需提供相应函数来处理驱动初始化工作,该函数须使用module_init宏指定;Linux系统在退出是需卸载Linux驱动,卸载过程中进行一些退出工作(删除设备文件、释放内存等),在驱动程序中需提供相应函数来处理退出工作,该函数须使用module_exit宏指定。Linux驱动程序一般都要这两个宏指定这两个函数,所以包含这两个宏以及其所指定的两个函数的C程序可看作是Linux驱动的框架。
二、注册和注销设备文件
任何Linux驱动都需要有一个设备文件来与应用程序进行交互。建立设备文件的工作一般在上一步module_init宏指定的函数中完成的,可以使用misc_register函数创建设备文件;删除设备文件的工作一般在上一步module_exit宏指定的函数中完成的,可以使用misc_deregister函数删除设备文件。
三、指定驱动相关信息
驱动程序是自描述的,驱动程序的信息需要在驱动源代码中指定。通过MODULE_AUTHOR(作者姓名)、MODULE_LICENSE(使用的开源协议)、MODULE_ALIAS(别名)、MODULE_DESCRIPTION(驱动描述)等宏来指定与驱动相关的信息,这些宏一般写在驱动源码文件的结尾。可通过modinfo命令获取这些信息。
四、指定回调函数
Linux驱动包含了很多动作,也称为事件,如“读”“写”事件,触发相应事件时Linux系统会自动调用对于驱动程序的相应回调函数。一个驱动程序不一定要指定所以的回调函数。回调函数通过相关机制进行注册。如与设备文件相关的回调函数使用misc_register函数注册。
五、编写业务逻辑
没什么可说的,总不能注册一些空的回调函数,什么也不做吧。
六、编写Makefile文件
Linux内核源码的编译规则是通过Makefile文件定义的,每个Linux驱动程序必须要有一个Makefile文件。
七、编译Linux驱动程序
Linux驱动程序可直接编译进内核(使用obj-y编译),也可以作为模块单独编译(使用obj-m编译)。
八、安装和卸载Linux驱动
如果将驱动编译进内核,只要Linux使用该内核,驱动程序就会自动装载。如果Linux驱动程序以模块单独存在,需要使用insmod或modprobe命令装载Linux驱动模块,使用rmmod命令卸载该模块。
第二篇
Linux 驱动程序开发步骤
Linux 内核就是由各种驱动组成的,内核源码中大约85%是各种驱动程序的代码。内核中驱动程序种类齐全,可以在同类型驱动的基础上进行修改以适应具体单板
编写驱动的难点并不是硬件的具体操作,而是弄清楚现有驱动程序的构架,在这个构架中加入这个硬件。花费精力的地方在于,了解某设备的驱动构架,找到修改的位置。
此外,还要考虑驱动的并发问题等。
编写Linux大致流程:
1.查看原理图,数据手册,了解设备的操作方法
2.在内核中找到相近的驱动程序,以它为模板进行开发,有时候需要从0开始
3.实现驱动程序的初始化,比如向内核注册这个驱动程序,这样应用程序传入文件名时,内核才能找到相应的驱动程序。
4.设计所要实现的操作,如open,close,read,write等函数。
5.实现中断服务(中断并不是每个设备驱动所必须的)
6.编译驱动程序到内核中,或者用insmod命令加载
7.测试驱动程序。
驱动程序的加载和卸载
可以将驱动程序静态编译进内核中,也可以将他作为一个模块在使用时再加载。在配置内核时,如果某个配置项被设为m,就表示他被编译成一个模块
insmod加载 rmmod卸载 lsmod查看内核中已经加载了哪些模块
当使用insmod加载模块时,模块的初始化函数被调用,它用来向内核注册驱动程序。
当使用rmmod卸载模块时,模块的清除函数被调用
假设初始化函数为my_init,清除函数为my_cleanup
则 module_init(my_init);
module_exit(my_cleanup);
一 编写字符设备驱动
编写字符设备驱动程序就是为具体的硬件的file_operations结构编写各个函数
那么,当应用程序通过open,read,write等系统调用访问某个设备文件时,Linux系统怎么知道去调用哪个驱动程序的file_operator结构中的open,read,write等成员呢?
1.模块初始化时,将主设备号与file_operations一起注册
驱动程序中有一个初始化函数,在安装驱动程序时会调用它。在初始化函数中,会将驱动程序file_operation结构连同其主设备号一起向内核进行注册。对于字符型设备,使用int register_chrdev
这样,应用程序操作设备文件时,Linux系统会根据设备文件类型,主设备号找到内核中注册的file_operation结构,(对于块设备为block_device_operations结构),次设备号仅供驱动程序自身用来分辨他是同类设备中的第几个。
编写驱动程序的大致过程:
1.编写驱动程序初始化函数。
进行必要的初始化,包括硬件初始化(也可放在其他地方),向内核注册驱动程序等。
2.构造file_operation
高级的驱动编程还涉及中断,select机制,fasync异步通知机制。等
驱动程序编译
将光盘上编写好的XXX.c的驱动文件放入内核drivers/char 子目录下,在drivers/char/Makefile中添加下面一行
obj-m += XXX.o
然后在内核根目录下执行“make modules”,就可以生成.ko文件
最后,要在开发板根文件系统中建立设备文件
mknod /dev/leds c 231 0
两篇让我理解linux驱动的文章及我的精练总结