Chinaunix首页 | 论坛 | 博客
  • 博客访问: 467337
  • 博文数量: 100
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 955
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-21 09:30
文章分类

全部博文(100)

文章存档

2017年(1)

2016年(16)

2015年(83)

我的朋友

分类: 嵌入式

2015-07-06 18:40:15

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

阅读(1661) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~