编辑语:
芯片开放社区(OCC)面向开发者推出RISC-V系列内容,通过多角度、全方位解读RISC-V,系统性梳理总结相关理论知识,构建RISC-V知识图谱,促进开发者对RISC-V生态全貌的了解。
上期【技术解码】,我们整体介绍了YoC基础软件平台,了解了YoC平台具有丰富的IoT组件。本期内容,我们将开启对YoC组件的介绍,带大家深入感受YoC基础软件平台的特性。本文将介绍YoC系统硬件底层抽象组件 —— CSI组件。
01 概述
CSI (Chip System Interface)是针对嵌入式系统,定义了CPU内核移植接口、外围设备操作接口、统一软件接口规范,消除不同芯片的差异,简化软件的使用及提高软件的移植性。通过CSI 接口规范,可以快速实现芯片对接到YoC 平台。CSI 的具体内容包括:
- CSI-CORE:定义了CPU和相关紧耦合外设的接口规范
- CSI-DRIVER:定义了常用的驱动的接口规范
- CSI-KERNEL:定义实时操作系统的接口规范
02 CSI组件使用
CSI有两个版本,目前CSI1.0逐步启用,推荐使用CSI2.0。
03 头文件包含
3.1 GCC -I 路径
-I csi2/include/
3.2 CSI-Core头文件包含
#include <csi_core.h>
3.3 CSI-Driver头文件包含
#include <drv/uart.h> #include <drv/timer.h>
3.4 CSI-Kernel头文件包含
#include <csi_kernel.h>
04 模块分述
4.1 CSI-Core
目前已针对RISCV、C-SKY架构做了接口的定义和实现。CSI-Core是驱动和RTOS程序的基础,CSI-Driver会基于CSI-Core的接口来定义外设寄存器描述和驱动实现。
4.2 CSI-Driver
- CSI-Driver是应用接口,是对硬件功能的抽象,不会暴露所有硬件细节。
- CSI-Driver具有统一的接口,不同硬件IP之间的差异会在这层做统一。
- 目前已规范了40+个模块的接口,包括IO类,加解密类,定时器类等。
4.2.1 统一的设备和中断管理
4.2.2 驱动程序的注册与注销
4.2.2.1 注册
注册函数负责驱动的初始化和硬件的基本初始化。一般的,CSI驱动注册函数形式为: csi_error_t csi__init(csi_xxx_t *xxx, uint32_t idx); 以uart为例,其驱动函数的注册接口如下:csi_error_t csi_uart_init(csi_uart_t *uart, uint32_t idx); 参数: uart:uart控制块 idx:uart设备号。如uart0,则idx = 0;返回值: 错误号:csi_error_t
4.2.2.2 注销
注销函数负责驱动的反初始化和硬件的反初始化 一般的,CSI驱动注销函数形式为:void csi__uninit(csi_xxx_t *xxx); 以uart为例,其驱动函数的注销接口如下:void csi_uart_uninit(csi_uart_t *uart); 参数: uart:uart控制块 返回值: 注销函数没有返回值
4.3 中断、回调和事件处理
- CSI驱动接管设备中断处理,CSI接口用户无法直接编写中断处理函数。
- 用户可以通过回调函数的方式来接收中断事件。
4.3.1 回调注册
CSI驱动提供回调注册注销函数:csi_xxx_attach(...) 和 csi_xxx_detach(...) 用户要接收中断事件,必须先注册回调函数。
4.4 同步异步处理
CSI-Driver接口设计区分同步处理和异步处理模式,轮询、中断、DMA功能分开处理。同步读写:通过轮询的方式 异步读写:通过中断或DMA的方式
4.4.1 轮询模式
- 不产生中断
- 不产生事件
4.4.2 中断模式
- 产生设备中断
- 产生事件
4.4.3 DMA模式
- 不产生设备中断,而产生DMA中断
- 产生的事件类型和中断模式一致
4.5 配置
- 原则上,驱动配置不存入设备句柄结构体
- 分多个接口配置设备的功能,同类功能的merge,
例:
csi_uart_baud(csi_uart_t *uart, uint32_t baud); csi_uart_format(csi_uart_t *uart, csi_uart_data_bits_t data_bit, csi_uart_parity_t parity, csi_uart_stop_bits_t stop_bit); csi_uart_flowctrl(csi_uart_t *uart, csi_uart_flowctrl_t flowctrl);
4.6 错误处理
所有驱动统一错误类型:
typedef enum { CSI_OK = 0, //成功 CSI_ERROR = -1, //错误 CSI_BUSY = -2, //忙碌 CSI_TIMEOUT = -3, //超时 CSI_UNSUPPORTED = -4 //不支持的操作 } csi_error_t;
4.7 打开与释放
打开与释放类接口,命名如下:open/close:打开和关闭设备 start/stop:开启和停止某个设备的功能 alloc/free:申请和释放资源
4.8 读写控制类操作
读写类操作接口,命名如下:read/write,适用于文件、句柄、管道、GPIO场景 返回值统一为读写成功的字节数。send/receive,适用于总线类场景
4.9 CSI-Kernel
统一RTOS Kernel的接口规范,例如对于mutex、semaphore等操作CSI-Kernel进行了统一的封装和规范。已支持Rhino、FreeRTOS、uCOS、ReWorks等RTOS。目前不推荐使用,请使用aos kernel接口。
4.10 CSI接口认证
CSI接口有一套规范认证case,用来验证芯片软件支持CSI接口的程度,并可以从很大程度上保证芯片软件的可靠性。适配完CSI接口软件后,需要经过该认证case的测试,才可被认为支持CSI接口。为降低工作量,认证case目前已经支持自动化运行,见下文详细介绍。
4.10.1 自动化测试框架
CSI 的自动化测试可以部署到jenkins持续集成服务器中,从开发人员/测试开发人员提交代码到生成最终的测试报告的整个流程可以实现自动化,中途无需人工参与干预。从触发到生成测试报告都是由自动化测试脚本完成的,其中jenkins服务器起到了触发任务和分发任务到测试PC的作用。整体流程如下图所示:
CSI自动化测试代码分为两大部分, 其中一部分使用python脚本编写,其运行在x86 PC机器上,负责管理测试case、 发送测试命令到下位机、收集测试日志, 并最终生成测试报告等。另外一部分为c语言编写,其运行在下位机上, 其负责接收上位机下发的AT测试命令,并根据测试命令调用相应的CSI接口进行测试。软件运行原理框图如下:
4.10.2 测试报告
测试完成后,会输出测试报告在test_tools/report目录下(html文件格式):
05 下期预告
以上是关于YoC平台CSI组件的全部介绍,下期内容我们将带大家了解YoC的AT组件,欢迎大家持续关注RISC-V系列内容。