3.字符设备驱动基本编程解析.doc

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章 字符设备驱动基本编程本文将使用内存来虚拟4个同类型字符设备scull,并以该字符设备为例来进行字符设备驱动基本编程的讲解。一、让我们先来体验一下scull设备吧 1、下载scull设备的驱动源码,解压后make,可得到scull.ko。将其加载进内核: insmod scull.ko 2、创建设备节点文件 dennis@dennis-desktop:/work/studydriver/examples/scull$ cat /proc/devices|grep scull 252 scull 252 scullp dennis@dennis-desktop:/work/studydriver/examples/scull$ sudo mknod scull0 c 252 0 dennis@dennis-desktop:/work/studydriver/examples/scull$ sudo mknod scull1 c 252 1 dennis@dennis-desktop:/work/studydriver/examples/scull$ sudo mknod scull2 c 252 2 dennis@dennis-desktop:/work/studydriver/examples/scull$ sudo mknod scull3 c 252 3 dennis@dennis-desktop:/work/studydriver/examples/scull$ sudo chmod 666 scull[0-3] 3、体验scull设备。向该字符设备写入内容后再将内容读出 dennis@dennis-desktop:/work/studydriver/examples/scull$ cat scull0 dennis@dennis-desktop:/work/studydriver/examples/scull$ echo yangzhu scull0 dennis@dennis-desktop:/work/studydriver/examples/scull$ cat scull0 yangzhu 二、实现字符设备驱动的工作 1、确定主设备号和次设备号 什么是主设备/次设备号 主设备号是内核识别一个设备属于哪一个驱动的标识。是一个整数,范围从0到(4096-1),但是一般使用1到255。 次设备号是驱动程序自己用来区别多个设备的。是一个整数,范围从0到(1048576-1),但是一般使用0到255。 预定义的设备号:详见Documentation/devices.txt 查看设备号:$ ls –l /dev 设备编号的内部表示 内核用32bit表示设备号 typedef unsigned long dev_t; 其中高12bit为主设备号,低20bit为次设备号。要想获得一个 dev_t 的主或者次设备号,使用内核定义的宏:MAJOR(dev_t dev); 和MINOR(dev_t dev); #define MINORBITS??? 20 #define MINORMASK??? ((1U MINORBITS) - 1) #define MAJOR(dev)??? ((unsigned int) ((dev) MINORBITS)) #define MINOR(dev)??? ((unsigned int) ((dev) MINORMASK)) 主次设备号转换为一个 dev_t,使用内核定义的宏:?? MKDEV(int major, int minor); #define MKDEV(ma,mi)??? (((ma) MINORBITS) | (mi)) 分配主设备号/次设备号的方法和内核API 静态分配设备号:请求操作系统分配驱动程序要求的特定设备号。first为要求分配的第1个设备号(包含主、次设备号),count为请求的设备号数量,name为驱动名称(出现在/proc/devices中)。失败返回负数,成功则操作系统将first到first+count-1,总共count个设备号分配给驱动。例如:如果register_chrdev_region((200:2), 4, test)成功,则分配到的设备号为(200:2) -- (200:5)。请求分配的时机应该在驱动程序的初始化函数中。注:(200:2)表示1个设备号,该设备号的主设备号为200,次设备号为2。在不引起混淆的情况下,今后均采用这种方法表示设备号。 int register_chrdev_region(dev_t first, unsigned int count, char *name); 动态申

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档