• 【linux】 linux gpio操作


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

    邮箱:tangzhongp@163.com

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

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

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

    1.   GPIO

    1.1.  地址映射

    clip_image001[4]

    如上所述:

    #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_STARTmini2440_map_ios3c24xx_init_io →iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc));

     

     

    1.2.  数据结构

     

    clip_image002[4]

     

    上图可以看出,根据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 (srcdriversgpio):  struct gpio_desc gpio_desc[ARCH_NR_GPIOS]; // 每一个gpio管脚对应一个gpio_desc,gpio_desc的索引为linux虚拟的。

    gpio_desc初始化:Gpio-samsung.c (srcdriversgpio):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_inputdirection_output, get, sets3c24xx_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.配置为输入*/

  • 相关阅读:
    Web容器初始化过程
    基于LayUI实现前端分页功能
    Ubuntu16.04首次root登录设置
    Java集合Iterator迭代器的实现
    ThreadLocal的基本原理与实现
    Redis系列四之复制
    反应堆模式
    Netty学习之客户端创建
    Netty学习之服务器端创建
    Java NIO服务器端开发
  • 原文地址:https://www.cnblogs.com/embedded-tzp/p/4450515.html
Copyright © 2020-2023  润新知