驱动程序开发的步骤
1、建立Linux驱动骨架(装载和卸载Linux驱动)
装载卸载 module_init和moudle_exit宏指定。
装载时进行初始化,如:建立设备文件,分配内存地址空间
卸载时进行释放驱动占用的资源,如:射出设备文件,释放内存地址空间
2、注册和注销设备文件
通常在编写处理Linux初始化工作的函数时进行设备文件的建立
删除设备文件一般在第一步编写的处理Linux退出工作的函数中完成。
分别使用misc_register和misc_deregister函数创建和移除设备文件。
实例代码(创建一个wordcount设备):
设备文件与普通文件之间存在显著区别,在注册机制上尤其值得注意:设备文件不宜采用IO接口方式进行注册;相反地,在初始化过程中必须调用专门提供的misc_register函数来创建新的设备文件;当完成操作后,则应当调用misc_deregister函数以释放相关资源。
首先定义一些宏和变量
#define DEVICE_NAME "wordcount"
//描述与设备文件触发的时间对应的回调函数指针
//owner:设备事件回调函数应用于哪些驱动模块,THIS_MODULE表示应用于当前驱动模块
static struct file_operations dev_fops=
{ .owner = THIS_MODULE } ;
//面熟设备文件的信息
//minor:次设备号 MISC_DYNAMIC_MINOR, 动态生成次设备号 name:设备文件名称
//fops file_operations 结构体指针
static stuct miscdevive misc=
{ .minor = MISC_DYNAMIC_MINOR,
.name= DEVICE_NAME,
.fops =&dev_fops };
//初始化Linux驱动
static int word_count_init(void)
{
int ret; ret=misc_register(&misc); //建立设备文件
printk("word_count_init_sucess\n");
return ret;
}
//卸载Liunx驱动
static void word_count_exit(void)
{
misc_deregister($misc);
printk("word_init_exit_sucess\n");
}
请注意,这些函数的主要作用是初始化字符设备操作。当需要指定主设备号和从设备号时,则需调用register_chrdev_region和alloc_chrdev_region这两个数学公式来完成相应的注册与解绑操作。
由于在C语言中声明函数和变量资源会在内存中一直驻留直至程序完全退出
3、指定与驱动相关的信息
该驱动程序具备自我描述特性;利用modinfo命令可收集该程序的基础信息集合;这些基础信息由MODULE_AUTHOR和MODULE_LICENSE等宏定义提供
4、指定回调函数
向设备文件写入数据时会响应"写"事件,在Linux系统中,相关驱动程序将执行write函数完成任务;其余情况依此类推。
借助file_operations.read和file_operations.write成员变量(属性),我们可以分别指定用于读取与写入设备文件所需的回调函数指针。
该读函数允许用户将缓存中的数据复制至其地址空间中。这些写入操作仅能执行一次,并且由这些write-in操作生成的数据必须被重放一次以确保完整性。
echo "asdf" >/dev/wordcount
向设备中写字符串
cat /dev/wordcount
打印设备中的信息
5、编写业务逻辑
具体的业务逻辑与核心功能密切相关,并且业务逻辑通常会包括多个函数、模块以及Even系统提供的Linux驱动模块。
6、编写Makefile文件
Linux内核元代啊的编译通过Makefile文件定义的
7、编写Linux驱动程序
Linux驱动程序可以直接编译进内核,也可以作为模块单独编译。
8、安装和卸载Linux驱动
一旦将Linux驱动编译进内核系统,并且当系统应用该黑河时,则会自动加载相应的驱动程序。具体而言,在Linux环境中运行时,在安装阶段若需应用该功能,则需采用insmod或modprobe命令来加载相应的Linux驱动模块,并通过rmmod命令移除不再需要的模块。
modprobe和insmod的区别
modprobe能够加载具有复杂依赖关系的驱动模块,在此过程中它会管理这些相互关联的组件;相比之下, insmod则专注于单一功能模块的集成. 在尝试通过 modprobe 安装驱动时, 请确保已经确定目标系统的所有软件组件及其相互依赖性;为此建议提前运行 depmodel 工具来分析 Linux 系统的驱动架构. 对于那些熟悉系统架构的人而言, 在配置时只需输入所需的 driver 名称即可完成安装过程;特别地, 在这种情况下无需附加任何 .ko 标记.
sudo depmod /demo/.../**.ko
sudo modprobe **
前5步编写Linux驱动,后3步运行Linux驱动。
