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,*///只要串口收到一个字符都会读取得到


猜你喜欢

转载自www.cnblogs.com/liqinghan/p/10064103.html