- 前言
- 一、基本知识
- 二、杂项设备驱动文件的编写
- 1.misc.c文件
- 2.Makefile文件
- 三、杂项设备驱动的加载与卸载
- 1.驱动的编译与发送
- 2.驱动的加载和卸载
- 总结
前言
本文的主要内容是杂项设备驱动的编写。
一、基本知识
Linux下有三大设备驱动:
1.字符设备
IO的传输过程是以字符为单位的,没有缓冲,比如I2C,SPI等都是字符设备,杂项设备也是字符设备。
2.块设备
IO的传输过程都是以块为单位的,跟存储相关的一般都属于块设备。
3.网络设备
与字符设备和块设备不同,网络设备是以socket套接字来访问的。
杂项设备是字符设备的一种,它可以自动生成设备节点,其设备节点在/dev/目录下。杂项设备的主设备号是相同的,都是10,次设备号是不同的,主设备号相同就可以节省内核资源。
杂项设备名称及设备号可以通过下面的命令来查看。
cat /proc/misc
主设备名称及设备号可以通过下面的命令来查看。
cat /proc/devices
二、杂项设备驱动文件的编写 1.misc.c文件
misc.c文件的内容如下:
miscdevice结构体的介绍在内核源码的/linux-4.1.15/include/linux/miscdevice.h目录下。
file_operations结构体的介绍在内核源码的/linux-4.1.15/include/linux/fs.h目录下。
以下代码只包含了结构体中的一部分内容,详细的内容大家可以打开头文件自己查看。
#include "linux/init.h" #include "linux/module.h" #include "linux/miscdevice.h" //杂项设备头文件 #include "linux/fs.h" //文件 *** 作集头文件 struct file_operations misc_fops = { //文件 *** 作集结构体 .owner = THIS_MODULE }; struct miscdevice misc_dev={ //杂项设备结构体 .minor = MISC_DYNAMIC_MINOR, //次设备号 .name = "misc_device", //设备节点的名字 .fops = &misc_fops //文件 *** 作集 }; static int misc_init(void) { int ret; //次设备号 ret = misc_register(&misc_dev); if(ret < 0) { printk("miscdevice registered error!n"); return -1; } printk("miscdevice registered successfully!n"); return 0; } static int misc_exit(void) { misc_deregister(&misc_dev); printk("misc exit!n"); } module_init(misc_init); module_exit(misc_exit); MODULE_LICENSE("GPL");2.Makefile文件
Makefile文件的内容如下:
obj-m += misc.o #这里的.o文件名称要与.c文件的文件名称相同 KDIR:=/linux/linux-4.1.15 PWD?=$(shell pwd) all: make -C $(KDIR) M=$(PWD) modules clean: make -C $(KDIR) M=$(PWD) clean
三、杂项设备驱动的加载与卸载 1.驱动的编译与发送
驱动编译过程中遇到的问题可以参见:IMX6开发板从镜像的烧写、内核源码编译到第一个驱动运行的详细步骤
在Ubuntu系统下写好上面的两个文件后使用make命令进行编译,生成misc.ko驱动文件,再通过如下命令发送到开发板。
scp misc.ko root@192.168.0.232:/lyx
下图就是杂项设备驱动编译并成功发送到开发板的截图。
在开发板上接收到驱动文件后,使用如下命令加载。
insmod misc.ko
运行截图如下:
使用如下命令查看咱们的设备节点的名字misc_device(代码中写啥名这里就生成啥名)是否已经在/dev/目录下。
ls /dev/misc_device
卸载驱动,再次查看,该文件在/dev/目录下已经不存在了。
在命令行输入以下命令来查看杂项设备的次设备号。
cat /proc/misc
次设备号查看的截图如下。
总结以上就是杂项设备驱动的所有内容,通过这个例子我们可以举一反三,在以后遇到更复杂、更困难的驱动编写时,我们可以回过头来将此作为参考。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)