在瑞芯微(RK)平臺(tái)的嵌入式開發(fā)中,vendor_storage是一個(gè)核心模塊,專門用于存儲(chǔ)SN(序列號(hào))、MAC地址、DRM密鑰等廠商專屬數(shù)據(jù)。它不僅提供了跨環(huán)境的數(shù)據(jù)讀寫能力,還具備可靠性校驗(yàn)、掉電恢復(fù)等關(guān)鍵特性,是保障設(shè)備身份標(biāo)識(shí)、功能授權(quán)等核心信息安全的重要組件。本文將從基礎(chǔ)知識(shí)、開發(fā)流程、使用途徑三方面,為開發(fā)者梳理完整的開發(fā)邏輯。

一、核心基礎(chǔ)知識(shí):了解Vendor Storage是什么?
1.核心定位與核心特性
Vendor Storage的核心作用是集中管理廠商專屬靜態(tài)數(shù)據(jù),這些數(shù)據(jù)通常需要在設(shè)備全生命周期中穩(wěn)定存儲(chǔ),且支持多環(huán)境訪問。其核心特性包括:
?多場(chǎng)景讀寫:支持UBOOT、Kernel、Linux應(yīng)用層、PC工具直接讀寫,覆蓋設(shè)備啟動(dòng)到運(yùn)行的全流程;
?數(shù)據(jù)可靠性:自帶Hash校驗(yàn)、掉電恢復(fù)機(jī)制,避免數(shù)據(jù)損壞或丟失;
?靈活分配:數(shù)據(jù)按64字節(jié)整數(shù)倍分配(1-64字節(jié)占64字節(jié),65-128字節(jié)占128字節(jié),以此類推);
?唯一ID訪問:每個(gè)數(shù)據(jù)項(xiàng)對(duì)應(yīng)唯一ID,通過ID精準(zhǔn)讀寫,支持SN、MAC、密鑰等16種標(biāo)準(zhǔn)類型及自定義類型。
2.存儲(chǔ)架構(gòu)與數(shù)據(jù)布局
Vendor Storage支持EMMC、SPI NOR、NAND等主流存儲(chǔ)介質(zhì),整體架構(gòu)分為“索引區(qū)+數(shù)據(jù)區(qū)+校驗(yàn)區(qū)”三部分:
?索引區(qū)(64K):存儲(chǔ)數(shù)據(jù)項(xiàng)的ID、偏移量、大小、空閑空間等元信息,便于快速定位數(shù)據(jù);
?數(shù)據(jù)區(qū)(按需分配):存儲(chǔ)實(shí)際廠商數(shù)據(jù),如SN、WIFI MAC、LAN MAC、BT MAC等,支持用戶自定義數(shù)據(jù)項(xiàng);
?校驗(yàn)區(qū)(8字節(jié)):包含4字節(jié)Hash校驗(yàn)值和4字節(jié)版本號(hào),確保數(shù)據(jù)完整性。
3.關(guān)鍵ID定義(標(biāo)準(zhǔn)類型)
開發(fā)中需通過ID標(biāo)識(shí)數(shù)據(jù)項(xiàng),常用標(biāo)準(zhǔn)ID如下:
| 數(shù)據(jù)類型 | 對(duì)應(yīng)ID名稱 | 用途 |
| 序列號(hào) | VENDOR_SN_ID | 設(shè)備唯一標(biāo)識(shí) |
| 有線網(wǎng)MAC | VENDOR_LAN_MAC_ID | 局域網(wǎng)身份標(biāo)識(shí) |
| 無線網(wǎng)MAC | VENDOR_WIFI_MAC_ID | WIFI模塊身份標(biāo)識(shí) |
| 藍(lán)牙MAC | VENDOR_BT_MAC_ID | 藍(lán)牙模塊身份標(biāo)識(shí) |
| DRM密鑰 | VENDOR_DRM_KEY_ID | 數(shù)字版權(quán)保護(hù)授權(quán) |
| 傳感器校準(zhǔn)數(shù)據(jù) | VENDOR_SENSOR_CALIBRATION_ID | 傳感器精度校準(zhǔn)參數(shù) |
| 自定義數(shù)據(jù) | VENDOR_CUSTOM_ID(含擴(kuò)展) | 用戶自定義廠商數(shù)據(jù) |
二、開發(fā)流程:從環(huán)境配置到功能實(shí)現(xiàn)
Vendor Storage的開發(fā)流程圍繞“環(huán)境配置→接口調(diào)用→測(cè)試驗(yàn)證”三步驟展開,覆蓋UBOOT、Kernel、應(yīng)用層全場(chǎng)景。
1.前期準(zhǔn)備:環(huán)境配置與源碼依賴
(1)源碼路徑
?UBOOT層:
u-boot/board/rockchip/common/storage/storage.c
?Kernel層:
kernel/drivers/soc/rockchip/rk_vendor_storage.c、sdmmc_vendor_storage.c
?應(yīng)用層:基于Kernel提供的IOCTL節(jié)點(diǎn)或PC工具開發(fā)
(2)編譯配置
?Kernel層:通過Menuconfig啟用驅(qū)動(dòng)(路徑:Drivers -> SOC -> Rockchip -> Vendor Storage);
?UBOOT層:默認(rèn)集成源碼,需確保編譯時(shí)勾選“Vendor Storage Support”。
2.核心開發(fā):接口調(diào)用(分場(chǎng)景實(shí)現(xiàn))
(1)UBOOT層開發(fā)(設(shè)備啟動(dòng)階段讀寫)
UBOOT層主要用于設(shè)備啟動(dòng)時(shí)讀取關(guān)鍵數(shù)據(jù)(如MAC地址),核心接口如下:
?初始化:int vendor_storage_init(void)
?功能:初始化Vendor Storage模塊
?返回值:0 =成功,非0 =失敗
?讀取數(shù)據(jù):int vendor_storage_read(u32 id, void *pbuf, u32 size)
?入?yún)ⅲ篿d =數(shù)據(jù)項(xiàng)ID,pbuf =接收數(shù)據(jù)的緩沖區(qū),size =期望讀取字節(jié)數(shù)
?返回值:非- 1 =實(shí)際讀取字節(jié)數(shù),-1 =讀取失敗
?寫入數(shù)據(jù):int vendor_storage_write(u32 id, void *pbuf, u32 size)
?入?yún)ⅲ篿d =數(shù)據(jù)項(xiàng)ID,pbuf =待寫入數(shù)據(jù)緩沖區(qū),size =寫入字節(jié)數(shù)
?返回值:0 =成功,非0 =失敗
示例場(chǎng)景: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層開發(fā)(驅(qū)動(dòng)級(jí)讀寫)
Kernel層通過驅(qū)動(dòng)接口提供IOCTL節(jié)點(diǎn),供應(yīng)用層調(diào)用,核心接口與UBOOT層類似:
?讀取數(shù)據(jù):int rk_vendor_read(u32 id, void *pbuf, u32 size)
?寫入數(shù)據(jù):int rk_vendor_write(u32 id, void *pbuf, u32 size)
?注意:Kernel層無需手動(dòng)初始化,驅(qū)動(dòng)加載時(shí)自動(dòng)完成初始化。
(3)Linux應(yīng)用層開發(fā)(用戶態(tài)讀寫)
應(yīng)用層通過打開/dev/vendor_storage設(shè)備節(jié)點(diǎn),結(jié)合IOCTL實(shí)現(xiàn)讀寫,核心步驟:
1.打開設(shè)備節(jié)點(diǎn):int sys_fd = open("/dev/vendor_storage", O_RDWR, 0);
2.構(gòu)造讀寫請(qǐng)求(指定ID、緩沖區(qū)、數(shù)據(jù)大小);
3.調(diào)用IOCTL接口完成讀寫;
4.關(guān)閉設(shè)備節(jié)點(diǎn)。
示例代碼片段(讀取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字節(jié)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.測(cè)試驗(yàn)證:工具與方法
(1)PC工具測(cè)試(RKDevInfoWriteTool)
?兼容模式:選擇“兼容模式”下面寫號(hào),在這種模式下面,可以選擇”強(qiáng)制MASKROM”強(qiáng)制機(jī)器到maskrom下面寫號(hào),或者不選擇“強(qiáng)制MASKROM”,那么機(jī)器需要先切換到loader模式寫號(hào)(適用于在空片情況下使用);
?寫后重啟:寫完后重啟機(jī)器;
?適用場(chǎng)景:量產(chǎn)階段批量寫入SN、MAC等數(shù)據(jù),或快速驗(yàn)證數(shù)據(jù)正確性。

(2)命令行工具測(cè)試(vendor_storage工具)
RK提供專用命令行工具,支持Linux環(huán)境快速讀寫,常用命令示例:
?寫入字符串到自定義ID(ID=26):
vendor_storage -w VENDOR_CUSTOM_ID_1A -t string -i "test_storage"
?讀取自定義ID數(shù)據(jù)到文件:
vendor_storage -r VENDOR_CUSTOM_ID_1A -t file -i /userdata/read.bin
?讀取SN并以字符串顯示:
vendor_storage -r VENDOR_SN_ID -t string
三、使用途徑:不同場(chǎng)景下的應(yīng)用選擇
根據(jù)開發(fā)階段和使用場(chǎng)景,可選擇不同的訪問途徑,具體如下:
| 使用場(chǎng)景 | 推薦途徑 | 優(yōu)勢(shì) |
| 設(shè)備啟動(dòng)階段(UBOOT) | UBOOT層API | 啟動(dòng)早、資源占用少,適合關(guān)鍵數(shù)據(jù)讀取 |
| 驅(qū)動(dòng)開發(fā)/內(nèi)核態(tài)操作 | Kernel層API | 權(quán)限高、性能好,支持底層數(shù)據(jù)管理 |
| 應(yīng)用層程序讀寫 | Linux應(yīng)用層IOCTL接口 | 開發(fā)便捷,無需關(guān)注底層實(shí)現(xiàn) |
| 量產(chǎn)批量寫入/快速驗(yàn)證 | PC工具(ProvisioningTool) | 可視化操作,支持批量處理 |
| 調(diào)試/命令行快速操作 | vendor_storage命令行工具 | 輕量化,適合Linux環(huán)境快速測(cè)試 |
四、開發(fā)注意事項(xiàng)
1.數(shù)據(jù)大小:嚴(yán)格遵循64字節(jié)整數(shù)倍分配規(guī)則,避免空間浪費(fèi);
2.數(shù)據(jù)可靠性:寫入關(guān)鍵數(shù)據(jù)后建議讀取校驗(yàn),確保Hash驗(yàn)證通過;
3.ID唯一性:自定義ID需避開標(biāo)準(zhǔn)ID(0-255中已定義的16種類型),避免沖突;
4.權(quán)限控制:應(yīng)用層訪問/dev/vendor_storage需root權(quán)限,可通過修改設(shè)備節(jié)點(diǎn)權(quán)限優(yōu)化。
Vendor Storage作為RK平臺(tái)的核心廠商數(shù)據(jù)管理模塊,其設(shè)計(jì)兼顧了可靠性、靈活性和多場(chǎng)景適配性。掌握本文梳理的基礎(chǔ)知識(shí)、開發(fā)流程和使用途徑,可快速實(shí)現(xiàn)SN、MAC、密鑰等數(shù)據(jù)的管理需求,適配從設(shè)備啟動(dòng)到量產(chǎn)交付的全流程開發(fā)場(chǎng)景。
審核編輯 黃宇
-
瑞芯微
+關(guān)注
關(guān)注
27文章
801瀏覽量
54502
發(fā)布評(píng)論請(qǐng)先 登錄
瑞芯微RK3506 Flexbus技術(shù)開發(fā)指南,從原理、內(nèi)核配置到測(cè)試的完整攻略
RK3562 單板機(jī)圖形用戶界面開發(fā)完全手冊(cè):Qt Creator 配置與 LVGL 案例詳解(二)
RK3562 單板機(jī)圖形用戶界面開發(fā)完全手冊(cè):Qt Creator 配置與 LVGL 案例詳解(一)
RK3562 單板機(jī) Linux 應(yīng)用開發(fā)實(shí)戰(zhàn)手冊(cè):LED/CAN/TCP/UART 案例與 Python 開發(fā)(二)
RK3562 單板機(jī) Linux-RT 系統(tǒng)開發(fā)指南:內(nèi)核配置、實(shí)時(shí)性優(yōu)化與案例詳解
一文吃透RK平臺(tái)OTA升級(jí)開發(fā):從邏輯到調(diào)試的完整指南
RK平臺(tái)UART開發(fā)!從驅(qū)動(dòng)配置到測(cè)試全流程
從eMMC到SPI+SSD:雙存儲(chǔ)方案下Vendor Storage適配指南
RK?平臺(tái)?SPI?開發(fā)完全指南(驅(qū)動(dòng)?+?配置?+?測(cè)試?+?優(yōu)化)
C#上位機(jī)實(shí)戰(zhàn)開發(fā)指南
避坑指南!RK3568開發(fā)板選型,這5點(diǎn)沒看清千萬別下手!(附迅為驅(qū)動(dòng)開發(fā)指南資源)
中微愛芯AiP8F35XX系列觸摸芯片開發(fā)指南
中微愛芯AiP8F32XX系列芯片開發(fā)指南
RK?平臺(tái)?Vendor Storage?開發(fā)指南:基礎(chǔ)知識(shí)、流程與實(shí)用技巧
評(píng)論