编写GPIO驱动程序说明

上传人:huo****ian 文档编号:138632850 上传时间:2022-08-21 格式:DOCX 页数:5 大小:66.31KB
返回 下载 相关 举报
编写GPIO驱动程序说明_第1页
第1页 / 共5页
编写GPIO驱动程序说明_第2页
第2页 / 共5页
编写GPIO驱动程序说明_第3页
第3页 / 共5页
点击查看更多>>
资源描述
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 0 创建出gpio驱动的设备节点文件九、文件烧写编译在Linux下用make命令编译gpio.c,生成gpio执行文件,在超级终端下输入命令“insmod gpio.ko”,即可将我们编写的驱动模块烧写进内核中,用指令“cat /proc/modules”可以查看模块名,用指令“cat /proc/devices”可以查看主设备名,用命令“rmmod gpio”可以将模块从内核中卸载。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑环境 > 建筑资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!