本帖最后由 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 神仙哥哥
|