RISCV_UART使用参考


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 02/17/2022

    1. 概述

    1.1. UART简介

    本文讲述Sigmastar UART驱动在riscv下的使用方法,当前平台总共有6组带 URDMA的UART。

    2. RISCV代码及配置

    2.1. SYSDESC节点

    UART对应的别名和sysdesc节点如下所示,别名可以让我们更方便访问节点。

    1. <fuart>
    2.     [reg_u32] 0x2220400, 0x2220600;
    3.     [interrupts_u32] INT_IRQ_FUART, INT_IRQ_URDMA, INT_IRQ_FUART0_EMPTY;
    4.     [camclk_u6] CAMCLK_fuart;
    5.     [dma_u8] 1;
    6.     [sctp_enable_u8] 0;
    7.     [rx_fifo_level_u8] 0;
    8.     [tx_fifo_level_u8] 0;
    9.     [digmux_u8] 0xFF;
    10.     [status_u8] 1;
    11.
    12. <pm_uart>
    13.     [reg_u32] 0x2006A00;
    14.     [interrupts_u32] INT_IRQ_PM_UART;
    15.     [camclk_u6] CAMCLK_pm_uart;
    16.     [rx_pin_u8] PAD_PM_GPIO0;
    17.     [status_u8] 1;
    

    2.2. 节点属性含义

    SYSDESC节点各属性含义如下表所示,其中sctp_enable为fuart独有的属性,pm_uart不支持dma属性。

    属性值 描述 备注
    Reg_u32 用于指定UART(和URDMA)所在的Bank及范围 不需要修改
    Interrupts_u32 指定UART(和URDMA)的中断及触发方式 不需要修改
    Camclk_u16 指定UART的时钟源 不需要修改
    Sctp_enable_u8 使能FUART的硬件流控 需要时写为1
    Dma_u8 使能FUART的DMA功能 需要时写为1
    Digmux_u8 选择rx tx pin接到哪一组digmux,每一组uart都会默认接到对应的digmux上,若无特殊需求,不需要设置该属性;0xFF代表驱动不会对该uart默认digmux做修改 根据需要修改,若无特殊需求,建议删除该属性
    rx_fifo_level_u8 选择uart rx fifo的等级,影响为接收到多少字节触发一次中断,超时也会触发中断,当前fifo深度为32byte;
    "0" - 1 character in the FIFO;
    "1" - FIFO ¼ full;
    "2" - FIFO ½ full;
    "3" - FIFO 2 less than full
    根据需要修改,若无特殊需求可删除该属性,驱动默认初值为0;仅在dma属性设置为0时有效
    tx_fifo_level_u8 选择uart tx fifo的等级,影响为txfifo剩余多少字节触发一次中断,超时也会触发中断,当前fifo深度为32byte;
    "0" - FIFO empty;
    "1" - 2 characters in the FIFO;
    "2" - FIFO ¼ full;
    "3" - FIFO ½ full;
    根据需要修改,若无特殊需求可删除该属性,驱动默认初值为0;仅在dma属性设置为0时有效
    Status_u8 选择是否使能UART驱动 根据需要修改

    2.3. RISCV CONFIG

    CONFIG_UART_SUPPORT=TRUE

    TRUE:打开驱动;FALSE:关闭驱动。

    2.4. PADMUX设置

    修改pioneer5-default.sys 配置文件:

    3. API及demo

    3.1. public file

    sc/driver/sysdriver/uart/drv/pub/drv_uart.h

    3.2. API

    uart_handle drv_uart_fifo_init(char *name);

    void drv_uart_fifo_deinit(uart_handle handle);

    void drv_uart_fifo_write(uart_handle handle, u8 *buf, u32 len);

    s32 drv_uart_fifo_read(uart_handle handle, u8 *buf, u32 len);

    上面4个API为console使用,无需关注;

    uart_handle drv_uart_open(char *name);

    • 功能

      用于打开uart设备,当中会进行初始化操作

    • 参数

      参数 设备
      name uart设备名
      uart1: uart1
      uart2: uart2
      uart3: uart3
      uart4: uart4
      fuart: fuart
    • 返回值

      成功返回控制句柄,表明初始化成功;失败返回NULL。

    void drv_uart_close(uart_handle handle);

    • 功能

      关闭open的uart

    • 参数

      参数 说明
      handle open成功返回的句柄
    • 返回值

    s32 drv_uart_ioctrl(uart_handle handle, u32 cmd, void *arg);

    • 功能

      uart通讯协议设定

    • 参数

      参数 说明
      handleu art句柄,open成功获得
      cmd 命令,设定协议使用 UART_CMD_CONFIG
      arg 协议内容

      arg参数结构体原型如下:

      typedef struct
      {
          u8             bit_length;       ///< length in number of bits
          u8             parity;           ///< parity
          u8             stop;             ///< stop bit
          u8             rtscts;
          u32            rate;             ///< bit rate
      } uart_cfg;
      
    • 返回值

      说明
      0 成功
      -1 失败

    s32 drv_uart_write(uart_handle handle, u8 *buf, u32 len, s32 timeout_ms);

    • 功能

      uart send

    • 参数

      参数 说明
      handle uart句柄,open成功获得
      buf 发送数据缓存
      len 发送字节数
      timeout_ms 阻塞等待时长
      = 0: 非阻塞
      < 0: 阻塞直到完成
      > 0: 阻塞设定时长
    • 返回值

      返回值 说明
      0 uart未使能
      -1 错误句柄
      >0 完成的字节数

    s32 drv_uart_read(uart_handle handle, u8 *buf, u32 len, s32 timeout_ms);

    • 功能

      uart read

    • 参数

      参数 说明
      handle uart句柄,open成功获得
      buf 接收数据缓存
      len 接收字节数
      timeout_ms 阻塞等待时长
      = 0: 非阻塞
      < 0: 阻塞直到完成
      > 0: 阻塞设定时长
    • 返回值

      返回值 说明
      0 uart未使能
      -1 错误句柄
      >0 完成的字节数

    3.3. RISCV uart demo

    参考 sc/driver/sysdriver/uart/drv/src/drv_uart_test.c