资源描述:
《字符设备驱动程序学习笔记v0.1》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、要创建一个字符设备,首先要在内核中注册目录注册设备2一.分配和释放设备编号2二.动态分配主设备编号2三.Helloworld编程3四.字符型设备驱动程序编写举例4引子4代码原文4代码分析6五.知识点滴6forthequalityofreviewsandreview.Article26threview(a)theCCRAcompliance,whethercopiesofchecks;(B)whetherdoubleinvestigation;(C)submissionofprogramcompliance,investigationorexaminationofwhetherv
2、iewsareclear;(D)theborrower,guarantorloans注册设备一.分配和释放设备编号包括主设备号和次设备号,在内核中,用dev_t(一个32位的数,即四个字节,也可一描述位int类型,其中的12位表示主设备号,其余20位表示此设备号)来保存完成该工作的必要函数是register_chrdev_region(dev_tfirst,unsignedintcount,char*name),很显然,该函数是系统函数,内核中已经定义了的。但是里面的参数,可以人为给出,比如第一个参数dev_t,此参数是要申请的设备编号(包括主设备号和次设备号)。Count是所
3、请求的连续设备编号的个数,name是和该编号范围关联的设备名称,注册成功之后,它将出现在/proc/devices/和sysfs中。如果我们提前明确知道所需要的设备编号,即first的值,则注册函数register_chrdev_region会工作的很好,但是,我们经常不知道设备将要使用哪些主设备号,因此,linux内核将努力实现设备编号的动态分配。在运行过程中使用下面的函数,内核将会为我们恰当的分配所需要的主设备编号:intalloc_chrdev_region(dev_t*dev,unsignedintfirstminor,unsignedintcount,char*nam
4、e)在这个函数中,dev是仅用于输出的参数(即该函数的返回值,返回所申请的设备编号),在成功完成调用后将保存已分配范围的第一个编号。firstminor是要使用的被请求的第一个次设备号,它通常是0。count和name参数与设备注册函数register_chrdev_region函数是一样的。综上,社情设备编号函数是:intalloc_chrdev_region(dev_t*dev,unsignedintfirstminor,unsignedintcount,char*name)设备编号释放需要使用下面的函数:voidunregister_chrdev_region(dev_t
5、first,unsignedintcount);上面的函数为驱动程序分配了设备编号,但是它们并没有告诉内核关于拿来这些编号要做什么工作。在用户空间程序可访问上述设备编号之前,驱动程序需要将设备编号和内部函数连接起来,这些内部函数用来实现设备的操作。在讨论如何实现这种连接之前,还要进一步讨论有关设备编号的内容。二.动态分配主设备编号在一个新设备向内核申请设备编号时,在驱动程序代码中,用来获取主设备号的代码:if(scull_major)//scull_major是名为scull的新设备的主设备号,默认值为0{dev=MKDEV(scull_major,scull_minor);r
6、esult=register_chrdev_region(dev,scull_nr_devs,“scull”);}elseforthequalityofreviewsandreview.Article26threview(a)theCCRAcompliance,whethercopiesofchecks;(B)whetherdoubleinvestigation;(C)submissionofprogramcompliance,investigationorexaminationofwhetherviewsareclear;(D)theborrower,guarantorloa
7、ns{result=alloc_chrdev_region(&dev,scull_minor,scull_nr_devs,“scull”);scull_major=MAJOR(dev);}if(result<0){printk(KERN_WARNING“scull:can’tgetmajor%d”,scull_major);returnresult;}intMAJOR(dev_tdev);intMINOR(dev_tdev);这两个宏从设备编号中抽取出主/次设备号。dev_tMKDEV(