理论基础上我们首先要知道Linux系统将设备分为三类:
字符设备,块设备,网络设备。//这篇日志说的是字符设备驱动简单介绍。
块设备与字符设备粗略的区别在于 :
符设备是只能一个字节一个字节读写,不能随机读取设备内存中的某一数据。
常见的有:鼠标,键盘,串口,控制台以及LED设备等。
而块设备则能一次读写许多个字节,可以从设备的任意位置读取一定长度数据的设备。
常见的有:硬盘,磁盘,U盘以及SD卡等。
每个字符设备或者块设备都在/dev目录下对应一个设备节点,linux用户程序通过设备节点来使用驱动程序操作字符设备和块设备。
加载驱动程序在Linux下可以通过两种方式:静态加载和动态加载。
静态加载:把驱动程序直接编译进内核,系统启动后可以直接调用。这种方式调试起来比较麻烦,每次修改都需要重新编译和下载内核,效率较低。
动态加载:则是将驱动独立成一个模块module,可以在系统启动后用insmod命令添加模块(.ko),对于我们调试程序来说,一般是先动态加载再编译进内核。
1、主设备号和设备号(二者一起为设备号)
而这么多的字符设备和驱动程序我们如何精准的识别呢?设备号便是区别方式,而设备号又分为主设备号和次设备号。
主设备号:用于区分是哪一大类的设备,即反映设备类型。
次设备号:用于区别同一设备类型中的设备。
在32位机中分12位主设备号,20位次设备号。Linux内核中设备号用dev_t来描述
可以使用宏从dev_t中获得主次设备号:
MAJOR(dev_t dev); MINOR(dev_t dev);
从主次设备号生成dev_t
MKDEV(int major ,int minor);
有了设备号之后就该获取或者说分配设备号了。设备号也分有静态申请和动态分配两种。
静态申请:
int register_chrdev_region(dev_t from, unsigned count,const char *name);
动态分配:
int alloc_chrdev_region(dev_t * dev,unsigned baseminor,unsigned count,const char *name);
用完了设备号之后注销设备号:
Void unregister_chrdev_region(dev_t from, unsigned count);
创建设备文件(设备节点):
(1)使用mknod 手动创建mknod filename type major minor 如: mknod /dev/led0 c 252 0
(2)自动创建 用udev和mdev。//本文是刚开始的驱动基础,此处暂时还没了解深入.等日后来补充。