在瑞芯微(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();// 初始化charsn_buf[64];intret =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):
intsys_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、密钥等数据的管理需求,适配从设备启动到量产交付的全流程开发场景。
审核编辑 黄宇
-
瑞芯微
+关注
关注
27文章
699浏览量
53451
发布评论请先 登录
【北京迅为】iTOP-RK3568开发板OpenHarmony系统南向驱动开发-第4章 UART基础知识

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