字符设备驱动开发简要

Linux 驱动开发中我们需要按照其规定的框架来编写驱动,所以说学 Linux 驱动开发重点是学习其驱动框架。

Linux 驱动有两种运行方式:
第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启 动的时候就会自动运行驱动程序。

第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko),在 Linux 内核启动以后使用“insmod”命令加载驱动模块。在调试驱动的时候一般都选择将其编译 为模块,这样我们修改驱动以后只需要编译一下驱动代码即可,不需要编译整个 Linux 代码。而且在调试的时候只需要加载或者卸载驱动模块即可,不需要重启整个系统。总之,将驱动编 译为模块最大的好处就是方便开发,当驱动开发完成,确定没有问题以后就可以将驱动编译进Linux 内核中,当然也可以不编译进 Linux 内核中,具体看自己的需求。

驱动模块的加载和卸载

驱动编译完成以后扩展名为.ko,有两种命令可以加载驱动模块:insmod和 modprobe,insmod
是最简单的模块加载命令,此命令用于加载指定的.ko 模块,比如加载 drv.ko 这个驱动模块,命令如下:
insmod drv.ko

驱动模块的卸载使用命令“rmmod”即可,比如要卸载 drv.ko,使用如下命令即可:
rmmod drv.ko

字符设备注册与注销
对于字符设备驱动而言,当驱动模块加载成功以后需要注册字符设备,同样,卸载驱动模块的时候也需要注销掉字符设备。

1  static struct file_operations test_fops; 
2
3  /* 驱动入口函数 */ 
4  static int __init xxx_init(void) 
5  { 
6  /* 入口函数具体内容 */
7  int retvalue = 0; 
8
9  /* 注册字符设备驱动 */ 
10  retvalue = register_chrdev(200, "chrtest", &test_fops); 
11  if(retvalue < 0){ 
12  /* 字符设备注册失败,自行处理 */ 
13  } 
14  return 0; 
15  } 
16 
17  /* 驱动出口函数 */ 
18  static void __exit xxx_exit(void) 
19  { 
20  /* 注销字符设备驱动 */ 
21  unregister_chrdev(200, "chrtest"); 
22  } 
23 
24  /* 将上面两个函数指定为驱动的入口和出口函数 */ 
25  module_init(xxx_init); 
26  module_exit(xxx_exit); 

第 10 行,调用函数 register_chrdev 注册字符设备,主设备号为 200,设备名字为“chrtest”,
设备操作函数集合就是第 1 行定义的 test_fops。要注意的一点就是,选择没有被使用的主设备号,输入命令“cat /proc/devices”可以查看当前已经被使用掉的设备号,如图 40.2.2.1 所示(限于篇幅原因,只展示一部分):

编译驱动程序
工程建立好以后就可以开始编写驱动程序了,新建 chrdevbase.c,首先编译驱动程序,也就是 chrdevbase.c 这个文件,我们需要将其编译为.ko 模块,创建 Makefile 文件。

编译成功以后就会生成一个叫做 chrdevbaes.ko 的文件,此文件就是 chrdevbase 设备的驱动模块。至此,chrdevbase 设备的驱动就编译成功。

运行测试加载驱动模块
检查开发板根文件系统中有没有“/lib/modules/4.1.15-”这个目录,如果没有的话自行创建。将 chrdevbase.ko 复制到 /lib/modules/4.1.15-

输入如下命令加载 chrdevbase.ko 驱动文件:
insmod chrdevbase.ko

创建设备节点文件
驱动加载成功需要在/dev 目录下创建一个与之对应的设备节点文件,应用程序就是通过操
作这个设备节点文件来完成对具体设备的操作。输入如下命令创建/dev/chrdevbase 这个设备节点文件:
mknod /dev/chrdevbase c 200 0
其中“mknod”是创建节点命令,“/dev/chrdevbase”是要创建的节点文件,“c”表示这是个字符设备,“200”是设备的主设备号,“0”是设备的次设备号。

卸载驱动模块
如果不再使用某个设备的话可以将其驱动卸载掉,比如输入如下命令卸载掉 chrdevbase 这个设备:
rmmod chrdevbase.ko

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值