欢迎转载,转载时需保留作者信息,谢谢。

邮箱:tangzhongp@163.com

博客园地址:http://www.cnblogs.com/embedded-tzp

Csdn博客地址:http://blog.csdn.net/xiayulewa

 

是平时自己word离线做笔记的,当发在网上才发现写的太宏观,不怎么容易看懂,今后做笔记会注意多贴代码。

1.   GPIO

1.1.  地址映射

如上所述:

#define S3C24XX_VA_GPIO             ((S3C24XX_PA_GPIO - S3C24XX_PA_UART) + S3C24XX_VA_UART)

因为UART的物理地址和虚拟地址映射确定了,所以其它寄存器如GPIO映射关系也可以确定了

 

static struct map_desc s3c_iodesc[] __initdata = {

       IODESC_ENT(GPIO),

       IODESC_ENT(IRQ),

       IODESC_ENT(MEMCTRL),

       IODESC_ENT(UART)

};

#define IODESC_ENT(x) { (unsigned long)S3C24XX_VA_##x, __phys_to_pfn(S3C24XX_PA_##x), S3C24XX_SZ_##x, MT_DEVICE }

#define __phys_to_pfn(paddr)  ((unsigned long)((paddr) >> PAGE_SHIFT))

#define __pfn_to_phys(pfn)       ((phys_addr_t)(pfn) << PAGE_SHIFT)

#define PAGE_SHIFT  12

 

根据上述定义:gpio虚拟地址分配(S3C24XX_VA_GPIO)流程:MACHINE_START中mini2440_map_io→s3c24xx_init_io →iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc));

 

 

1.2.  数据结构

 

 

上图可以看出,根据gpio_desc数组,还可以通过container_of还原出struct samsung_gpio_chip, 该结构体里面的base成员即为虚拟地址,在s3c24xx_gpiolib_add_chips中被赋值。最右边的.chip成员还有struct gpio_desc       *desc;成员,其被赋值为chip->desc = &gpio_desc[chip->base]; 因此,通过gpio号可以索引到数组gpio_desc的成员,然后索引到.chip,进而索引所有gpio对象。

 

主要结构体:Gpiolib.c (src\drivers\gpio):  struct gpio_desc gpio_desc[ARCH_NR_GPIOS]; // 每一个gpio管脚对应一个gpio_desc,gpio_desc的索引为linux虚拟的。

gpio_desc初始化:Gpio-samsung.c (src\drivers\gpio):core_initcall(samsung_gpiolib_init);(见MACHINE_START处理)

 

→ s3c24xx_gpiolib_add_chips(s3c24xx_gpios, ARRAY_SIZE(s3c24xx_gpios), S3C24XX_VA_GPIO)→ gpiochip_add, 所以最后gpio_desc内容与s3c24xx_gpios相关,同时在该函数中有chip->base = base + ((i) * 0x10); 对base赋值为虚拟地址,根据第一节gpio的虚拟地址和物理地址建立的映射,便可访问到物理地址。

 

struct samsung_gpio_chip s3c24xx_gpios[] = {

#ifdef CONFIG_PLAT_S3C24XX

       {

              .config  = &s3c24xx_gpiocfg_banka,

              .chip     = {

                     .base                  = S3C2410_GPA(0),

                     .owner                = THIS_MODULE,

                     .label                  = "GPIOA",

                     .ngpio                 = 24,

                     .direction_input       = s3c24xx_gpiolib_banka_input,

                     .direction_output     = s3c24xx_gpiolib_banka_output,

              },

       }, {

              .chip     = {

                     .base    = S3C2410_GPB(0),

                     .owner  = THIS_MODULE,

                     .label    = "GPIOB",

                     .ngpio   = 16,

              },

       },

.........................................

};

 

以gpio_direction_input为例说明 gpio驱动:

gpio_direction_input(unsigned gpio) → gpiod_direction_input(gpio_to_desc(gpio)); → chip = desc->chip; chip->direction_input(chip, offset); 在上述gpio_desc初始化或者s3c24xx_gpios结构体变量定义中,该函数被赋值,以samsung_gpiolib_2bit_input为例,最终执行

struct samsung_gpio_chip *ourchip = to_samsung_gpio(chip);

       void __iomem *base = ourchip->base; // base 为该gpio寄存器的虚拟地址。

....

con = __raw_readl(base + 0x00); //操纵实际寄存器

....

 

 

chip->direction_input,direction_output, get, set在s3c24xx_gpiolib_add_chips中被赋值。

gpio_direction_output→ Chip->direction_output 进行实际寄存器操纵。

 

1.3.  函数集合

gpio_request

gpio_free

 

gpio_get_direction

gpio_direction_input

gpio_direction_output

 

gpio_set_value

gpio_get_value

 

gpio_set_debounce

gpio_to_irq

 

gpiolib_dbg_show

 

1.4.  实例

根据上述讨论,通过gpio号可以索引到gpio所有相关对象(数据和函数),如S3C2410_GPA(0)

 

gpio_request(S3C2410_GPA(0), "KEY_UP");   

gpio_direction_input(S3C2410_GPA(0)); /*2.配置为输入*/

【linux】 linux gpio操作的更多相关文章

  1. linux 标准 GPIO 操作

    Linux 提供了GPIO 操作的 API,具体初始化及注册函数在 driver/gpio/lib_gpio.c 中实现.   #include    int gpio_request(unsigne ...

  2. Linux内核 GPIO操作部分API

    内核中关于GPIO的操作API主要集中在<linux/of_gpio.h>和<linux/gpio.h>中,前者主要是GPIO直接与设备树相关的操作,在Linux 设备树操作A ...

  3. Linux应用层直接操作GPIO

    Linux应用层直接操作GPIO 在一个老手的指导下,应用层可以直接操作GPIO,具体指设置GPIO的输入输出以及输出电平高或者低.这个大大地提高了灵活性,官方的文档有GPIO Sysfs Inter ...

  4. linux下GPIO的用户层操作(sysfs)

    linux的GPIO通过sysfs为用户提供服务,下面是linux kernel里的说明文档,学习一下. GPIO Sysfs Interface for Userspace ============ ...

  5. Linux下GPIO驱动(三) ----gpio_desc()的分析

    上篇最后提出的疑问是结构体gpio_chip中的成员函数set等是怎么实现的,在回答之前先介绍下gpio_desc这个结构体. 如上图所示,右上方部分为GPIO驱动对其它驱动提供的GPIO操作接口,其 ...

  6. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之二

    /** ****************************************************************************** * @author    暴走的小 ...

  7. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之一

    /** ****************************************************************************** * @author    暴走的小 ...

  8. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之三

    /** ****************************************************************************** * @author    暴走的小 ...

  9. Android(Linux)控制GPIO方法二

    前文<Android(Linux)控制GPIO的方法及实时性分析>主要使用Linux shell命令控制GPIO,该方法可在调试过程中快速确定GPIO硬件是否有问题,即对应的GPIO是否受 ...

  10. Linux 图形化操作

    //Linux图形化操作 #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...

随机推荐

  1. JQuery中回车键登陆

    //点击回车键 //王东升/2015/3/11 document.onkeydown = function (event) { var e = event ? event : (window.even ...

  2. 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本、内核、当前时间

    申请博客有一段时间了,然而到现在还一篇没有写过..... 主要因为没有想到需要写些什么,最近在学习Python语言,照着书上看了看最基础的东西,发现根本看不进去,而且光看的话今天看了觉得都理解懂了,过 ...

  3. ASP.NET jQuery 随笔 显示RadioButtonList成员选中的内容和值

    通过jQuery来获取RadioButtonList成员内容. <%@ Page Language="C#" AutoEventWireup="true" ...

  4. NET Core个人博客

    NET Core重写个人博客站点小结 今天用ASP.NET Core重写了个人博客站点,原来是基于ASP.NET 4.5开发的.重写工作总体很顺利,最后成功发布到Ubunt+Nginx平台上.效果如下 ...

  5. Protel99se教程五:protel99se的自动布线

    在上一节课的protel99se教程中,我们给大家演示的是,如何快速的将SCH原理PCB,也就是将元件转到PCB中,在这一节课,我们主要给大家讲解的是何在protel99se快速布线,我们在这节课当中 ...

  6. Protel99se教程三:新建PCB文件以及PCB基本设定

    在上一课,我们绘制好SCH原理图后,在这一节课开始,我们介绍,如何将SCH转化成PCB文件,在这一节课,我们主要给大家讲解,如果新建PCB文件以及载入封装图. 第一步:在Documents目录下,新建 ...

  7. 利用bind搭建dns

    下载bind,我下载的是bind-9.3.1rc1.tar.gz 我下载的文件放在/root目录下 进入目录解压缩 [root@linux root]#tar xfz bind-9.3.1rc1.ta ...

  8. Laravel + Xdebug 时需要注意的问题

    [平台环境]64bit Win7 + Wamp2.5 (php 5.5, Apache 2.4.9) [Xdebug版本]php_xdebug-2.2.5-5.5-vc11-x86_64.dll 配置 ...

  9. BZOJ 3402: [Usaco2009 Open]Hide and Seek 捉迷藏

    题目 3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec  Memory Limit: 128 MB Description     贝 ...

  10. iOS圆盘转动引导图的简单实现

    最近更新的一批app,好多都采用了圆盘转动的效果,比如:百度音乐.当当,大概效果如下: 看看这个是怎么实现的吧. 一.视图元素布局 首先需要明确,这些视图元素是分布在一个圆周上的,通过滑动位置,以圆周 ...