Advertisement

驱动程序开发的步骤

阅读量:

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_regionalloc_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驱动。

全部评论 (0)

还没有任何评论哟~