在海思3516A平台,默认是开启了串口0和串口1的驱动,在/dev下面可以看见他们的节点: "/dev/ttyAMA0"和"/dev/ttyAMA1",但是并没有串口2和串口3的节点,打开内核的menuconfig界面,也找不到打开串口2和串口3的配置,这就意味这3516对串口2和串口3并没有驱动支持,需要自己动手了。

3516A的串口驱动的实现在 "osdrv\opensource\kernel\linux-3.4.y\arch\arm\mach-hi3516a\core.c",可以看到里面只有串口0和串口1的定义。增加串口2和串口3步骤如下:

1、增加定义:

HIL_AMBA_DEVICE(uart2, "uart:2",  UART2,    NULL);
HIL_AMBA_DEVICE(uart3, "uart:3",  UART3,    NULL);

2、在结构里增加device:

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

3、增加clock:

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,
}, { /* UART3 */
.dev_id = "uart:3",
.clk = &uart_clk,
},{ /* SP804 timers */
.dev_id = "sp804",
.clk = &sp804_clk,
},
};

4、编译内核

 make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux-clean

makeARCH=arm CROSS_COMPILE=arm-hisiv300-linux- uImage

5、使用HiTool烧写内核。烧录完成,就可以在板子的/dev下面看见他们的节点了:"/dev/ttyAMA2"、"/dev/ttyAMA3"


另外,由于串口3是和串口1的rts复用,还可以gpio复用,因此使用串口3时要设置复用:

himm 0x200f0078 0x02     //uart3rx

himm 0x200f0080 0x02     //uart3tx

当然,串口1和2也是要设置的:

himm 0x200f007c 0x01    //uart1rx

himm 0x200f0084 0x01     //uart1tx


himm 0x200f0088 0x01     //uart2rx

himm 0x200f008c 0x01     //uart2tx