在瑞芯微(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文章
792瀏覽量
54274
發布評論請先 登錄
RK3562 單板機圖形用戶界面開發完全手冊:Qt Creator 配置與 LVGL 案例詳解(二)
RK3562 單板機圖形用戶界面開發完全手冊:Qt Creator 配置與 LVGL 案例詳解(一)
RK3562 單板機 Linux 應用開發實戰手冊:LED/CAN/TCP/UART 案例與 Python 開發(二)
RK3562 單板機 Linux-RT 系統開發指南:內核配置、實時性優化與案例詳解
一文吃透RK平臺OTA升級開發:從邏輯到調試的完整指南
RK?平臺?SPI?開發完全指南(驅動?+?配置?+?測試?+?優化)
ArkUI-X在Android平臺動態化開發指南
【北京迅為】iTOP-RK3568開發板OpenHarmony系統南向驅動開發-第4章 UART基礎知識
RK?平臺?Vendor Storage?開發指南:基礎知識、流程與實用技巧
評論