字符设备驱动
$$$$$概述$$$$$
块设备、字符设备以及网络设备中块设备和网络设备一般都会硬件配置完备,对于程序员而言,能够更多操作的就是字符设备。
设置字符设备的一般步骤:
1.初始化硬件
2.定义FOPS(file operations)
3.申请cdev,挂载FOPS
3.加入cdev(函数cdev_add)
$$$$$主次设备号$$$$$
1、主、次设备号
主设备号:标示设备对应的驱动;
次设备号:确定设备文件所指设备(设备编号)。
2、设备编号的内部表述
dev_t(32位,高12位为主设备号,低20为次设备号)【关于dev_t,使用到<linux/ldev_t.h>中的宏】
①.获取dev_t
主设备号=MAJOR(dev_t,dev);
次设备号=MINOR(dev_t,dev);
②.将主次设备号转化为dev_t类型
MKDEV(int major,int minor);
$$$$$分配主次设备号
$$$$$
1、静态分配
①.查看已使用主设备号
/proc目录下存放着提供给用户的各类信息,/proc/devices中为各种设备的主设备号。一般避免使用小序号,以免与一些未启动但是可能是基本设备的设备号冲突。所以,一般都使用大序号(100以上)。
②.静态分配
例:led0-led5 Major 233
函数:register_chrdev_region(dev_t first , unsigned int count,char *name);【first 是你要分配的起始设备编号】
dev_t devno;
devno = MKDEV(233,0);
register_chrdev_region(devno,6,"led");
③.手动分配节点
mknod -m 755 led0 c 233 0
mknod -m 755 led1 c 233 1
.......
mknod -m 755 led5 c 233 5
2、动态分配
①.上例:
函数:alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name
);
dev_t devno;
int major;
alloc_chrdev_region(&devno,0,6,"led");
major = MAJOR(devno)
②.分配节点
insmod led.ko
led_major = `cat /proc/devices | grep led | awk '{print $1}'` #获取主设备号#
mknod -m 755 led0 c 233 0
mknod -m 755 led1 c 233 1
.......
mknod -m 755 led5 c 233 5