打印
[嵌入式Linux]

海思HI3518Ev200平台uboot设置GPIO默认输出

[复制链接]
3479|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 everbright 于 2018-7-14 21:13 编辑

最近由于项目需要,开始用海思的Hi3518ev200平台,做一个扫二维码的设备;产品要求刚加电时,一些IO口必须立即置为要求的电平状态,否则产品可能不正常。这就要求在刚进入uboot时就必须置为要求状态,如果等到内核启动了为时已晚。

从这个平台uboot的启动流程可知,它的初始化要从uboot源码目录下 board/hi3518ev200/board.c开始,所以从这个文件里设置好电平状态即可。

知道了从那启动,那么下面就着手写代码了。要设置一个GPIO口的输出,需要正确设置引脚复用状态,引脚输入输出状态,然后再置引脚电平就可以了,我们这里需要设置gpio7_6和gpio0_1为高电平输出,即输出1。下面记录下是怎么做的

阅读datasheet“Hi3518EV20X/Hi3516CV200经济型HD IP Camera Soc用户指南”,了解相应的寄存器:

一、找到引脚复用寄存器使命召唤,并找到要用到的gpio的对应寄存器

       二,找到GPIO 寄存器对应的基地址及功能寄存器

三、代码如下:


void gpio_muxctrl_config(unsigned long muxctrl_reg, unsigned int value)
{
unsigned long base;

        base        = IO_CONFIG_REG_BASE+muxctrl_reg;
        __raw_writel(value, base);  
}

void gpio_dir_config(unsigned long gpio_base, unsigned char gpio_offset, unsigned char flag)
{
int value;
unsigned long base;

        base        = gpio_base+GPIO_DIR;                //direction reg offset addr is 0x400
        value = __raw_readl(base);  
        if(flag)
        {
                value |= (1 << gpio_offset);
        }
        else
        {
                value &= ~(1 << gpio_offset);
        }
        __raw_writel(value, base);  
}
void gpio_output_set(unsigned long gpio_base, unsigned char gpio_offset, int value)
{
unsigned long base = gpio_base + (1 << (gpio_offset + 2));                /* PADDR[9:2]分别对应 GPIO_DATA[7:0]*/
unsigned long  l;  
unsigned long flags;  
  
    l = (__raw_readl(base) & (~(1 << gpio_offset))) | (!!value << gpio_offset);  
    __raw_writel(l, base);  

}

完整的代码

https://download.csdn.net/download/everbright6666/10541200


欢迎交流,qq:243691732 神仙哥哥

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:/**************个人信息***********/ //联系人:韩先生, //QQ:243691732 //手机:13933870954 /////////////

21

主题

107

帖子

3

粉丝