GPIO调用方法的实现流程
上文中<IO空间的静态映射基本过程>虽然讲述了如何实现IO空间的静态映射方法,但调用s3c_gpio_cfgpin、s3c_gpio_setpull、gpio_direction_output就可以访问IO空间,这又是如何实现的呢?本文就来讲述一下实现过程。
回到smdkv210_map_io函数中
staticvoid __init smdkv210_map_io(void)
{
s5p_init_io(NULL, 0, S5P_VA_CHIPID);
s3c24xx_init_clocks(24000000);
s5pv210_gpiolib_init();
s3c24xx_init_uarts(smdkv210_uartcfgs,
ARRAY_SIZE(smdkv210_uartcfgs));
#ifndefCONFIG_S5P_HIGH_RES_TIMERS
s5p_set_timer_source(S5P_PWM2, S5P_PWM4);
#endif
s5p_reserve_bootmem(s5pv210_media_devs,
ARRAY_SIZE(s5pv210_media_devs),
S5P_RANGE_MFC);
}
在执行完s5p_init_io(NULL, 0, S5P_VA_CHIPID)之后,调用了s5pv210_gpiolib_init()函数,这个就是解答疑问的关键点。
__init int s5pv210_gpiolib_init(void)
{
structs3c_gpio_chip *chip = s5pv210_gpio_4bit;
intnr_chips = ARRAY_SIZE(s5pv210_gpio_4bit);
int gpioint_group = 0;
int i = 0;
for (i = 0; i < nr_chips; i++, chip++) {
if (chip->config == NULL) {
chip->config= &gpio_cfg;
chip->group = gpioint_group++;
}
if (chip->base == NULL)
chip->base= S5PV210_BANK_BASE(i);
}
samsung_gpiolib_add_4bit_chips(s5pv210_gpio_4bit,nr_chips);
s5p_register_gpioint_bank(IRQ_GPIOINT, 0,S5P_GPIOINT_GROUP_MAXNR);
return 0;
}
2.1 s5pv210_gpio_4bit
需要说明的是GPIO被分成了若干组,GPA0、GPA0、GPB、GPC0……,其中多作为外部中断IO组:GPH0、GPH1、GPH2、GPH3。
s5pv210_gpio_4bit结构体数组gpio分组的数据:
staticstruct s3c_gpio_chip s5pv210_gpio_4bit[] = {
{
.chip ={
.base = S5PV210_GPA0(0),
.ngpio = S5PV210_GPIO_A0_NR,
.label = "GPA0",
},
}, {
.chip ={
.base = S5PV210_GPA1(0),
.ngpio = S5PV210_GPIO_A1_NR,
.label = "GPA1",
},
}, {
.chip ={
.base = S5PV210_GPB(0),
.ngpio = S5PV210_GPIO_B_NR,
.label = "GPB",
},
}, {
.chip ={
.base = S5PV210_GPC0(0),
.ngpio = S5PV210_GPIO_C0_NR,
.label = "GPC0",
},
}, {
.chip ={
.base = S5PV210_GPC1(0),
.ngpio = S5PV210_GPIO_C1_NR,
.label = "GPC1",
},
}, {
.chip ={
.base = S5PV210_GPD0(0),
.ngpio = S5PV210_GPIO_D0_NR,
.label = "GPD0",
},
}, {
.chip ={
.base = S5PV210_GPD1(0),
.ngpio = S5PV210_GPIO_D1_NR,
.label = "GPD1",
},
}, {
.chip ={
.base = S5PV210_GPE0(0),
.ngpio = S5PV210_GPIO_E0_NR,
.label = "GPE0",
},
}, {
.chip ={
.base = S5PV210_GPE1(0),
.ngpio = S5PV210_GPIO_E1_NR,
.label = "GPE1",
},
}, {
.chip ={