




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux下GPIO驱动程序Linux提供了一种全新的“模块”机制,可根据需要在不必对内核进行重新编译的情况下;将可加载模块动态地插入运行中的内核,成为内核的一个有机组成部分;也可以动态地卸载已加载的模块。Linux下设备驱动程序的编写要点是为相应的设备编写完成相应功能的基本函数,然向虚拟文件系统(VFS)注册。当应用程序需要对设备进行操作时,可以访问该设备对应的文件节点,利用VFS调用该设备的相关处理函数即可。驱动程序是指一组子程序,它屏蔽了底层硬件处理细节,同时向上层软件提供与硬件无关的接口,在Linux内核中占据极其重要的地位,是用来完成对物理设备控制操作的功能模块,设备驱动程序控制操作系统和硬件设备访问的交互操作。图为设备驱动模块动态挂载、卸载和系统调用的全过程:内核和模块的关系一、入口函数初始化设备驱动在加载时首先需要调用入口函数_init gpio_init(void),该函数完成设备驱动的初始化工作,比如寄存器置位、结构体赋值等一系列工作,其中最重要的一个工作就是向内核注册该设备,字符设备调用函数register_chrdev()完成注册。注册成功后,该设备获得了系统分配或向系统申请的主设备号、自定义的次设备号,并建立起与设备文件的关联。int _init gpio_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 %dn, MAJOR_NR ); /返回值小于0,注册不成功 return(result); if (MAJOR_NR = 0) MAJOR_NR = result; /* dynamic */ printk(KERN_INFO DEVICE_NAME : init OKn); /初始化成功 return(0); 二、注销模块注销模块是和注册模块对应的操作,当卸载模块时,系统将注销模块对应的设备,并释放主设备号,这一操作可以在模块的清除函数中调用unregister_chrdev()函数来完成。 unregister_chrdev()函数用于注销设备、释放主设备号和设备文件名。参数包括要释放的主设备号和对应的设备名。void _exit gpio_cleanup(void) unregister_chrdev(MAJOR_NR, DEVICE_NAME);三、结构体每个设备驱动程序都对应一个file_operations数据结构,file_operations是定义在中的函数指针数组。对于字符设备而言,file_operations就是唯一的函数接口。一个数据结构包括两个元素:一个登记的设备驱动程序的名称的指针和一个指向一组文件操作的指针。用户是通过设备文件同硬件打交道,以系统调用的方式对设备文件进行操作,并通过完成file_operations中的函数指针来把系统调用和驱动程序关联起来。static struct file_operations gpio_fops = /* driver info */ owner: THIS_MODULE, ioctl: gpio_ioctl, open: gpio_open, release: gpio_release,;四、全局变量static int major = GPIO_MAJOR_NR; /主设备号五、打开设备输入有两个,一个是inode,表示设备信息,一个是filp,表示指向的文件。输出返回值为0时,设备正常打开,否则打开失败。static int gpio_open(struct inode *inode, struct file *filp) outl(inl(REG_MFSEL)&0xfffffbff),REG_MFSEL); /使能 outl(inl(GPIOG_DIR)|(1u 6),GPIOG_DIR); outl(inl(GPIOG_DATAOUT)|(1u i_rdev); if (num = MAX_PORT) return -ENODEV; if (_IOC_TYPE(cmd) != GPIO_IOC_MAGIC) return -ENOTTY; if (_IOC_NR(cmd) = GPIO_MAXNR) return -ENOTTY; switch(cmd) / 命令选择 case GPIO_SET_PIN: /设置某个I/O引脚为高电平 if (arg 17) outl(inl(GPIOG_DIR)|(1u arg),GPIOG_DIR); outl(inl(GPIOG_DATAOUT)|(1u arg),GPIOG_DATAOUT); break; case GPIO_SET_ALL_PIN: /设置多个I/O引脚为高电平 outl(inl(GPIOG_DIR)|arg),GPIOG_DIR); outl(inl(GPIOG_DATAOUT)|arg),GPIOG_DATAOUT); break; case GPIO_CLR_PIN: /设置某个I/O引脚为低电平 if (arg 17) outl(inl(GPIOG_DIR)|(1u arg),GPIOG_DIR); outl(inl(GPIOG_DATAOUT)&(1u arg),GPIOG_DATAOUT); break; case GPIO_CLR_ALL_PIN: /设置多个I/O引脚为低电平 outl(inl(GPIOG_DIR)|arg),GPIOG_DIR); outl(inl(GPIOG_DATAOUT)&(arg),GPIOG_DATAOUT); break; case GPIO_SET_PIN_OUT: /设置某个I/O引脚为输出引脚 if (arg 17) outl(inl(GPIOG_DIR)|(1u arg),GPIOG_DIR); break; case GPIO_SET_PIN_IN: /设置某个I/O引脚为输入引脚 if (arg 17) outl(inl(GPIOG_DIR)&(1u arg),GPIOG_DIR); break; case GPIO_SET_MULTI_PIN_OUT: /设置多个I/O引脚为输出引脚 outl(inl(GPIOG_DIR)|arg),GPIOG_DIR); break; case GPIO_SET_MULTI_PIN_IN: /设置多个I/O引脚为输入引脚 outl(inl(GPIOG_DIR)&(arg),GPIOG_DIR); break; case GPIO_READ_PIN: /设置某个I/O引脚为读引脚 if (!access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd) return -EFAULT; if (!access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd) return -EFAULT; temp1 = GPIO_PIN_ERR; get_user(temp2, (u32 *)arg); if (temp2 17) outl(inl(GPIOG_DIR)&(1u temp2),GPIOG_DIR); temp1 = (inl(GPIOG_DATAIN) & (1u temp2); if (temp1 != 0) temp1 = GPIO_PIN_HIGH; else temp1 = GPIO_PIN_LOW; put_user(temp1, (u32 *)arg); break; case GPIO_READ_ALL_PIN: /设置多个I/O引脚为读引脚 if (!access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd) return -EFAULT; if (!access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd) return -EFAULT; outl(0x00),GPIOG_DIR); temp1 = inl(GPIOG_DATAIN); put_user(temp1, (u32 *)arg); break; default: return -ENOTTY; break; return 0;八、头文件驱动程序包括头文件nuc900_gpio.h,这个头文件中需要写出主设备号,端口数,设备名#define GPIO_MAJOR_NR 126#define MAX_PORT 4#define DEVICE_NAME GPIO /* name for messaging */可以用mknod gpio c 126
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年法学概论考试科目简介与试题及答案
- 2025届河南省新乡、开封市名校联考八下数学期末预测试题含解析
- 行政管理专业教师的教学策略试题及答案
- 法学概论复习指南试题及答案
- 如何制定提升竞争力的策略试题及答案
- 财务报告的法律及道德责任试题及答案
- 物资分类管理方案计划
- 江苏省泰州市相城区黄桥中学2025届数学八下期末学业水平测试模拟试题含解析
- 辽宁省营口市大石桥市石佛中学2025届八年级数学第二学期期末经典试题含解析
- 防范火灾隐患的保安工作措施计划
- GB/T 18781-2023珍珠分级
- GA/T 544-2021多道心理测试系统通用技术规范
- 年代小说先锋小说
- 【超星尔雅学习通】世界建筑史网课章节答案
- (52)-疱疹性咽峡炎小儿推拿探秘
- 土建施工员培训课件
- 新音乐初放 学堂乐歌说课课件
- GMP体系文件(手册+程序)
- 陕西延长石油四海煤化工有限公司金属镁厂1万吨-年金属镁生产项目环评报告
- 集电线路安装工程质量通病防治
- 大学生动漫创业计划书
评论
0/150
提交评论