海思HI3518核心中開啟UART2的方法
海思HI3518 SOC提供 了3個 UART(UniversalAsynchronous Receiver Transmitter非同步序列通訊介面)單元,主要功能是將來自外圍裝置的資料進行串並轉換之後傳入內部匯流排,以及將資料進行並串轉換之後輸出到外部裝置。UART的主要功能是和外部晶片的UART進行對接,從而實現兩晶片間的通訊。
海思提供的SDK中的核心預設開啟了uart0和uart1,uart0預設用於除錯使用,對應於裝置單板中的/dev/ttyAMA0。Uart1可用作通訊介面與外設進行資料接收和傳送,對應於單板中的/dev/ttyAMA1。然而要想使用uart2來作為序列通訊口,還需要修改核心,修改說明如下:
1、修改核心arch/arm/mach-hi3518/core.c,將對應位置修改為如下內容。
HIL_AMBA_DEVICE(uart0,"uart:0", UART0, NULL);
HIL_AMBA_DEVICE(uart1,"uart:1", UART1, NULL);
HIL_AMBA_DEVICE(uart2,"uart:2", UART2, NULL);
static struct amba_device *amba_devs[]__initdata = {
#if(CONFIG_HISILICON_KCONSOLE==1)
& HIL_AMBADEV_NAME(uart1),
& HIL_AMBADEV_NAME(uart0),
& HIL_AMBADEV_NAME(uart2),
#elif (CONFIG_HISILICON_KCONSOLE==2)
& HIL_AMBADEV_NAME(uart2),
& HIL_AMBADEV_NAME(uart0),
& HIL_AMBADEV_NAME(uart1),
#else
& HIL_AMBADEV_NAME(uart0),
& HIL_AMBADEV_NAME(uart1),
& HIL_AMBADEV_NAME(uart2),
#endif
}
2、lookups結構體中增加:
static struct clk_lookup lookups[] = {
{ /* UART2 */ //add
.dev_id = "uart:2",
.clk = &uart_clk,
},
}
3、修改 arm/mach-hi3518/include/mach/irqs.h中相關巨集為以下內容:
#define UART0_IRQ {HI3518_IRQ_START + 5, NO_IRQ }
#define UART1_IRQ { HI3518_IRQ_START +5, NO_IRQ }
#define UART2_IRQ { HI3518_IRQ_START + 25,NO_IRQ }
4、應用程式碼中需要設定一下 UART_RXD(GPIO7_6)、UART2_TXD(GPIO7_7)GPIO複用功能
himm 0x200F0108 0x1 //UART2_RXD
himm 0x200F010C 0x1 //UART2_TXD
5、單板的/etc/init.d/S00devs檔案中,新增以下內容:
mknod /dev/ttyAMA2 c 204 66
補充:
按照以上設定之後,在應用程式中,只需要根據實際需要,開啟uart2在單板上字元裝置結點,設定波特率,然後select監聽對應檔案描述符,read接收其它晶片發出的資料即可。
疑惑:
海思SDK中提供的使用者指南上有“通用非同步收發器”相關的驅動配置流程說明,但是根據文件上的流程實現了驅動,發現依舊不能使用UART2功能,而且與UART2相關的暫存器設定根本不生效,後面才採用修改核心的方法來解決問題。路過的朋友,有知道這個原因的,煩請不吝賜教,給我留言,謝謝!