3518e 開啟第三個串列埠uart2
阿新 • • 發佈:2019-02-10
因為工作需要,需要使用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
這個函式在那個地方,麻煩有了解的告訴一聲。
以上便是全部過程,如有錯誤,歡迎指教!