3518e 开启第三个串口uart2

因为工作需要,需要使用3518e的uart2,但是海思内核默认只开启了uart0和uart1,因此需要自己手动开启uart2,因此网上查了一些资料,打开uart2。

参考资料1 http://www.ebaina.com/bbs/thread-5111-1-1.html

参考资料2http://www.lai18.com/content/1938833.html

参考资料3http://blog.csdn.net/olei_oleitao/article/details/7383592

具体过程如下:

1、修改内核arch/arm/mach-hi3518/core.c

1.第一个修改的地方
HIL_AMBA_DEVICE(uart0, "uart:0",  UART0,    NULL);
HIL_AMBA_DEVICE(uart1, "uart:1",  UART1,    NULL);
HIL_AMBA_DEVICE(uart2, "uart:2",  UART2,    NULL);

2.第二个修改的地方

static struct amba_device *amba_devs[] __initdata = {
    &HIL_AMBADEV_NAME(uart0),
    &HIL_AMBADEV_NAME(uart1),
    &HIL_AMBADEV_NAME(uart2),
};

3.第三个修改的地方

static struct clk_lookup lookups[] = {
    {       /* UART0 */
        .dev_id         = "uart:0",
        .clk            = &uart_clk,
    },
    {       /* UART1 */
        .dev_id         = "uart:1",
        .clk            = &uart_clk,
    },
    {       /* UART2 */
        .dev_id         = "uart:2",
        .clk            = &uart_clk,
    },
};

2.关于uart2的引脚,如下图所示
这里写图片描述

也就是说,uart2的两个引脚复用了,因此需要将其复用为uart功能,而不是普通的GPIO,

通过查询海思的sdk得知,其对应的寄存器地址为

uart2_RXD  ---->  0x200f0108
uart2_TXD  ---->  0x200f010C

因此,在编写应用程序代码时,需要在对串口进行初始化时,采取以下方式对其进行复用功能控制:

system("himm 0x200F0108 0x1");
system("himm 0x200F010c 0x1");

或者

system("devmem 0x200f0108 32 0x00000001");
system("devmem 0x200f010c 32 0x00000001");

或者

在目录 /ko/lowpower.sh中,有这样一句话
#UART2管脚复用成gpio
himm 0x200f0108 0x0
himm 0x200f010c 0x0

将其改为
himm 0x200f0108 0x1
himm 0x200f010c 0x1
即可

至此,完成,并且uart2能够正常收发数据。

但是,在参考资料3中
参考资料3http://blog.csdn.net/olei_oleitao/article/details/7383592

里面有这样一句话

最后在hisilicon_init_machine函数后面增加对这4个管脚复用设置为串口使用;
 writew(1, IO_ADDRESS(REG_BASE_IO));
 writew(1, IO_ADDRESS(REG_BASE_IO+0x0004));
 writew(1, IO_ADDRESS(REG_BASE_IO+0x0028));
 writew(1, IO_ADDRESS(REG_BASE_IO+0x002C));
然后编译内核重新下载内核 查看dev目录下有了ttyAMA2 和ttyAMA3
然后用串口测试工具测试OK!

一直没有找到hisilicon_init_machine这个函数在那个地方,麻烦有了解的告诉一声。

以上便是全部过程,如有错误,欢迎指教!

你可能感兴趣的:(uart2)