RISC-V生态全景解析(十一):YoC组件介绍系列一: CSI组件

简介: 编辑语:芯片开放社区(OCC)面向开发者推出RISC-V系列内容,通过多角度、全方位解读RISC-V,系统性梳理总结相关理论知识,构建RISC-V知识图谱,促进开发者对RISC-V生态全貌的了解。

编辑语:

芯片开放社区(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:定义实时操作系统的接口规范

截屏2021-11-22 下午7.56.16.png

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

  1. CSI-Driver是应用接口,是对硬件功能的抽象,不会暴露所有硬件细节。
  2. CSI-Driver具有统一的接口,不同硬件IP之间的差异会在这层做统一。
  3. 目前已规范了40+个模块的接口,包括IO类,加解密类,定时器类等。

4.2.1 统一的设备和中断管理

截屏2021-11-22 下午7.56.29.png

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 中断、回调和事件处理

  1. CSI驱动接管设备中断处理,CSI接口用户无法直接编写中断处理函数。
  2. 用户可以通过回调函数的方式来接收中断事件。

4.3.1 回调注册

CSI驱动提供回调注册注销函数:csi_xxx_attach(...) 和 csi_xxx_detach(...) 用户要接收中断事件,必须先注册回调函数。

截屏2021-11-22 下午7.56.38.png

4.4 同步异步处理

CSI-Driver接口设计区分同步处理和异步处理模式,轮询、中断、DMA功能分开处理。同步读写:通过轮询的方式 异步读写:通过中断或DMA的方式

4.4.1 轮询模式

  1. 不产生中断
  2. 不产生事件

4.4.2 中断模式

  1. 产生设备中断
  2. 产生事件

4.4.3 DMA模式

  1. 不产生设备中断,而产生DMA中断
  2. 产生的事件类型和中断模式一致

4.5 配置

  1. 原则上,驱动配置不存入设备句柄结构体
  2. 分多个接口配置设备的功能,同类功能的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的作用。整体流程如下图所示:

截屏2021-11-22 下午7.57.45.png

CSI自动化测试代码分为两大部分, 其中一部分使用python脚本编写,其运行在x86 PC机器上,负责管理测试case、 发送测试命令到下位机、收集测试日志, 并最终生成测试报告等。另外一部分为c语言编写,其运行在下位机上, 其负责接收上位机下发的AT测试命令,并根据测试命令调用相应的CSI接口进行测试。软件运行原理框图如下:

截屏2021-11-22 下午7.57.52.png

4.10.2 测试报告

测试完成后,会输出测试报告在test_tools/report目录下(html文件格式):

截屏2021-11-22 下午7.58.00.png

05 下期预告

以上是关于YoC平台CSI组件的全部介绍,下期内容我们将带大家了解YoC的AT组件,欢迎大家持续关注RISC-V系列内容。

相关文章
|
19天前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
98 2
|
2月前
|
负载均衡 5G 网络性能优化
深入解析LTE(长期演进技术)的基本架构及其关键组件
深入解析LTE(长期演进技术)的基本架构及其关键组件
258 2
|
3天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
8 1
|
13天前
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
55 2
|
14天前
|
机器学习/深度学习 编解码 算法
深入解析MaxFrame:关键技术组件及其对视频体验的影响
【10月更文挑战第12天】随着流媒体服务和高清视频内容的普及,用户对于视频质量的要求越来越高。为了满足这些需求,许多技术被开发出来以提升视频播放的质量。其中,MaxFrame是一种旨在通过一系列先进的图像处理算法来优化视频帧的技术。本文将深入探讨构成MaxFrame的核心组件,包括运动估计、超分辨率重建以及时间插值算法,并讨论这些技术如何协同工作以改善视频播放效果。
28 1
|
30天前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
34 6
|
2月前
|
存储 开发框架 数据可视化
深入解析Android应用开发中的四大核心组件
本文将探讨Android开发中的四大核心组件——Activity、Service、BroadcastReceiver和ContentProvider。我们将深入了解每个组件的定义、作用、使用方法及它们之间的交互方式,以帮助开发者更好地理解和应用这些组件,提升Android应用开发的能力和效率。
134 5
|
19天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
39 0
|
19天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
29 0
|
19天前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
33 0

推荐镜像

更多