Rockchip · AI & Linux Hub

Speicher und Netzwerk

Rockchip Vendor Storage V1.3.0: Datenlayouts, IDs und U-Boot/Linux/Android-APIs

Rockchip Vendor Storage V1.3.0: Datenlayouts, IDs und U-Boot/Linux/Android-APIs — RK-KF-YF-C35, kernel 4.19/5.10/6.1, GKI, SN, MAC.

· ArmSoM Editorial · Rockchip source documentation · 13 Min. Lesezeit

Dieser Artikel bewahrt den vollständigen technischen Inhalt von RK-KF-YF-C35 V1.3.0, englisches PDF, Seiten 5–18. Es liegt nur das englische Original vor; Chinesisch, Russisch und Deutsch sind vollständige Übersetzungen. Alle vier Sprachen verwenden englische Originalbilder. Dies ist nicht die ältere Rev.08 aus Artikel 097: Layouts, IDs und GKI-/Android-Schnittstellen unterscheiden sich. Die Quelle nennt RockChip-Kernel 4.19, 5.10 und 6.1, aber keine konkreten ArmSoM-Platinen oder SDK/BSP-Versionen. Dies ist eine Plattformreferenz, keine universelle Freigabe: SoC, Speicherbackend, reservierte Bereiche, Kernel-ABI/Modulkonfiguration, Android-Zweig und SDK/BSP prüfen. Es erfolgten keine Hardware-Lese-/Schreib- oder Stromausfalltests.

Sicherheit und Quellenunklarheiten: Das Beispiel überschreibt ID 1 (SN) mit Bytewerten 0–31. Nicht auf Produktionsgeräten ausführen; Identitäts-/Provisionierungsdaten zuerst sichern. ID 1063 trägt eine Super-Resolution-Funktionsbezeichnung, aber eine MEMC-Beschreibung. ID 76 heißt „Offline key reserved field“, obwohl 1076 darauf zurückverweist. Beides bleibt ohne Vermutungen erhalten. ID 61 kombiniert Super-Resolution-Reserve und HDCP2.x RKIV. Die ID-Zuordnung aus Artikel 097/099 nicht übernehmen. Der GKI-Modulsatz ist grammatisch unklar; Bau und Laden von ram_vendor_storage.ko anhand des BSP prüfen. Quellschreibweisen, Typen und unvollständige Fehler-/Aufräumdefinitionen bleiben im Code erhalten.

ArmSoM Docs · Rockchip Linux kernel · EDITORIAL-NOTES

1. Übersicht der Anwendungshinweise

Vendor Storage speichert SN, MAC und weitere Herstellerdaten. Funktionen:

  • Zugriff über eindeutige ID.
  • Zuverlässige Datenvalidierung.
  • Wiederherstellung nach Stromausfall.
  • Lesen und Schreiben vom PC.
  • Lesen und Schreiben aus UBOOT.
  • Lesen und Schreiben aus dem Kernel.
  • Lesen und Schreiben aus Linux-Anwendungen.

2. Vendor-Storage-Architektur

2. Vendor-Storage-Architektur: englisches Original, Seite 5

2. Vendor-Storage-Architektur: englisches Original, Seite 5

3. Datenlayout

3.1 SPI-NOR-Datenlayout

3.1 SPI-NOR-Datenlayout: englisches Original, Seite 6

3.1 SPI-NOR-Datenlayout: englisches Original, Seite 6

3.2 Raw-NAND- und SPI-NAND-Datenlayout

3.2 Raw-NAND- und SPI-NAND-Datenlayout: englisches Original, Seite 6

3.2 Raw-NAND- und SPI-NAND-Datenlayout: englisches Original, Seite 6

3.3 EMMC-Datenlayout

3.3 EMMC-Datenlayout: englisches Original, Seite 7

3.3 EMMC-Datenlayout: englisches Original, Seite 7

3.4 Datenstruktur

3.4 Datenstruktur: englisches Original, Seite 7

3.4 Datenstruktur: englisches Original, Seite 7

Offset (B) Größe (B) Name
0x0000 0x0004 Tag, Wert 0x524B5644.
0x0004 0x0004 Version, nach Schreibzugriff erhöht
0x0008 0x0002 Nächster Index
0x000A 0x0002 Gesamtzahl der Elemente
0x000C 0x0002 Offset des freien Bereichs
0x000E 0x0002 Größe des freien Bereichs
0x0010 0x0002 Item0->id
0x0012 0x0002 Item0->offset
0x0014 0x0002 Item0->size
0x0016 0x0002 Item0->flag(reversed)
0x0018 0x0008 Item1
… … Item x
— — Daten
Size – 0x08 0x0004 Hash
Size – 0x04 0x0004 Version2, Wert identisch mit Version

3.5 ID-Definitionen

ID Funktion Beschreibung
1 SN Seriennummer
2 WIFI MAC WIFI-MAC-Adresse
3 LAN MAC Ethernet-MAC-Adresse
4 BT MAC Bluetooth-MAC-Adresse
5 HDMITX HDCP1.4 KEY HDMITX HDCP1.4 KEY
6 DP HDCP1.4 KEY DP HDCP1.4 KEY
7 HDCP_2X_ID  
8 DRM_KEY_ID  
9 PLAYREADY_CERT_ID  
10 ATTENTION_KEY_ID  
11 PLAYREADY_ROOT_KEY_0_ID  
12 PLAYREADY_ROOT_KEY_1_ID  
13 HDMIRX HDCP1.4 KEY HDMIRX HDCP1.4 KEY
14 SENSOR_CALIBRATION_ID  
15 IMEI_ID  
16 LAN_RGMII_DL_ID  
17 EINK_VCOM_ID VCOM-Spannung des E-Ink-Bildschirms
18    
19    
20 HDMIRX HDCP2.3 KEY HDMIRX HDCP2.3 KEY
…    
60 sr Speichert den Online-Autorisierungsschlüssel für Super-Resolution; zugehörige Offline-Schlüsselposition +1000, also 1060.
61 Super-Resolution reserviertes Algorithmusfeld / HDCP2.x RKIV Reserviertes Super-Resolution-Algorithmusfeld, entsprechend Offline-Reserve 1061. RKIV ist ein 16-Byte-Verschlüsselungsschlüssel für HDMI2.x-Firmware als zusätzlicher Schutz. Laut Quelle verwenden einige Kunden von 3528 und 356x dieses zusätzliche Verfahren.
ID Funktion Beschreibung
62 memc Speichert den Online-Autorisierungsschlüssel für MEMC; zugehörige Offline-Schlüsselposition +1000, also 1062.
63 MEMC reserviertes Algorithmusfeld Reserviertes Algorithmusfeld für MEMC, entsprechend Offline-Reserve 1063.
64 pq Speichert den Online-Autorisierungsschlüssel für PQ; zugehörige Offline-Schlüsselposition +1000, also 1064.
65 PQ reserviertes Algorithmusfeld Reserviertes Algorithmusfeld für PQ, entsprechend Offline-Reserve 1065.
66 RKP reserviertes Feld Von RKP CSR verwendet: Seriennummer beim Erzeugen des CSR
67 RKP reserviertes Feld Von RKP CSR verwendet: Inhalt des erzeugten CSR
68 multi-module Speichert den Online-Autorisierungsschlüssel für multi-module; zugehörige Offline-Schlüsselposition +1000, also 1068.
69 multi-module reserviertes Feld Reserviertes Algorithmusfeld für multi-module, entsprechend Offline-Reserve 1069.
70 touch_read Speichert den Online-Autorisierungsschlüssel für Touch-Read; zugehörige Offline-Schlüsselposition +1000, also 1070.
71 touch_read reserviertes Algorithmusfeld Reserviertes Algorithmusfeld für Touch-Read, entsprechend Offline-Reserve 1071.
72 rknpu_ocr Speichert den Online-Autorisierungsschlüssel für OCR-Algorithmus; zugehörige Offline-Schlüsselposition +1000, also 1072.
73 rknpu_ocr reserviertes Algorithmusfeld Reserviertes Algorithmusfeld für OCR-Algorithmus, entsprechend Offline-Reserve 1073.
74 face Speichert den Online-Autorisierungsschlüssel für Gesichtsentsperrung; zugehörige Offline-Schlüsselposition +1000, also 1074.
75 Gesichtsentsperrung reserviertes Algorithmusfeld Reserviertes Algorithmusfeld für Gesichtsentsperrung, entsprechend Offline-Reserve 1075.
76 knowledge Reserviertes Offline-Schlüsselfeld
77 knowledge reserviertes Algorithmusfeld Reserviertes Algorithmusfeld für Knowledge, entsprechend Offline-Reserve 1077.
…    
84 asr Speichert den Online-Autorisierungsschlüssel für ASR-Sprache-zu-Text-Algorithmus; zugehörige Offline-Schlüsselposition +1000, also 1084.
ID Funktion Beschreibung
85 asr reserviertes Algorithmusfeld Reserviertes Algorithmusfeld für ASR-Sprache-zu-Text-Algorithmus, entsprechend Offline-Reserve 1085.
86 llm Speichert den Online-Autorisierungsschlüssel für LLM-Übersetzung; zugehörige Offline-Schlüsselposition +1000, also 1086.
87 llm reserviertes Algorithmusfeld Reserviertes Algorithmusfeld für LLM-Übersetzung, entsprechend Offline-Reserve 1087.
88 tts Speichert den Online-Autorisierungsschlüssel für TTS-Text-zu-Sprache-Algorithmus; zugehörige Offline-Schlüsselposition +1000, also 1088.
89 tts reserviertes Algorithmusfeld Reserviertes Algorithmusfeld für TTS-Text-zu-Sprache-Algorithmus, entsprechend Offline-Reserve 1089.
…    
96 aieraser Speichert den Online-Autorisierungsschlüssel für AI-Eraser-Algorithmus; zugehörige Offline-Schlüsselposition +1000, also 1096.
97 aieraser reserviertes Algorithmusfeld Reserviertes Algorithmusfeld für AI-Eraser-Algorithmus, entsprechend Offline-Reserve 1097.
…    
156 Kundenreserve Für Kunden reserviert, nicht für RK-interne Nutzung
… Kundenreserve Für Kunden reserviert, nicht für RK-interne Nutzung
256 Kundenreserve Für Kunden reserviert, nicht für RK-interne Nutzung
1060 Super-Resolution Offline-Schlüsselposition Offline-Schlüsselposition für Super-Resolution; minus 1000 ergibt Online-Schlüsselposition 60.
1061 Super-Resolution reserviertes Offline-Schlüsselfeld Reserviertes Offline-Schlüsselfeld für Super-Resolution
1062 MEMC Offline-Schlüsselposition Offline-Schlüsselposition für MEMC; minus 1000 ergibt Online-Schlüsselposition 62.
1063 Super-Resolution reserviertes Offline-Schlüsselfeld Reserviertes Offline-Schlüsselfeld für MEMC
1064 PQ Offline-Schlüsselposition Offline-Schlüsselposition für PQ; minus 1000 ergibt Online-Schlüsselposition 64.
1065 PQ reserviertes Offline-Schlüsselfeld Reserviertes Offline-Schlüsselfeld für PQ
1068 multi-module Offline-Schlüsselposition Offline-Schlüsselposition für multi-module; minus 1000 ergibt Online-Schlüsselposition 68.
ID Funktion Beschreibung
1069 multi-module reserviertes Offline-Schlüsselfeld Reserviertes Offline-Schlüsselfeld für multi-module
1070 Touch-Read Offline-Schlüsselposition Offline-Schlüsselposition für Touch-Read; minus 1000 ergibt Online-Schlüsselposition 70.
1071 Touch-Read reserviertes Offline-Schlüsselfeld Reserviertes Offline-Schlüsselfeld für Touch-Read
1072 OCR Offline-Schlüsselposition Offline-Schlüsselposition für OCR-Algorithmus; minus 1000 ergibt Online-Schlüsselposition 72.
1073 OCR reserviertes Offline-Schlüsselfeld Reserviertes Offline-Schlüsselfeld für OCR-Algorithmus
1074 Face Offline-Schlüsselposition Offline-Schlüsselposition für Gesichtsentsperrung; minus 1000 ergibt Online-Schlüsselposition 74.
1075 Face reserviertes Offline-Schlüsselfeld Reserviertes Offline-Schlüsselfeld für Gesichtsentsperrung
1076 Knowledge Offline-Schlüsselposition Offline-Schlüsselposition für Knowledge; minus 1000 ergibt Online-Schlüsselposition 76.
1077 Knowledge reserviertes Offline-Schlüsselfeld Reserviertes Offline-Schlüsselfeld für Knowledge
1084 ASR Offline-Schlüsselposition Offline-Schlüsselposition für ASR-Sprache-zu-Text-Algorithmus; minus 1000 ergibt Online-Schlüsselposition 84.
1085 ASR reserviertes Offline-Schlüsselfeld Reserviertes Offline-Schlüsselfeld für ASR-Sprache-zu-Text-Algorithmus
1086 LLM Offline-Schlüsselposition Offline-Schlüsselposition für LLM-Übersetzung; minus 1000 ergibt Online-Schlüsselposition 86.
1087 LLM reserviertes Offline-Schlüsselfeld Reserviertes Offline-Schlüsselfeld für LLM-Übersetzung
1088 TTS Offline-Schlüsselposition Offline-Schlüsselposition für TTS-Text-zu-Sprache-Algorithmus; minus 1000 ergibt Online-Schlüsselposition 88.
1089 TTS reserviertes Offline-Schlüsselfeld Reserviertes Offline-Schlüsselfeld für TTS-Text-zu-Sprache-Algorithmus
1096 AI Eraser Algorithm Offline-Schlüsselposition Offline-Schlüsselposition für AI-Eraser-Algorithmus; minus 1000 ergibt Online-Schlüsselposition 96.
1097 AI Eraser Algorithm reserviertes Offline-Schlüsselfeld Reserviertes Offline-Schlüsselfeld für AI-Eraser-Algorithmus

Hinweis: Daten werden im NVM auf 64 Byte ausgerichtet gespeichert. Ein Element belegt mindestens 64 Byte: Für 1–64 geschriebene Byte werden 64 Byte, für 65–128 Byte werden 128 Byte zugewiesen.

4. UBOOT-API

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

int vendor_storage_init(void)
function: Initialize vendor storage
input : none
return: 0: Initialize success
        other: Initialize fail

int vendor_storage_read(u32 id, void *pbuf, u32 size)
function: read vendor storage by id
input : id, item id;
pbuf, data buffer;
size, number byte to read.
return: other: number byte have read.
        -1: read fail.

int vendor_storage_write(u32 id, void *pbuf, u32 size)
function: write vendor storage by id
input : id: item id;
pbuf: data buffer;
size: number bytes to write.
return:  0: write success
         other: write fail

4.1 API für NON-GKI-Kernel

Quellcode: kernel/drivers/soc/rockchip/rk_vendor_storage.c

int rk_vendor_read(u32 id, void *pbuf, u32 size)
function: read vendor storage by id
input : id: item id;
pbuf: data buffer;
size: number bytes to read.
return: other: number byte have read.
        -1: read fail

int rk_vendor_write(u32 id, void *pbuf, u32 size)
function: write vendor storage by id
input : id, item id;
pbuf: data buffer;
size: number bytes to write.
return: 0: write success
        other : write fail

Menuconfig-Konfiguration

4.1 API für NON-GKI-Kernel: englisches Original, Seite 13

4.1 API für NON-GKI-Kernel: englisches Original, Seite 13

CONFIG_ROCKCHIP_VENDOR_STORAGE:

Say Y here to enable vendor storage support.
Vendor storage is used for stored SN, MAC, BT ADDR etc.

Symbol: ROCKCHIP_VENDOR_STORAGE [=y]
Type  : boolean
Prompt: Rockchip vendor storage support
  Location:
    -> Device Drivers
      -> SOC (System On Chip) specific Drivers
  Defined at drivers/soc/rockchip/Kconfig:6
  Depends on: ARCH_ROCKCHIP [=y] || COMPILE_TEST

4.2 API für GKI-Kernel

Aufgrund der GKI-Kernelschnittstellenbeschränkungen verlangt die Quelle, ram_vendor_storage.ko zum Kernel hinzuzufügen, damit Vendor Storage die Leseschnittstelle unterstützt; die Schreibschnittstelle wird nicht unterstützt.

4.3 Android-API

Quellcode: hardware/rockchip/libvendor_storage/vendor_storage.c

/*
 * vendor_storage_init must be call first
 * rerurn:  ret=0 succes   ret<0 failed
 */
 int vendor_storage_init(void);

/*
 * emmc_vendor_write
 * id: item id
 * pbuf: write data
 * size: vendor_item.size
 * rerurn:  ret>0 succes   ret<0 failed
 */
 int emmc_vendor_write(uint32 id, void *pbuf, uint32 size);

 /*
 * emmc_vendor_read
 * id: item id
 * pbuf: read data
 * size: vendor_item.size
 * rerurn:  ret>0 succes   ret<0 failed
 */
 int emmc_vendor_read(uint32 id, void *pbuf, uint32 size);

Ein Anwendungsbeispiel enthält hardware/rockchip/libvendor_storage/vendor_storage_test.c.

5. PC-Demowerkzeug

SN auswählen, den SN-Wert eingeben und ENTER drücken, um das SN-Element zur Schreibanforderungsliste hinzuzufügen.

5. PC-Demowerkzeug: englisches Original, Seite 14

5. PC-Demowerkzeug: englisches Original, Seite 14

Mit der Schaltfläche Burning werden die Daten in Vendor Storage geschrieben.

5. PC-Demowerkzeug: englisches Original, Seite 15

5. PC-Demowerkzeug: englisches Original, Seite 15

SN auswählen und Read anklicken, um Daten aus Vendor Storage zu lesen.

5. PC-Demowerkzeug: englisches Original, Seite 15

5. PC-Demowerkzeug: englisches Original, Seite 15

6. Quellcode des PC-Werkzeugs

Daten mit dem PC-Werkzeug lesen

/*----------------------------------------------------------------------
Name    : RK_ReadProvisioningData
Desc    : Read provisioning data by id
Params  : (IN)nID: id
          (OUT)pDataBuffer: buffer to save data, malloc by caller
          (IN|OUT)nBufferSize: in = size of buffer,out = actual data size
          (IN)dwLayer:device layer
Return  : TRUE: SUCCESSED
          FALSE: FAILED
----------------------------------------------------------------------*/
BOOL RK_ReadProvisioningData(USHORT nID,PBYTE pDataBuffer,USHORT &nBufferSize,DWORD dwLayer=0);

Daten mit dem PC-Werkzeug schreiben

 /*----------------------------------------------------------------------
Name    : RK_WriteProvisioningData
Desc    : Write provisioning data by id
Params  : (IN)nID: id
          (IN)pDataBuffer: buffer to save data, malloc by caller
          (IN)nBufferSize: size of buffer
          (IN)dwLayer:device layer
Return  : TRUE: SUCCESSED
          FALSE: FAILED
----------------------------------------------------------------------*/
BOOL RK_WriteProvisioningData(USHORT nID,PBYTE pDataBuffer,USHORT nBufferSize,DWORD dwLayer=0);

7. Linux-Anwendungsbeispiel

Zugriff über den vom Kernel bereitgestellten Knoten vendor_storage.

#include <fcntl.h>
#include <sys/ioctl.h>

typedef unsigned short uint16;
typedef unsigned long uint32;
typedef unsigned char uint8;

#define VENDOR_REQ_TAG      0x56524551
#define VENDOR_READ_IO      _IOW('v', 0x01, unsigned int)
#define VENDOR_WRITE_IO     _IOW('v', 0x02, unsigned int)
#define VENDOR_SN_ID        1
#define VENDOR_WIFI_MAC_ID  2
#define VENDOR_LAN_MAC_ID   3
#define VENDOR_BLUETOOTH_ID 4

struct rk_vendor_req {
    u32 tag;
    u16 id;
    u16 len;
    u8 data[1];
};

int vendor_storage_read_test(void)
{
    uint32 i;
    int ret ;
    uint8 p_buf[2048]; /* malloc req buffer or used extern buffer */
    struct rk_vendor_req *req;

    req = (struct rk_vendor_req *)p_buf;
    int sys_fd = open("/dev/vendor_storage",O_RDWR,0);
    if(sys_fd < 0){
        ERROR("vendor_storage open fail\n");
        return -1;
    }

    req->tag = VENDOR_REQ_TAG;
    req->id = VENDOR_SN_ID;
    req->len = 512; /* max read length to read*/

    ret = ioctl(sys_fd, VENDOR_READ_IO, req);
    /* return req->len is the real data length stored in the NV-storage */
    if(ret){
        ERROR("vendor read error\n");
        return -1;
    }

    return 0;
}

int vendor_storage_write_test(void)
{
    uint32 i;
    int ret ;
    uint8 p_buf[2048]; /* malloc req buffer or used extern buffer */
    struct rk_vendor_req *req;

    req = (struct rk_vendor_req *)p_buf;
    int sys_fd = open("/dev/vendor_storage",O_RDWR,0);
    if(sys_fd < 0){
        ERROR("vendor_storage open fail\n");
        return -1;
    }
    req->tag = VENDOR_REQ_TAG;
    req->id = VENDOR_SN_ID;
    req->len = 32; /* data len */
    for (i = 0; i < 32; i++)
        req->data[i] = i;
    ret = ioctl(sys_fd, VENDOR_WRITE_IO, req);
    if(ret){
        ERROR("vendor write error\n");
        return -1;
    }

    return 0;
}

Zugriff aus Benutzeranwendungen ohne Kerneltreiber:

Implementierung siehe hardware/rockchip/libvendor_storage/vendor_storage_test.c.

Dieses Thema entdecken → · Lernpfade →