編輯語:
晶片開放社群(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系列内容。