/* GPIO bank summary:
*
* Bank GPIOs Style SlpCon ExtInt Group
* A 8 4Bit Yes 1
* B 7 4Bit Yes 1
* C 8 4Bit Yes 2
* D 5 4Bit Yes 3
* E 5 4Bit Yes None
* F 16 2Bit Yes 4 [1]
* G 7 4Bit Yes 5
* H 10 4Bit[2] Yes 6
* I 16 2Bit Yes None
* J 12 2Bit Yes None
* K 16 4Bit[2] No None
* L 15 4Bit[2] No None
* M 6 4Bit No IRQ_EINT
* N 16 2Bit No IRQ_EINT
* O 16 2Bit Yes 7
* P 15 2Bit Yes 8
* Q 9 2Bit Yes 9
*
* [1] BANKF pins 14,15 do not form part of the external interrupt sources
* [2] BANK has two control registers, GPxCON0 and GPxCON1
*/
三星gpio的input和output属于不同的function,
一般用这两个来控制:
s3c_gpio_setpull(S3C64XX_GPN(0), S3C_GPIO_PULL_UP);
s3c_gpio_cfgpin(S3C64XX_GPN(0), S3C_GPIO_SFN(0));
分析和先是用这两个来初始化,再用gpio_direction_output来设置高低。
但是后来发现,直接调用
s3c_gpio_setpull + gpio_direction_input
或者
gpio_direction_output
可以替换s3c_gpio_cfgpin的功能,因为这两个函数实际上会调用chip->gpio_input/gpio_output
而这个chip结构体在plat-s3c64xx/gpiolib.c中有实现并注册进去了。
if (gpio_is_valid(S3C64XX_GPE(0))) {
err = gpio_request(S3C64XX_GPE(0), "GPE");
if (err) {
printk(KERN_ERR "failed to request GPE for "
"lcd reset control/n");
return err;
}
gpio_direction_output(S3C64XX_GPE(0), 1);
}
gpio_set_value(S3C64XX_GPE(0), 1);
gpio_free(S3C64XX_GPE(0));
S3C好像不能用gpio_set_value。
但据别人说可以,到底是否可以待以后观察。
在armsys6410的kernel中用这个函数来使能wifi,发现编译的内核在跑起来后在probe的时候,core dump掉了。
需要跟踪整个gpio的机制。
是可以使用的,如果要找gpio_set_value这个函数,不能找gpio_set_value函数,要找gpio_set_value这个宏,这个宏定义在mach/gpio.h中。
但是在armsys6410 2.6.28的内核中一用这个函数在mach_smdk6410.c中就会死掉。
原因不明。
/*
申請一個gpio,其實就是檢查該gpio是否空閒,如果空閒就可以使用並將該gpio相應的bit置位
(在gpio_in_use中)。
*/
/*
釋放一個gpio,其實就是清除gpio相應的控制bit位(在gpio_in_use中)。
*/