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