(四)嵌入式 Linux驱动程序设计之杂项设备驱动
接上篇:(三)嵌入式 Linux驱动程序设计之驱动编译进内核
linux三大设备驱动
字符设备:IO的传输过程是以字符为单位的,没有缓冲,如:I2C,SPI;
块设备:IO传输过程以块为单位,根存储相关的都是块设备,如:tf卡,EMMC;
网络设备:以套接字来访问的.
1.杂项设备驱动属于字符设备,杂项设备可以自动生成设备节点.我们系统里有很多杂项设备,开发板可以使用cat /proc/misc/查看;虚拟机在/dev/下;
[root@qemu_imx6ul:/dev]# cat /proc/misc
59 ubi_ctrl
60 memory_bandwidth
61 network_throughput
62 network_latency
63 cpu_dma_latency
130 watchdog
237 loop-control
183 hw_random
229 fuse
235 autofs
2.杂项设备除了比字符设备代码简单,而且杂项设备的主设备号是相同的,均为10,次设备号是不同的,主设备号相同就可以节省内核资源;
3.设备号包含:主设备号和次设备号,主设备号在linux下是唯一的次设备号是不一定唯一的;设备号是计算机识别设备的一种方式,主设备相同就被视为同一类设备;主设备号可以理解为电话号码的区号,次设备号为电话号.
主设备号可以通过命令cat /proc/devices查看(开发板和虚拟机都可以查看);
4.开发板:内核源码路径下/include/linux/miscdevice.h可以看到杂项设备相关结构体描述
注意:因为杂项设备主设备号固定为10,次设备号一般使用宏:该文件中的#define MISC_DYNAMIC_MINOR 255来自动分配
注册杂项设备:extern int misc_register(struct miscdevice* misc)
注销杂项设备:extern int misc_deregister(struct miscdevice* misc)
file_operations文件操作集定义在include/linux/fs.h里面
这个结构体作用:里面每一个结构体成员都对应一个调用.
5.注册杂项设备流程
5.1填充miscdevice这个结构体;
5.2填充file_operations结构体;
5.3注册杂项设备并生成设备节点.
例子:注册杂项设备并生成杂项设备节点
//第一步 包含头文件
#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="hello_misc",
.fops=&misc_fops
};
static int misc_init(void)
{
int ret;
ret=misc_register(&misc_dev);
if(ret<0)
{
printk("misc register is error\n");
return -1;
}
printk("misc\n");
return 0;
}
static int misc_exit(void)
{
misc_deregister(&misc_dev);
printk("bye bye\n");
return 0;
}
//第二步 驱动模块入口和出口
module_init(misc_init);
module_exit(misc_exit);
//第三步 声明模块拥有开源许可证
MODULE_LICENSE("GPL");
使用make编译后拷贝ko文件到开发板运行查看效果.