1、驱动入口函数
定义一个名为 xxx_init 的驱动入口函数,并且使用“__init”来修饰
static int __init xxx_init(void)
{
/*入口函数的具体内容*/
return 0;
}
2、驱动出口函数
定义一个名为 xxx_exit 的驱动出口函数,并且使用“__exit”来修饰
static int __exit xxx_exit(void)
{
/*出口函数的具体内容*/
}
3、将1和3指定为驱动的入口和出口函数
调用函数 module_init 来声明 xxx_init 为驱动入口函数,当加载驱动的时候 xxx_init函数就会被调用,调用函数module_exit来声明xxx_exit为驱动出口函数,当卸载驱动的时候xxx_exit函数就会被调用
module_init(xxx_init);
module_exit(xxx_exit);
4、字符设备的注册
字符设备注册的原型
static inline int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)
major
: 主设备号, Linux 下每个设备都有一个设备号,设备号分为主设备号和次设备号两部分
name
:设备名字,指向一串字符串
fops
: 结构体 file_operations 类型指针,指向设备的操作函数集合变量
字符设备的注册在驱动模块的入口函数 xxx_init 中进行
/* 驱动入口函数 */
static int __init xxx_init(void)
{
/* 入口函数具体内容 */
int retvalue = 0;
/* 注册字符设备驱动 */
retvalue = register_chrdev(200, "chrtest", &test_fops);
if(retvalue < 0){
/* 字符设备注册失败,自行处理 */
}
return 0;
}
5、字符设备的注销
字符设备注销的原型
static inline void unregister_chrdev(unsigned int major, const char *name)
major
: 要注销的设备对应的主设备号
name
: 要注销的设备对应的设备名
字符设备的注销在驱动模块的出口函数 xxx_exit 中进行
/* 驱动出口函数 */
static void __exit xxx_exit(void)
{
/* 注销字符设备驱动 */
unregister_chrdev(200, "chrtest");
}
6、添加LICENSE和作者信息
LICENSE 是必须添加的,否则的话编译的时候会报错,作者信息可以添加也可以不添加。
MODULE_LICENSE() //添加模块 LICENSE 信息
MODULE_AUTHOR() //添加模块作者信息
在编写好.c
文件和Makefile
文件之后,将.c
文件编译生成.ko
文件。再编写测试用的App文件,将App文件使用arm-linux-gnueabihf-gcc
进行编译。最后将生成的.ko
和App文件复制到开发板的额lib/modules/4.1.15/
目录下既可以进行测试。其中4.1.15
是内核的版本号,要相对应,否则可能会报错。
7、加载驱动文件
使用如下命令进行驱动文件的加载
insmod chrdevbase.ko
modprobe chrdevbase.ko
使用如下命令查看系统中的设备信息:
cat /proc/devices
使用如下命令创建设备节点文件:
mknod /dev/chrdevbase c 200 0
mknod
:是创建节点命令,
/dev/chrdevbase
:是要创建的节点文件,
c
:表示这是个字符设备,
200
:是设备的主设备号,
0
:是设备的次设备号.
卸载驱动设备:
rmmod chrdevbase.ko
备注:
1、insmod 命令不能解决模块的依赖关系,比如 drv.ko 依赖 first.ko 这个模块,就必须先使用insmod 命令加载 first.ko 这个模块,然后再加载 drv.ko 这个模块。但是 modprobe 就不会存在这个问题,modprobe 会分析模块的依赖关系,然后会将所有的依赖模块都加载到内核中,因此modprobe 命令相比 insmod 要智能一些。 modprobe 命令主要智能在提供了模块的依赖性分析、错误检查、错误报告等功能,推荐使用 modprobe 命令来加载驱动。
2、驱动模块的卸载使用命令“rmmod”,也可以使用“modprobe -r”命令。使用 modprobe 命令可以卸载掉驱动模块所依赖的其他模块,前提是这些依赖模块已经没有被其他模块所使用,否则就不能使用 modprobe 来卸载驱动模块。所以对于模块的卸载,还是推荐使用 rmmod 命令。