hisi35xx串口驱动的完善

来源:互联网 发布:淘宝如何买二手东西 编辑:程序博客网 时间:2024/06/06 03:13

鉴于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);  /*屏蔽会显功能*/
设置超时功能
options.c_cc[VTIME] = 0; /* 0s*/经过此设置串口即可工作。


0 0
原创粉丝点击