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加载
不配置表示不进行编译

linux驱动模块配置

在这个图中,(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");