1、Linux驱动的两种运行方式
1.将驱动编译进Linux内核中,当内核启动就会自动运行驱动程序;2.将驱动编译成模块(.ko文件),在内核启动以后使用“insmod”命令加载驱动模块。
2、注册模块加载和卸载函数
module_init(xxx_init); //注册模块加载函数. xxx_init:需要注册的具体函数 module_exit(xxx_exit); //注册模块卸载函数. xxx_exit:需要注册的具体函数
当使用“insmod”命令加载驱动的时候,xxx_init会被调用;当使用“rmmod”命令加载驱动的时候,xxx_exit会被调用
3、添加LICENSE和作者信息
MODULE_LICENSE("GPL"); //LICENSE采用GPL协议 MODULE_AUTHOR("mk"); //添加作者信息
4、示例
/************************************************************* * @brief //TODO:驱动入口函数 *************************************************************/ static int __init led_init(void) { //驱动入口函数具体内容 return 0; } /************************************************************* * @brief //TODO:驱动出口函数 *************************************************************/ static void __exit led_exit(void) { //驱动出口函数具体内容 } module_init(led_init); module_init(led_exit); MODULE_LICENSE("GPL"); //LICENSE采用GPL协议 MODULE_AUTHOR("mk"); //添加作者信息
5、驱动模块加载和卸载命令
加载驱动模块的通常流程:
1.将.ko文件拷贝进/lib/module/4.1.15/kernel/driver/...目录下
根据具体用途区别分为net、ide、scsi、usb、video、parport、md、block、ata等
2. 运行depmod -a,更新模块依赖,主要是更新module.dep文件
3. 运行modprobe加载内核模块
4.驱动记载成功以后会在/dev目录下创建相应的节点文件xxx,输入命令ls/dev/xxx -l可以查看节点信息。
4.1 insmod
insmod drv.ko //加载drv.ko模块
insmod不能解决模块的依赖关系
4.2 modprobe
modprobe会分析模块的依赖关系,默认去/lib/modules/4.1.15目录中查找模块,然后会将所有的依赖模块都加载到内核中。一般自己制作的根文件系统中不会有这个目录,需要自己创建。
4.3 rmmod
卸载驱动模块
4.4 modprobe -r
卸载驱动模块所依赖的其他模块
4.5 lsmod
列出内核已载入模块的状态