int gpio_get_value(unsigned gpio)
{
const struct gpio_bank *bank;
void *reg;
int input;
if (check_gpio(gpio) < 0)
return -1;
bank = get_gpio_bank(gpio);
reg = bank->base;
switch (bank->method) {
case METHOD_GPIO_24XX:
input = _get_gpio_direction(bank, get_gpio_index(gpio));
switch (input) {
case OMAP_GPIO_DIR_IN:
reg += OMAP_GPIO_DATAIN;
break;
case OMAP_GPIO_DIR_OUT:
reg += OMAP_GPIO_DATAOUT;
break;
default:
return -1;
}
break;
default:
return -1;
}
return (__raw_readl(reg)
& (1 << get_gpio_index(gpio))) != 0;
}
int gpio_set_value(unsigned gpio, int value)
{
const struct gpio_bank *bank;
if (check_gpio(gpio) < 0)
return -1;
bank = get_gpio_bank(gpio);
_set_gpio_dataout(bank, get_gpio_index(gpio), value);
return 0;
}
首先看get_gpio_bank(gpio)函数:
struct gpio_bank {
void *base;
int method;
};
static const struct gpio_bank gpio_bank_am33xx[4] = {
{ (void *)AM33XX_GPIO0_BASE, METHOD_GPIO_24XX },
{ (void *)AM33XX_GPIO1_BASE, METHOD_GPIO_24XX },
{ (void *)AM33XX_GPIO2_BASE, METHOD_GPIO_24XX },
{ (void *)AM33XX_GPIO3_BASE, METHOD_GPIO_24XX },
};
const struct gpio_bank *const omap_gpio_bank = gpio_bank_am33xx;
bank是IO区域,cpu的IO都是按组分类的, 比如am335有6组,分别为0组~5组,名为gpio0~, gpio5,每个IO组下有若干个IO,如gpio0下有32个IO
u-boot源码只是给出了4组IO的寄存器地址,一般足够
static inline const struct gpio_bank *get_gpio_bank(int gpio)
{
return &omap_gpio_bank[gpio >> 5];//gpio的[31:5]为bank号
}
static inline int get_gpio_index(int gpio)
{
return gpio & 0x1f;//gpio的第5位为bank中的IO偏移量
}
例子:将gpio0_7设置为低电平
首先配置gpio0_7为输出模式:
static struct module_pin_mux gpio0_7_pin_mux[] = {
{OFFSET(ecap0_in_pwm0_out), (MODE(7) | PULLUDEN)}, /* GPIO0_7 */
{-1},
};
configure_module_pin_mux(gpio0_7_pin_mux);
赋值:
#define GPIO0_7 (0<<5|7<<0)
gpio_set_value(GPIO0_7, 0);//Turn off buzzer, add by richard
#endif
阅读(1707) | 评论(0) | 转发(0) |