RISCV_UART使用参考
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 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