1. 程式人生 > >hisi35xx串列埠驅動的完善

hisi35xx串列埠驅動的完善

鑑於hisi的uart3還沒有打通,ls /dev/ | grep ttyA* ,看到的只有ttyAMA0 和ttyAMA1,且使用應用程式開啟ttyAMA1裝置後,使用write函式,傳送,示波器觀察沒有波形輸出。

猜想是GPIO複用管腳沒開啟於是編寫了GPIO複用管腳驅動,載入驅動,ttyAMA1可以正常使用 。每次啟動程式都要載入此驅動,比較麻煩,所以想要在核心新增,搜尋UART,定位UART的位置,位於:arch/arm/mach-353xx/core.c。如下所示,添加了UART3,把從CPU的遮蔽掉。改為主CPU用。

HIL_AMBA_DEVICE(uart0, "uart:0",  UART0,    NULL);
HIL_AMBA_DEVICE(uart1, 
"uart:1", UART1, NULL); HIL_AMBA_DEVICE(uart3, "uart:3", UART3, NULL); // static struct amba_device *amba_devs[] __initdata = { &HIL_AMBADEV_NAME(uart0), &HIL_AMBADEV_NAME(uart1), &HIL_AMBADEV_NAME(uart3), // };
static struct clk_lookup lookups[] = {
    {
        
/* UART0 */ .dev_id = "uart:0", .clk = &uart_clk, }, { /* UART1 */ .dev_id = "uart:1", .clk = &uart_clk, }, //modify by lqh at { /* UART3 */ .dev_id = "uart:3", .clk = &uart_clk, }, {
/* SP804 timers */ .dev_id = "sp804", .clk = &sp804_clk, }, #ifdef CONFIG_HI3536_SYSCNT { /* syscnt timers */ .dev_id = "syscnt", .clk = &syscnt_clk, }, #endif };

這裡僅僅是配置UART外設,管腳卻是沒有配置,配置UART1和UART3管腳使之能用。

/* init UART1 and UART3 IO*/
    reg = readl((volatile void *)IO_ADDRESS(REG_UART1_RX_MUXCTRL));
    reg |= 0x01;
    writel(reg, (volatile void *)IO_ADDRESS(REG_UART1_RX_MUXCTRL));

    reg = readl((volatile void *)IO_ADDRESS(REG_UART1_TX_MUXCTRL));
    reg |= 0x01;
    writel(reg, (volatile void *)IO_ADDRESS(REG_UART1_TX_MUXCTRL));

    reg = readl((volatile void *)IO_ADDRESS(REG_UART3_RX_MUXCTRL));
    reg |= 0x01;
    writel(reg, (volatile void *)IO_ADDRESS(REG_UART3_RX_MUXCTRL));

    reg = readl((volatile void *)IO_ADDRESS(REG_UART3_TX_MUXCTRL));
    reg |= 0x01;
    writel(reg, (volatile void *)IO_ADDRESS(REG_UART3_TX_MUXCTRL));

​

REG_UART1_RX_MUXCTRL具體平臺的複用暫存器地址,看文件。

經過此配置uart1和uart3能工作了。 發現: 1、串列埠輸入什麼進去,該視窗就能輸出什麼!該功能是liunx的串列埠的會顯功能。可以通過應用程式遮蔽掉。
​options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG | NOFLSH|ECHOK|ECHONL);  /*遮蔽會顯功能*/

​2、設定超時功能

​options.c_cc[VTIME] = 0; /* 0s*/經過此設定串列埠即可工作。

3、設定接收幾個字元返回

options.c_cc[VMIN] = 1; /* define the minimum bytes data to be readed,*///只要串列埠收到一個字元都會讀取得到