海思HI3518内核中开启UART2的方法

来源:互联网 发布:网络市场具体有哪些 编辑:程序博客网 时间:2024/04/29 05:44

海思HI3518 SOC提供 了3 UARTUniversalAsynchronous Receiver Transmitter异步串行通信接口)单元,主要功能是将来自外围设备的数据进行串并转换之后传入内部总线,以及将数据进行并串转换之后输出到外部设备。UART的主要功能是和外部芯片的UART进行对接,从而实现两芯片间的通信。

海思提供的SDK中的内核默认开启了uart0uart1uart0默认用于调试使用,对应于设备单板中的/dev/ttyAMA0Uart1可用作通信接口与外设进行数据接收和发送,对应于单板中的/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相关的寄存器设置根本不生效,后面才采用修改内核的方法来解决问题。路过的朋友,有知道这个原因的,烦请不吝赐教,给我留言,谢谢!


0 0
原创粉丝点击