编写GPIO驱动程序说明.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux下GPIO驱动程序Linux提供了一种全新的“模块”机制,可根据需要在不必对内核进行重新编译的情况下;将可加载模块动态地插入运行中的内核,成为内核的一个有机组成部分;也可以动态地卸载已加载的模块。Linux下设备驱动程序的编写要点是为相应的设备编写完成相应功能的基本函数,然向虚拟文件系统(VFS)注册。当应用程序需要对设备进行操作时,可以访问该设备对应的文件节点,利用VFS调用该设备的相关处理函数即可。驱动程序是指一组子程序,它屏蔽了底层硬件处理细节,同时向上层软件提供与硬件无关的接口,在Linux内核中占据极其重要的地位,是用来完成对物理设备控制操作的功能模块,设备驱动程序控制操作系统和硬件设备访问的交互操作。图为设备驱动模块动态挂载、卸载和系统调用的全过程:内核和模块的关系一、入口函数初始化设备驱动在加载时首先需要调用入口函数__initgpio_init(void),该函数完成设备驱动的初始化工作,比如寄存器置位、结构体赋值等一系列工作,其中最重要的一个工作就是向内核注册该设备,字符设备调用函数register_chrdev()完成注册。注册成功后,该设备获得了系统分配或向系统申请的主设备号、自定义的次设备号,并建立起与设备文件的关联。int __initgpio_init(void){int result; result = register_chrdev(MAJOR_NR, DEVICE_NAME, gpio_fops); //注册if (result 0) {printk(KERN_ERR DEVICE_NAME : Unable to get major %d\n, MAJOR_NR ); //返回值小于0,注册不成功return(result); } if (MAJOR_NR == 0) { MAJOR_NR = result; /* dynamic */ }printk(KERN_INFO DEVICE_NAME : init OK\n); //初始化成功return(0); }二、注销模块注销模块是和注册模块对应的操作,当卸载模块时,系统将注销模块对应的设备,并释放主设备号,这一操作可以在模块的清除函数中调用unregister_chrdev()函数来完成。unregister_chrdev()函数用于注销设备、释放主设备号和设备文件名。参数包括要释放的主设备号和对应的设备名。void __exit gpio_cleanup(void){unregister_chrdev(MAJOR_NR, DEVICE_NAME);}三、结构体每个设备驱动程序都对应一个file_operations数据结构,file_operations是定义在linux/fs.h中的函数指针数组。对于字符设备而言,file_operations{}就是唯一的函数接口。一个数据结构包括两个元素:一个登记的设备驱动程序的名称的指针和一个指向一组文件操作的指针。用户是通过设备文件同硬件打交道,以系统调用的方式对设备文件进行操作,并通过完成file_operations中的函数指针来把系统调用和驱动程序关联起来。staticstructfile_operationsgpio_fops = /* driver info */{owner: THIS_MODULE,ioctl: gpio_ioctl,open: gpio_open,release: gpio_release,};四、全局变量static int major = GPIO_MAJOR_NR; //主设备号五、打开设备输入有两个,一个是inode,表示设备信息,一个是filp,表示指向的文件。输出返回值为0时,设备正常打开,否则打开失败。staticintgpio_open(structinode *inode, struct file *filp) {outl(((inl(REG_MFSEL))0xfffffbff),REG_MFSEL); //使能outl(((inl(GPIOG_DIR))|(1u 6)),GPIOG_DIR);outl(((inl(GPIOG_DATAOUT))|(1u 6)),GPIOG_DATAOUT);return 0; /* success */ }六、GPIO释放staticintgpio_release(structinode *inode, struct file *filp) {return(0);

文档评论(0)

xuefei111 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档