linux的GPIO平台适配模型(结合8810讲解)

 

 

GPIO是与硬件体系密切相关的,linux提供一个模型来让驱动统一处理GPIO,即各个板卡都有实现自己的gpio_chip控制模块:request, free, input,output, get,set,irq...


        然后把控制模块注册到内核中,这时会改变全局gpio数组:gpio_desc[]. 

        当用户请求gpio时,就会到这个数组中找到,并调用这个GPIO对应的gpio_chip的处理函数。

        gpio实现为一组可用的 gpio_chip, 由驱动传入对应 gpio的全局序号 去 request, dataout ,datain, free. 这时会调用gpio_chip中具体的实现。

       寄存器读写函数:   __raw_writel()   __raw_writeb()   __raw_readl()   __raw_readb()

        gpio是一组可控件的脚,由多个寄存器同时控制。通过设置对应的寄存器可以达到设置GPIO口对应状态与功能。
数据状态,输入输出方向,清零,中断(那个边沿触发), 一般是一组(bank)一组的。

//****************linux 中 GPIO模型****************************************//
注册方法:
1:struct gpio_chip: 表示一个gpio controller.通过这个结构抽象化所有的 GPIO源,而让板上其它的模块可以用相同的接口调用使用这些GPIO。
2: struct gpio_desc: 表示一个gpio口,含对应的 gpio_chip.
3: ARCH_NR_GPIOS:  与板相关的GPIO口数量,即是全局GPIO数组:static struct gpio_desc gpio_desc[ARCH_NR_GPIOS];
4: 注册 gpio_chip时,就是根据 chip 的数据 修改全局 GPIO数组中 gpio_desc 字段(chip, flags)。

 

 

arch/arm/mach-sc8810/gpio.c

#include <linux/init.h>
#include <linux/irq.h>
#include <linux/bug.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <asm/io.h>
#include <asm/gpio.h>

#include <mach/regs_global.h>
#include <mach/regs_gpio.h>
#include <mach/regs_ana.h>
#include <mach/board.h>
#include "gpio_phy.h"

 

static struct gpio_chip sprd_gpio_chip = {
    .label = "sc8810-gpio",
    .direction_input = sprd_gpio_direction_input,
    .direction_output = sprd_gpio_direction_output,
    .get = sprd_gpio_get,
    .set = sprd_gpio_set,
    .request = sprd_gpio_request,
    .free = sprd_gpio_free,
    .to_irq = sprd_gpio_to_irq,
    .base = 0,
    .ngpio = GPIO_MAX_PIN_NUM,
};


static u8 sprd_gpio_logic[GPIO_MAX_PIN_NUM];

 

arch/arm/mach-sc8810/gpio_phy.h

取得基地址,其中用到了 物理地址转虚拟地址的函数__adi_phy_to_virt

static __inline u32 __get_base_addr (u32 gpio_id)
{
    if (gpio_id > NR_D_DIE_GPIOS)
    {
        if (gpio_id < 176 + 16)
            return __adi_phy_to_virt(0x82000480);
        return __adi_phy_to_virt(0x820004c0);
    }

    return ((gpio_id>>4) -1) * 0x80 + (u32) GPIO_BASE;
}

 

customize/customer_cfg/sp8810ga/kernel/pinmap/pinmap_cfg.c

17506(b) 2012-07-30 15:23 ./customize/customer_cfg/sp8810ga/kernel/pinmap/pinmap_cfg.c

22519(b) 2012-07-30 13:14  ./kernel/arch/arm/mach-sc8810/board-sp8810w/pinmap_cfg.c
 

kernel/arch/arm/mach-sc8810/board-sp8810/pinmap_cfg.c

 

你可能感兴趣的:(linux的GPIO平台适配模型(结合8810讲解))