初识Linux设备驱动之字符设备

理论基础上我们首先要知道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)自动创建  用udevmdev//本文是刚开始的驱动基础,此处暂时还没了解深入.等日后来补充。

你可能感兴趣的:(linux,字符设备驱动,设备驱动)