Linux内核设备驱动分类:
1.字符设备: 串口,LED,按键,蜂鸣器,声卡,显卡...(按字节传输) 有顺序的访问。
2.块设备: Nand Flash,硬盘,U盘,TF卡,光盘...(512字节) 可以随机访问。
3.网络设备: 网卡,配合网络协议盏来使用。
在Linux系统中,所有的硬件设备在用户空间以设备文件的形式存在。
在/dev目录下可以查看到很多的设备文件!
我们平常访问设备,就是通过设备文件来实现的。同时配合系统调用函数(open,close,read,write...)
那么我们应该如何去创建设备文件呢?
1.创建字符设备文件:
maknod /dev/设备文件名 c 主设备号 次设备号
2.创建块设备文件:
maknod /dev/设备文件名 b 主设备号 次设备号
两者最大的区别就是c和b,哈哈。
在Linux中,所有的资源都是用文件的形式存在的!包括设备驱动!
设备驱动存放的目录:/dev
在应用程序或者测试程序中可以用open函数去打开它。
int fd = open("/dev/myled", O_RDWR);
上面所说到的主设备号和次设备号又是什么东西呢?
主设备号:应用程序就是根据主设备号来寻找自己对应的字符设备驱动的。
次设备号:当主设备号管理的设备相同的时候,我们就用次设备号来进行区分它们。
设备类型:dev_t (unsigned int)
下面说说如何申请设备文件:
一共有两种方法: 静态申请 和 动态申请
在驱动中我常用的一般是动态申请,因为用起来非常方便,没有静态申请那么麻烦。(懒)
alloc_chrdev_region (dev_t *dev, unsigned baseminor, unsigned count, char *name);
dev:内核帮你申请的设备号
baseminor:起始次设备号,一般写0
count:需要分配的次设备数目
name:分配设备的名称,如果申请成功,用cat /devdevice 能看到!
注意:不管用哪种申请方式,主设备号都不能为0。
设备号对于内核来说是一种非常宝贵的资源,当我们使用的时候,要去向系统申请。就像是当我们要用钱的时候,就得向媳妇去申请!!当然,我们申请的钱可以用完,或者自己存着。不过系统不行哦,设备号必须还给系统。俗话说:有借有还,在借不难。
归还设备号:
unregister_chrdev_region (dev_t dev, unsigned int count);
dev:分配的设备号
count:次设备号的个数
例:unregister_chrdev_region (dev, 1);
如果知道设备号,如何获取主,次设备号呢?
主设备号 = MAJOR(设备号)
次设备号 = MINOR (设备号)
通过主次设备号,又如何获取设备号呢?
设备号 = MKDEV (主设备号,次设备号)
阅读(1034) | 评论(0) | 转发(0) |