- 1、本文档共19页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux设备驱动程序之字符设备驱动
linux设备驱动程序之字符设备驱动
一、linux系统将设备分为3类:字符设备、块设备、网络设备
字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据。字符设备是面向流的设备,常见的符设备有鼠标、键盘、串口、LED设备等。字符设备的上层没有文件系统,其中file_oprations是字符设备驱动的核心。2、块设备:是指可以从设备的任意位置读取一定长度数据的设备。块设备包括硬盘、磁盘、U盘和SD卡等。块设备的上层有磁盘文件系统(如ext2、jffs2、fat等),这些文件系统对实现对VFS的file_oprations的成员函数,块设备驱动层看不到file_oprations的存在,磁盘文件系统和设备驱动会将对磁盘上的文件的访问最终转换为对磁盘上柱面和扇区的访问。
每一个字符设备或块设备都在/dev目录下对应一个设备文件(或称设备节点)。Linux用户程序通过设备文件来使用驱动程序操作字符设备或块设备。
字符设备驱动程序基础:1、主设备号和次设备号(二者一起为设备号): 一个字符设备或块设备都有一个主设备号和一个次设备号。主设备号是与驱动对应的概念,用来反映设备类型,同一类设备一般使用相同的主设备号(也不排除在同一主设备号下包含一定差异的设备,因为同一驱动可以支持多个同类设备)。次设备号用来区分同类型的设备,用来描述使用该驱动的设备的序号(一般从0开始),即驱动程序利用次设备号来辨别操作的是哪个设备。可利用cat /proc/devices查看申请到的设备号。 Linux内核中,设备号用dev_t来描述,2.6.28中定义如下: typedef u_long dev_t; // 在32位机中是4个字节,高12位表示主设 备号,低12位表示次设备号。 可以使用下列宏从dev_t中获得主次设备号:
MAJOR(dev_t dev); MINOR(dev_t dev); 也可以使用下列宏通过主次设备号生成设备号dev_t:?
MKDEV(int major,int minor);
// 宏定义:#define MINORBITS 20#define MINORMASK ((1U MINORBITS) - 1)#define MAJOR(dev) ((unsigned int) ((dev) MINORBITS))#define MINOR(dev) ((unsigned int) ((dev) MINORMASK))#define MKDEV(ma,mi) (((ma) MINORBITS) | (mi))
分配设备号(两种方法):
(1)静态申请:int register_chrdev_region(dev_t from, unsigned count, const char *name);View Code
/** * register_chrdev_region() - register a range of device numbers * @from: the first in the desired range of device numbers; must include * the major number. * @count: the number of consecutive device numbers required * @name: the name of the device or driver. * Return value is zero on success, a negative error code on failure. */
(2)动态分配:
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);/*
* alloc_chrdev_region() - register a range of char device numbers * @dev: output parameter for first assigned number * @baseminor: first of the requested range of minor numbers * @count: the number of minor numbers required * @name: the name of the associated device or drive
文档评论(0)