四、GPIO

参考自linux-2.6.32.61\Documentation\


一、简介


GPIO全称是General Purpose
Input/Output,其关联SOC上的一个管脚。平台会分配相应的GPIO和外设关联,诸如audio codec外设,GPIO和平台强相关。

GPIO可由平台配置输入输出,输出即可写,高电平为1,低电平为0。输入即可读,除了读入数据外,输入还能作为中断信号。

二、GPIO标识

GPIO标识有效范围在0..MAX_INT,负数代表该平台不支持(可用作初始化)。

平台定义了它们如何使用这些接口,并且通常为每个GPIO线使用#define宏定义符号,以便单板的启动代码与相关设计直接保持一致。与此相反,驱动应该只使用从setup代码传递给他们的GPIO号码,使用platform_data来保存单板特定的管脚配置数据(与其它所需的单板特定数据一起)。这避免了移植问题。

诸如一个平台使用32-159,另一个平台使用0-64。

int gpio_is_valid(int number);

可用此函数判断此gpio线是否有效。

三、GPIO使用


  • 分配gpio

/* request GPIO, returning 0 or
negative errno.
     * non-null labels may be useful for
diagnostics.
     */
    int
gpio_request(unsigned gpio, const char *label);

  
 /* release previously-claimed GPIO */
    void
gpio_free(unsigned gpio);

此函数实现两个目的:

  1. 标识使用gpio的信号。

  2. 防止冲突,多个驱动使用互斥的同一个信号,使用gpio_request可作为锁。

Note that requesting a GPIO does NOT
cause it to be configured in any way; it just marks that GPIO as in use. 
Separate code must handle any pin setup (e.g. controlling which pin the GPIO
uses, pullup/pulldown).

Also note that it‘s your responsibility
to have stopped using a GPIO before you free it.

  • 标记gpio的方向

/* set as input or output, returning 0 or negative errno
*/
    int gpio_direction_input(unsigned
gpio);
    int gpio_direction_output(unsigned gpio, int
value);

  • Spinlock-Safe GPIO 访问

/* GPIO INPUT:  return zero or nonzero
*/
    int gpio_get_value(unsigned gpio);
  
 /* GPIO OUTPUT */
    void gpio_set_value(unsigned gpio,
int value);

  • 可睡的GPIO访问

int gpio_cansleep(unsigned gpio);

/* GPIO INPUT:  return zero or nonzero, might sleep
*/
    int gpio_get_value_cansleep(unsigned
gpio);

    /* GPIO OUTPUT, might sleep */
  
 void gpio_set_value_cansleep(unsigned gpio, int value);

Other than the fact that these calls
might sleep, and will not be ignored for GPIOs that can‘t be accessed from IRQ
handlers, these calls act the same as the spinlock-safe calls.

  • gpio输入作为中断信号

  /* map GPIO numbers to IRQ numbers */
     int
gpio_to_irq(unsigned gpio);

  /* map IRQ numbers to GPIO numbers (avoid using this) */
  
  int irq_to_gpio(unsigned irq);

gpio和中断线都是用整形标识的,其在两个name
space中,这两个函数建立了gpio和中断线之间的映射关系

四、GPIO,布布扣,bubuko.com

时间: 2024-08-24 01:30:57

四、GPIO的相关文章

Beaglebone Back学习四(GPIO实验)

GPIO Beaglebone Back开发板引出了92个引脚,其中只有65个GPIO口可通过配置使用,由于引脚具有"复用"的特性,大约每个引脚有8种工作模式(Beagle System Reference Manual),默认情况下,设为Mode7.由于P8扩展部分的引脚功能相对简单,复用不多,故项目功能复杂时,最好选择P8上的GPIO口. 对GPIO口的操作,主要有三个步骤 1 选择GPIO口根据以下两表,确定使用那个GPIO口,该表也可以在BBB_SRM文件中找到. (1)拉电流

智能车学习(十四)——K60单片机GPIO学习

一.头文件: #ifndef __GPIO_H__ #define __GPIO_H__ #include "gpio_cfg.h" #include "common.h" //端口宏定义 typedef enum PORTx { PORTA, PORTB, PORTC, PORTD, PORTE } PORTx; //定义管脚状态 typedef enum GPIO_CFG { //这里的值不能改!!! GPI = 0, //定义管脚输入方向 GPIOx_PDDR

树莓派高级GPIO库,wiringpi2 for python使用笔记(四)实战DHT11解码

DHT11是一款有已校准数字信号输出的温湿度传感器. 精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃. 我买的封装好的模块,上边自带了上拉电阻,直接查到树莓派上即可灰.紫.蓝分别代表数据.3.3V.0V,接到树莓派的3,1,10脚,分别对应PIN8,3.3V,0V. DHT11与单片机通讯协议为单线协议(1-wire),其实单线协议蛮厉害的,一个GPIO就能实现数据的读取,但是这个协议没有同步脉冲,所以对时序要求比较高,比如DHT11对高低电平定义如下: 低电平

【转载】stm32的GPIO八种工作模式

一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止.高低电平由IC的电源决定.         推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小.效率高.输出既可以向负载灌电流,也可以从负载抽取电流.推拉式输出级既提高电路的负载能力,又提高开关速度. 二.开漏输出:输出端相当于三极管的集电极,要得

S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动

目录:一. 说明 二. 驱动程序说明及问题 三. 案例一       四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看发板,读写都行:通过增加一些调试信息,对linux i2c驱动其中的编写方法之一有了一定了解,在我的另外一篇博文有详细说明.但同时对在linux下GPIO模拟i2c产生了兴趣,于是就写这篇博文来记录驱动编写过程中遇到的问题.如果想了解了i2c时序,请google或百度一下. 本篇博文通过misc驱动

BeagleBone Black板第六课:C++编程控制GPIO基础

BBB板第六课:C++编程控制GPIO基础 在一上课我们通过Shell脚本编程实现了对GPIO端口的简单输出控制,实现对两个LED指示灯的交替点亮和关闭,接下来的一两节课,将通过C++程序来实现Shell脚本的功能.为了实现对应的程序控制,我查阅了好多资料,测试过程中发觉网上的一些程序套用过来总是出现各种各样的编译错误,压根就控制不了BBB板,不知是我的BBB板太新,还是以前的程序太旧.最后还是从头开始,重新研究BBB板的文件系统,找出头文件,找出所有相关的函数,终于实现GPIO的C++程序控制

BeagleBone Black板第七课:GPIO编程控制

BBB板第七课:GPIO编程控制 在一上课我们通过IO函数做了简单的GPIO端口输出高低电平输出,实现对一个LED指示灯的点亮和关闭控制,本节将通过完整的C++程序,实现第四课Shell脚本的全部功能,实现两个LED指示灯的交替闪亮. 直接通过进入功能程序 1.实现echo 44 > export 打开端口功能 上一课简单测试中,通过手工在BBB板终端模式下打开gpio44端口可通过以下程序实现: #include <stdio.h> #define GPIO_DIR "/sy

STM32四旋翼飞行器

这个飞控是基于STM32,整合了MPU6050,即陀螺仪和重力加速计,但没有融合电子罗盘: 这是飞控程序的控制流程(一个执行周期): 比较重要的地方: 1.i2c通信方式: STM32的开发库是带有i2c通信的相关函数的,但是我最后还是没有用这些函数. 我通过GPIO模拟i2c,这样也能获得mpu6050的数据,虽然代码多了一些,但是比较好的理解i2c的原理. STM32库实现的模拟i2c代码(注释好像因为编码问题跪了): /***********************************

学员心声(四)

学员:徐同学 一句话介绍学习感受:庆兴把钱花在刀刃上 学习经历: 1991年生,目前还在杭州重点高等学校读书,2014年本科毕业几乎是混着过来的,也就懂点STM32和51单片机,做个几个简单的电子小设计,但是对于嵌入式,基于操作系统的应用并没有太多了解.虽然一直想学习,毕竟这是个软件当道的世界,硬件方面的工作确实不太好找(主要还是水平不行,公司要求颇高). 15年5月无意间看到了韦东山老师的视频,在此之前看过**的视频,大都是对着LDD第三版的概念泛泛而谈,听过看过之后就忘了,总感觉用不起来.然