linux内核驱动中通用GPIO函数使用

ARM体系芯片 IO口实际上是4G内存空间中的一部分地址空间,所以,本质上就是操作内存,它和其他的片上外设没有区别。这类 IO 称为 IO内存。在芯片还有一类称IO端口,这一类要配置就不是通过ioremp这种方式。这种形态IO,一般出现在X86芯片 。实际应用中,IO内存操作可以使用ioremap映射再使用指针操作对应的寄存器,但是比较少使用,一般 使用内核提供GPIO操作函数。

内核提供的通用GPIO操作的API接口文件 :Gpio.h (include\linux)
int gpio_get_value(unsigned int gpio)
功能:获取IO口的状态
参数:gpio  要获取的IO口编号
返回:IO口状态

void gpio_set_value(unsigned int gpio, int value)
功能:设置IO口的状态
参数:gpio  要获取的IO口编号 ,value:要设置的值  ,0或1
返回:无

int gpio_cansleep(unsigned int gpio)   比较少用。
功能:判断IO是否具可以休眠
参数:gpio  要获取的IO口编号
返回:非0,可以休眠

int gpio_to_irq(unsigned int gpio)   很常用
功能:通过Io口编号转换成对应 的外部中断编号
参数:gpio  要获取的IO口编号
返回:成功:中断编号
失败:  - ENXIO   #define    ENXIO         6    /* No such device or address */


gpiolib.c  还实现其他的gpio操作函数
int gpio_direction_output(unsigned gpio, int value)
功能:指定IO口gpio设置为输出功能,并且输出指出电平value

int gpio_direction_input(unsigned gpio)
功能:读取指定IO口gpio电平状态

int gpio_request(unsigned gpio, const char *label)  这个函数可用不可不用,建议使用。
功能:向内核申请指定IO,所申请的IO口会被内核记录。
参数:gpio  申请IO口编号  ,label:申请者的名字,随便。
已经被申请的IO,在没有释放前再次申请将会失败。
返回:成功:0;失败:负数

使用IO时候可以申请,也可以不申请 ,建议申请,这样对IO是来说是一种保护。
示例:
a驱动 和b驱动使用相同的IO,  a配置为输入,b配置为输出。
如果两个驱动使用IO口都不申请,都可以成功安装,这样共用的IO功能上冲突。但是另外驱动并不知道,这样导致内核存在BUG,

想实现安全使用,必须要求所用使用IO的驱动程序使用申请再使用,如果哪个驱动没有申请,其他的申请,则没有申请的驱动会绕过内核检测,直接使用,这样达不到保护效果了。

void gpio_free(unsigned gpio)  //此函数和 gpio_request配对使用,功能相反,
功能:释放向内核已经申请的指定IO。 所释放的IO口会在内核记录消除。
释放的io,可以再次被申请。


芯片厂家一般会提供一个芯片级io配置的代码(drivers\gpio)

三星公司提供的函数:
Gpio-samsung.c (drivers\gpio)

int s3c_gpio_cfgpin(unsigned int pin, unsigned int config)
功能:把指定IO口配置为指定功能
pin:管脚编号,和前面的函数相同的定义方式
config:
功能对应的数值,这个需要查看具体芯片手册对应的IO功能配置说明。
如:EXYNOS4412  芯片, 0x0  是输入,0x1输出,其他 复用功能(具体功能看手册)

int s3c_gpio_cfgpin_range(unsigned int start, unsigned int nr,  unsigned int cfg)
功能:把指定范围IO口配置为指定功能
start:管脚编号,和前面的函数相同的定义方式
nr: 连续io数量
cfg:
功能对应的数值,这个需要查看具体芯片手册对应的IO功能配置说明。
如:EXYNOS4412  芯片, 0x0  是输入,0x1输出,其他 复用功能(具体功能看手册)
其实这个函数内部实现就多次调用  s3c_gpio_cfgpin


unsigned s3c_gpio_getcfg(unsigned int pin)
功能:获取指定IO的功能对应的配置值(查询IO功能)
pin:管脚编号,和前面的函数相同的定义方式
返回 :功能值

要使用上面函数,还需要解决函数的  参数 gpio 的意义。
1)不是看芯片手册 上芯片管脚编号
2)使用编号是由Linux源码中头文件所定义的编号。
a.不同芯片,IO编号,功能都不一样,这个定义头文件一般在存放和具体芯片类型相关的文件夹中。
arch/构架/mach-芯片型号/include/mach/gpio.h
如EXYNOS4412芯片:
arch/arm/mach-exynos/include/mach/gpio.h

以下是部分定义:使用方法  宏名(组内管脚编号),如 tiny4412开发板上4个LED是在GPM4的0~3上,所以它定义:
EXYNOS4X12_GPM4(0)
EXYNOS4X12_GPM4(1)
EXYNOS4X12_GPM4(2)
EXYNOS4X12_GPM4(3)

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GPIO是英文General Purpose Input/Output的缩写,翻译过来就是通用输入输出。Linux内核提供了GPIO驱动框架,可以通过该框架来控制硬件上的GPIO,实现对外设的控制。 在Linux内核GPIO驱动可以分为两类:基于平台的GPIO驱动和基于设备的GPIO驱动。基于平台的GPIO驱动是针对整个平台的GPIO控制,而基于设备的GPIO驱动则是针对单个设备的GPIO控制。 在使用GPIO驱动时,需要先找到所使用GPIO引脚的编号,并将其映射到内存的地址。然后通过读写内存的寄存器来控制GPIO的状态。 对于GPIO操作可以通过Linux内核提供的sysfs接口来实现。在sysfs,每个GPIO都被表示为一个文件,可以通过读写文件来进行GPIO操作。 需要注意的是,在使用GPIO驱动时,需要谨慎操作,避免对硬件造成损坏。同时,还需要了解所使用的硬件设备的特性和限制,以确保GPIO驱动的正确使用。补充说明: 在Linux内核GPIO驱动主要由GPIO子系统和GPIO控制器驱动两部分组成。GPIO子系统提供了一个通用接口,用于操作GPIO控制器驱动,而GPIO控制器驱动则是实际控制硬件的部分。 GPIO子系统可以分为两个部分:GPIO框架和GPIO API。GPIO框架是一个通用的框架,用于管理GPIO控制器和GPIO设备,它定义了一些数据结构和函数接口,用于注册和管理GPIO控制器和GPIO设备。GPIO API是一个用户空间的API,提供了一些函数接口,用于操作GPIOGPIO控制器驱动是针对特定的GPIO控制器的驱动程序,它负责实际控制GPIO的硬件操作。在Linux内核,每种GPIO控制器都有一个对应的GPIO控制器驱动程序。当使用GPIO时,首先需要通过GPIO子系统将GPIO控制器驱动注册到系统,然后才能使用GPIO API对GPIO进行操作。 需要注意的是,在使用GPIO驱动时,需要注意GPIO的电气特性,避免对硬件造成损坏。同时,在进行GPIO操作时,还需要注意GPIO的并发访问和竞争问题,以确保系统的正确性和稳定性。 ### 回答2: Linux GPI驱动指的是Linux系统通过General Purpose Input/Output(GPIO接口与硬件设备进行交互的驱动程序。GPIO接口是一组通用的、可编程的多功能引脚,可用于连接各种外部设备,例如开关、LED、传感器、驱动器等。 Linux GPIO驱动可以实现对GPIO引脚的读写操作断处理等功能。它不仅可以与单片机等嵌入式设备进行通信,还可与各种外接硬件设备进行连接和通信。 在Linux系统,用户可以通过/sys/class/gpio文件系统来访问GPIO引脚。在使用GPIO驱动时,用户需要首先加载相应的内核模块,然后使用GPIO API来对引脚进行读写操作或开启断。 GPIO驱动程序需要实现以下功能: 1. 查询GPIO可用性及分配资源。通常,由于GPIO是多路的,因此设备需要分配资源共享GPIO。 2. 初始化GPIO引脚,包括定义方向及设置上下拉电阻等。 3. 实现GPIO引脚的读写操作。 4. 解除分配资源并释放相关资源。 正常情况下,GPIO驱动程序会提供一个设备文件,用户可以通过读写该文件实现GPIO引脚的操作。 总之,Linux GPIO驱动具有良好的可移植性和稳定性,可以方便地与其他硬件设备进行交互,因此被广泛应用于各种嵌入式设备和嵌入式系统。 ### 回答3: Linux GPIO驱动是一种在嵌入式系统实现通用输入输出(GPIO,General Purpose Input/Output)功能的软件驱动GPIO是一种非常有用的硬件资源,它可以连接到外部设备,例如LED灯、按键和触摸屏等。 Linux内核支持GPIO操作,当你的嵌入式系统上有GPIO设备时,你可以利用GPIO来读取或设置其状态。驱动程序能够将GPIO标记为输入或输出,并且它们可以在运行时进行配置。 在Linux,一般有两种方式将GPIO驱动程序添加到内核:一种是将其编译到内核,另一种是将其作为模块加载。 GPIO驱动程序等价于操作系统提供的设备文件,例如/dev/gpiochip0,它允许用户空间应用程序访问GPIO。这些设备文件可用于读取或写入GPIO状态。例如,要控制一个LED,需要将GPIO设置为输出模式,然后将其电平设置为高或低即可。 除此之外,GPIO驱动程序也可以实现断(interrupt)机制,GPIO的状态变化时可以产生断事件,这常用于处理GPIO键盘或GPIO断信号的应用场景。 总结来说,Linux内核支持GPIO驱动需要有以下几个步骤:配置GPIO硬件;添加驱动程序;编写用户空间应用程序,按需要读取或设置GPIO状态来和外设交互。GPIO驱动程序是嵌入式系统非常必要的组成部分,它们能够随时提供接口以方便对外部设备的读写访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值