RK 平台 Vendor Storage 开发指南:基础知识、流程与实用技巧

电子说

1.4w人已加入

描述

在瑞芯微(RK)平台的嵌入式开发中,vendor_storage 是一个核心模块,专门用于存储 SN(序列号)、MAC 地址、DRM 密钥等厂商专属数据。它不仅提供了跨环境的数据读写能力,还具备可靠性校验、掉电恢复等关键特性,是保障设备身份标识、功能授权等核心信息安全的重要组件。本文将从基础知识、开发流程、使用途径三方面,为开发者梳理完整的开发逻辑。

瑞芯微

一、核心基础知识:了解 Vendor Storage 是什么?

1. 核心定位与核心特性

Vendor Storage 的核心作用是集中管理厂商专属静态数据,这些数据通常需要在设备全生命周期中稳定存储,且支持多环境访问。其核心特性包括:

•多场景读写:支持 UBOOT、Kernel、Linux 应用层、PC 工具直接读写,覆盖设备启动到运行的全流程;

•数据可靠性:自带 Hash 校验、掉电恢复机制,避免数据损坏或丢失;

•灵活分配:数据按 64 字节整数倍分配(1-64 字节占 64 字节,65-128 字节占 128 字节,以此类推);

•唯一 ID 访问:每个数据项对应唯一 ID,通过 ID 精准读写,支持 SN、MAC、密钥等 16 种标准类型及自定义类型。

2. 存储架构与数据布局

Vendor Storage 支持 EMMC、SPI NOR、NAND 等主流存储介质,整体架构分为 “索引区 + 数据区 + 校验区” 三部分:

•索引区(64K):存储数据项的 ID、偏移量、大小、空闲空间等元信息,便于快速定位数据;

•数据区(按需分配):存储实际厂商数据,如 SN、WIFI MAC、LAN MAC、BT MAC 等,支持用户自定义数据项;

•校验区(8 字节):包含 4 字节 Hash 校验值和 4 字节版本号,确保数据完整性。

3. 关键 ID 定义(标准类型)

开发中需通过 ID 标识数据项,常用标准 ID 如下:

数据类型 对应 ID 名称 用途
序列号 VENDOR_SN_ID 设备唯一标识
有线网 MAC VENDOR_LAN_MAC_ID 局域网身份标识
无线网 MAC VENDOR_WIFI_MAC_ID WIFI 模块身份标识
蓝牙 MAC VENDOR_BT_MAC_ID 蓝牙模块身份标识
DRM 密钥 VENDOR_DRM_KEY_ID 数字版权保护授权
传感器校准数据 VENDOR_SENSOR_CALIBRATION_ID 传感器精度校准参数
自定义数据 VENDOR_CUSTOM_ID(含扩展) 用户自定义厂商数据

二、开发流程:从环境配置到功能实现

Vendor Storage 的开发流程围绕 “环境配置→接口调用→测试验证” 三步骤展开,覆盖 UBOOT、Kernel、应用层全场景。

1. 前期准备:环境配置与源码依赖

(1)源码路径

•UBOOT 层:

u-boot/board/rockchip/common/storage/storage.c

•Kernel 层:

kernel/drivers/soc/rockchip/rk_vendor_storage.c、sdmmc_vendor_storage.c

•应用层:基于 Kernel 提供的 IOCTL 节点或 PC 工具开发

(2)编译配置

•Kernel 层:通过 Menuconfig 启用驱动(路径:Drivers -> SOC -> Rockchip -> Vendor Storage);

•UBOOT 层:默认集成源码,需确保编译时勾选 “Vendor Storage Support”。

2. 核心开发:接口调用(分场景实现)

(1)UBOOT 层开发(设备启动阶段读写)

UBOOT 层主要用于设备启动时读取关键数据(如 MAC 地址),核心接口如下:

•初始化:int vendor_storage_init(void)

◦功能:初始化 Vendor Storage 模块

◦返回值:0 = 成功,非 0 = 失败

•读取数据:int vendor_storage_read(u32 id, void *pbuf, u32 size)

◦入参:id = 数据项 ID,pbuf = 接收数据的缓冲区,size = 期望读取字节数

◦返回值:非 - 1 = 实际读取字节数,-1 = 读取失败

•写入数据:int vendor_storage_write(u32 id, void *pbuf, u32 size)

◦入参:id = 数据项 ID,pbuf = 待写入数据缓冲区,size = 写入字节数

◦返回值:0 = 成功,非 0 = 失败

示例场景:UBOOT 阶段读取 SN 并打印

 

vendor_storage_init(); // 初始化char sn_buf[64];int ret = vendor_storage_read(VENDOR_SN_ID, sn_buf, 64); // 读取SNif (ret > 0) {    printf("Device SN: %sn", sn_buf);}

 

(2)Kernel 层开发(驱动级读写)

Kernel 层通过驱动接口提供 IOCTL 节点,供应用层调用,核心接口与 UBOOT 层类似:

•读取数据:int rk_vendor_read(u32 id, void *pbuf, u32 size)

•写入数据:int rk_vendor_write(u32 id, void *pbuf, u32 size)

•注意:Kernel 层无需手动初始化,驱动加载时自动完成初始化。

(3)Linux 应用层开发(用户态读写)

应用层通过打开/dev/vendor_storage设备节点,结合 IOCTL 实现读写,核心步骤:

1.打开设备节点:int sys_fd = open("/dev/vendor_storage", O_RDWR, 0);

2.构造读写请求(指定 ID、缓冲区、数据大小);

3.调用 IOCTL 接口完成读写;

4.关闭设备节点。

示例代码片段(读取 WIFI MAC):

 

int sys_fd = open("/dev/vendor_storage", O_RDWR, 0);if (sys_fd < 0) {    perror("open vendor_storage fail");    return -1;}struct rk_vendor_req req;req.tag = VENDOR_REQ_TAG;req.id = VENDOR_WIFI_MAC_ID;req.len = 6; // MAC地址占6字节int ret = ioctl(sys_fd, VENDOR_READ_IO, &req);if (ret >= 0) {    printf("WIFI MAC: %02x:%02x:%02x:%02x:%02x:%02xn",           req.data[0], req.data[1], req.data[2],           req.data[3], req.data[4], req.data[5]);}close(sys_fd);

 

3. 测试验证:工具与方法

(1)PC 工具测试(RKDevInfoWriteTool)

•兼容模式:选择“兼容模式”下面写号,在这种模式下面,可以选择”强制MASKROM”强制机器到maskrom下面写号,或者不选择“强制MASKROM”,那么机器需要先切换到loader模式写号(适用于在空片情况下使用);

•写后重启:写完后重启机器;

•适用场景:量产阶段批量写入 SN、MAC 等数据,或快速验证数据正确性。

瑞芯微

(2)命令行工具测试(vendor_storage 工具)

RK 提供专用命令行工具,支持 Linux 环境快速读写,常用命令示例:

•写入字符串到自定义 ID(ID=26):

vendor_storage -w VENDOR_CUSTOM_ID_1A -t string -i "test_storage"

•读取自定义 ID 数据到文件:

vendor_storage -r VENDOR_CUSTOM_ID_1A -t file -i /userdata/read.bin

•读取 SN 并以字符串显示:

vendor_storage -r VENDOR_SN_ID -t string

三、使用途径:不同场景下的应用选择

根据开发阶段和使用场景,可选择不同的访问途径,具体如下:

使用场景 推荐途径 优势
设备启动阶段(UBOOT) UBOOT 层 API 启动早、资源占用少,适合关键数据读取
驱动开发 / 内核态操作 Kernel 层 API 权限高、性能好,支持底层数据管理
应用层程序读写 Linux 应用层 IOCTL 接口 开发便捷,无需关注底层实现
量产批量写入 / 快速验证 PC 工具(ProvisioningTool) 可视化操作,支持批量处理
调试 / 命令行快速操作 vendor_storage 命令行工具 轻量化,适合 Linux 环境快速测试

四、开发注意事项

1.数据大小:严格遵循 64 字节整数倍分配规则,避免空间浪费;

2.数据可靠性:写入关键数据后建议读取校验,确保 Hash 验证通过;

3.ID 唯一性:自定义 ID 需避开标准 ID(0-255 中已定义的 16 种类型),避免冲突;

4.权限控制:应用层访问/dev/vendor_storage需 root 权限,可通过修改设备节点权限优化。

Vendor Storage 作为 RK 平台的核心厂商数据管理模块,其设计兼顾了可靠性、灵活性和多场景适配性。掌握本文梳理的基础知识、开发流程和使用途径,可快速实现 SN、MAC、密钥等数据的管理需求,适配从设备启动到量产交付的全流程开发场景。


审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分