1. 程式人生 > >3518e 開啟第三個串列埠uart2

3518e 開啟第三個串列埠uart2

因為工作需要,需要使用3518e的uart2,但是海思核心預設只開啟了uart0和uart1,因此需要自己手動開啟uart2,因此網上查了一些資料,開啟uart2。

具體過程如下:

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能夠正常收發資料。

裡面有這樣一句話

最後在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這個函式在那個地方,麻煩有了解的告訴一聲。

以上便是全部過程,如有錯誤,歡迎指教!