Linux驱动 简介
Linux对驱动有两种处理方式
一、将驱动直接编译进内核,即将驱动做为内核文件一部分,其由do_initcalls()实现驱动函数的实始化,一般在使用make menuconfig进行裁剪时,配置驱动模块为y
二、将驱动以模块的方式进行动态加载:
加载驱动模块命令为:insmode : insmod xx.ko
卸载驱动模块命令为:rmmod : rmmod:xx(模块的名称)
使用menu config配置linux内核时(包括驱动),其主要有三种方式
配置为obj-y=xx.o 表示编译进内核
配置为obj-m=xx.o 表示编译成模块,使用modinstall加载
不配置表示不进行编译
在这个图中,(M)表示以模块的方式编译,即最终生成此驱动的.ko文件,如本图中的I2C驱动;*
表示选中编译,即将此驱动编译进内核;驱动前为空表示不进行此驱动编译
驱动的出入口函数
在加载每一个驱动时,都应告诉这个驱动模块的出入口函数,Linux驱动使用2个宏来进行注册声名出入口函数,这两个宏在头文件include/linux/init.h
中,在驱动中可以直接使用#include<init.h>
来引用
- 模块的入口宏函数:mode_init(驱动入口函数)
- 模块的出口宏函数:mode_eixt(驱动卸载函数)
驱动的相关声名
Linux驱动在编写时应告诉内核一些自身的信息,这些信息包括开发者、遵循的协议等,在头文件include/linux/module.h
中,在驱动开发时可以直接引用,如#include<module.h>
遵循的协议
MODULE_LICENSE(_LICENSE)
用来声名此模块的许可证,根据实际情况进行配置,这里以配置为’GPL’协议为例,可使用如下方式进行配置:
MODULE_LICENSE("GPL");
如里没有对驱动模块进行许可声明,当然驱动也可以用,不过在加载的时候,内核会提示被污染的警告
作者的声名
MODULE_AUTHOR(作者名),如
module_author("www.bytekits.com");
驱动描述的声名
驱动描述用一段文字来介绍这个驱动,使用
MODULE_DESCRIPTOR(“hello www.bytekits.com”);(描述)来进行声名,如
MODULE_DESCRIPTOR("hello www.bytekits.com");