在海思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