2023学年完整公开课版编写hello_第1页
2023学年完整公开课版编写hello_第2页
2023学年完整公开课版编写hello_第3页
2023学年完整公开课版编写hello_第4页
2023学年完整公开课版编写hello_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式技术应用编写hello_driver驱动的控制函数与注册函数模块三:嵌入式网关之驱动程序编写学习目标一、file_operations结构体二、编写ioctl()函数三、注册设备与注销设备四、hello_driver驱动源码分析一、file_operations结构体这个结构体是字符设备驱动程序的核心,当应用程序操作设备文件时所调用的open()、read()、write()、ioctl()等函数,最终会调用这个结构中指定的对应函数。

owner:THIS_MODULE,这表示这个驱动的所有者就是这个驱动模块本身。Staticstructfile_operationshello_fops={owner:THIS_MODULE,ioctl:hello_ioctl,}

ioctl:hello_ioctl,登记hello_ioctl()函数为ioctl()函数,在应用程序中调用ioctl()时其实调用的是hello_ioctl()函数。二、编写ioctl函数应用程序可以调用驱动程序中的ioctl()函数完成特定的功能,这样驱动程序就可以与应用程序一起工作了。驱动程序中的ioctl()函数主要用于对设备进行控制,该函数的原型(即函数的声明)如下:staticinthello_ioctl(structinode*inode,structfile*filp,

unsignedintcmd,unsignedlongarg)应用程序中是这样调用驱动里的ioctl()函数的:其中的文件描述符fd对应驱动inode和file两个指针,fd是打开设备文件的文件描述符;应用程序中的cmd直接传递给驱动程序中的cmd;可选参数arg没有使用,就用NULL代替。驱动程序中的ioctl()函数一般是一个switch语句,用户程序传递不同的cmd值就执行switch语句中对应的cmd语句,如下所示:ioctl(fd,0,NULL);这样,当应用程序调用ioctl(fd,0,NULL)时,即cmd的值为0时,就打印“command0isrun!”;调用ioctl(fd,-1,NULL)则打印“error!”。staticinthello_ioctl(structinode*inode,structfile*filp,unsignedintcmd,unsignedlongarg){switch(cmd){case0:printk("command0isrun!\n");break;default:printk("error!\n");break;}return0;}三、注册设备与注销设备设备号包含主设备号和次设备号两个部分,Linux内核需要一对被称为主/次设备号的参数,才能唯一标识一个设备。主设备号相同的设备使用相同的驱动程序,次设备号用于区分具体设备的实例。如果要查看/dev目录下的设备的主次设备号可以使用“ls/dev/-l”命令查看。3.1用register_chrdev()函数注册设备使用register_chrdev()函数可以注册一个字符型设备的主设备号,其函数原型如下:第一个参数major是向系统申请的主设备号,如果major为0,则系统会为此驱动程序动态地分配一个主设备号。第二个参数name是设备名,如果register_chrdev()函数操作成功,设备名就会出现在/proc/devices文件里。第三个参数fops是驱动结构体,类型为file_operations。intregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops);在以下的实例中,注册了一个字符设备:

/dev/hello_driver是这个设备文件的名称,为了方便,可以将设备文件的路径加入到设备文件的名称。&hello_fops是这个驱动的设备结构体的入口地址(见本次课前面的内容)。3.2用unregister_chrdev()函数注销设备使用unregister_chrdev()函数可以注销字符型设备取得的设备号,其函数原型如下:ret=register_chrdev(0,"/dev/hello_driver",&hello_fops);第一个参数major是主设备号,第二个参数name是设备名称,这2个参数必须与前面传递给register_chrdev()函数中的值保持一致,否则该调用会失败。对应的注销语句实例如下:其中demoMajor值为0,这样才会与前面register_chrdev()函数中的值保持一致。intunregister_chrdev(unsignedintmajor,constchar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论