SN及Mac地址燒錄

platform:RK3399
OS:Android 7.1
參考:
1.比特人生 https://blog.csdn.net/ielife/article/details/86719313
2.KrisFei https://blog.csdn.net/kris_fei/article/details/79447343?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158883304619726869022990%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=158883304619726869022990&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v25-4

1. 概述

對于一臺運(yùn)行Android系統(tǒng)的終端設(shè)備,一般會有許多出廠就已經(jīng)確定的屬性,這些屬性唯一且具有特殊的作用。其中SN,MAC,IMEI(有通信模塊)是最基礎(chǔ)的幾個屬性,這些屬性一般在出廠之前就會使用工具寫到設(shè)備中,和設(shè)備綁定。

1.1 SN號

SN碼是Serial Number的縮寫,有時也叫SerialNo,也就是產(chǎn)品序列號,產(chǎn)品序列是為了驗證“產(chǎn)品的合法身份”而引入的一個概念,它是用來保障用戶的正版權(quán)益,享受合法服務(wù)的;一套正版的產(chǎn)品只對應(yīng)一組產(chǎn)品序列號。SN碼別稱:機(jī)器碼、認(rèn)證碼、注冊申請碼等。

SN號可以根據(jù)產(chǎn)品要求或者公司統(tǒng)一的編碼規(guī)范進(jìn)行編碼,但是Android仍然對SN號有一定的限制要求,具體要求如下:

1. 英文字符和數(shù)字(a~z,A~Z,0~9)
2. 6~20個字符

1.2 mac地址

MAC地址是一個用來確認(rèn)網(wǎng)絡(luò)設(shè)備位置的位址。在OSI模型中,第三層網(wǎng)絡(luò)層負(fù)責(zé)IP地址,第二層數(shù)據(jù)鏈路層則負(fù)責(zé)MAC位址 。MAC地址用于在網(wǎng)絡(luò)中唯一標(biāo)示一個網(wǎng)卡,一臺設(shè)備若有一或多個網(wǎng)卡,則每個網(wǎng)卡都需要并會有一個唯一的MAC地址。

網(wǎng)絡(luò)設(shè)備制造商生產(chǎn)時燒錄在網(wǎng)卡(Network lnterface Card)的EPROM中,所以如果網(wǎng)絡(luò)設(shè)備制造商已經(jīng)燒錄好了MAC地址,那么我們就不需要再次燒錄。如果沒有提前燒錄,那就需要采購MAC地址池并在生產(chǎn)時將MAC地址燒錄到設(shè)備中。一般OEM工廠可以提供MAC地址。

終端設(shè)備常見的MAC地址有:WIFI MAC,LAN MAC,BT MAC;這個需要根據(jù)產(chǎn)品具體確定,比如有的產(chǎn)品就可能沒有LAN MAC.相應(yīng)的也不需要燒錄LAN MAC。

2. 燒錄及測試

瑞芯微提供寫號工具,請聯(lián)系FAE獲取最新的寫號工具,SDK舊版本的工具可能存在問題.

2.1 燒錄

2.1.1 設(shè)備方式

兩種設(shè)備模式: maskrom 和 loader 模式
maskrom 進(jìn)入方式:短接 FLASH CLK 引腳,在該模式下面寫號,必須要選擇正確的
MiniLoaderAll.bin。
loader 進(jìn)入方式:開機(jī)時候按住“音量+”或者 adb reboot loader 命令,在該模式下面寫號,
設(shè)備必須是已經(jīng)有燒寫過固件。

2.1.2 寫號模式

在這里插入圖片描述

如果不清楚使用那種模式,可以逐一嘗試.注意錯誤勾選可能導(dǎo)致寫號失敗.

2.1.3 配置

1.代碼配置

diff --git a/drmservice/drmservice.c b/drmservice/drmservice.c
index 86c8e32..f2f25ba 100644
--- a/drmservice/drmservice.c
+++ b/drmservice/drmservice.c
@@ -81,7 +81,7 @@ typedef               unsigned char       uint8;
 
 #define DEBUG_LOG 0   //open debug info
 
-#define SERIALNO_FROM_IDB 0  //if 1 read sn from idb3;  if 0 generate sn auto
+#define SERIALNO_FROM_IDB 1  //if 1 read sn from idb3;  if 0 generate sn auto
 
 #define SET_IFACE_DELAY                 300000
 #define SET_IFACE_POLLING_LOOP          20

2.軟件配置

在這里插入圖片描述

寫號工具支持同時寫入 7 個項,其中五個是預(yù)定義的(ID 是固定的,不能修改),剩下兩個
用戶可以通過修改 ID 自定義寫入。 uboot、內(nèi)核是通過 ID 來區(qū)別用戶寫入的內(nèi)容的。用戶可以
選擇三種輸入方式寫號:

  1. 手動模式
    直接在主界面從鍵盤或者掃描槍輸入要寫入的數(shù)據(jù)項。
  2. 自增模式
    用戶設(shè)定起始項,前綴和后綴,按十進(jìn)制,或者十六進(jìn)制遞增生成寫入數(shù)據(jù)項。
  3. 文件模式
    從文件獲取寫入的數(shù)據(jù)項,如果勾選“Bin 文件”,則會把整個文件寫入;不勾選的話,則把選
    擇的文件當(dāng)做文本文件,一次寫入一行.

2.1.4 燒錄

配置完成后,在首頁點擊寫入,等待設(shè)備寫入成功即可.

2.2 查看

有多種方式查看是否寫入成功.

方式一:使用上面的寫號軟件讀取.

方式二:使用串口抓取開機(jī)log

#Boot ver: 0000-00-00#0.00
12345678 //SN號
normal boot.
checkKey

方法三:傳給Kernel的啟動參數(shù)

mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(trust),0x00002000@0x00006000(uboot_ro),0x00002000@0x00008000(trust_ro),0x00002000@0x0000A000(misc),0x00008000@0x0000C000(resource),0x0000C000@0x00014000(kernel),0x00010000@0x00020000(boot),0x00020000@0x00030000(recovery),0x00038000@0x00050000(backup),0x00040000@0x00088000(cache),0x00600000@0x000C8000(system),0x00008000@0x006C8000(metadata),0x00000040@0x006D0000(verity_mode),0x00002000@0x006D0040(reserved),0x00000400@0x006D2040(frp),-@0x006D2440(userdata) storagemedia=emmc androidboot.oem_unlocked=0 uboot_logo=0x02000000@0x7dc00000 loader.timestamp=2020-04-24_12:20:44 SecureBootCheckOk=0 androidboot.serialno=12345678

方法四:使用adb

#adb devices
12345678 device

方法五:查看系統(tǒng)屬性

getprop ro.serialno
getprop ro.boot.serialno

2.3 有效情況

在不擦除flash的情況下,SN號均有效,具體場景見下表.

操作 SN有效情況
單分區(qū)燒錄 有效
整包燒錄 無效
OTA差分升級 有效
OTA整包升級 有效
擦除Flash后燒錄 無效
恢復(fù)出廠設(shè)置 有效

3. 獲取串號(SN)

APK:

android.os.Build.SERIAL

ro.boot.serialno:

/system/core/init/init.cpp:

static void import_kernel_nv(const std::string& key, const std::string& value, bool for_emulator) {
    if (key.empty()) return;

    if (for_emulator) {
        // In the emulator, export any kernel option with the "ro.kernel." prefix.
        property_set(android::base::StringPrintf("ro.kernel.%s", key.c_str()).c_str(), value.c_str());
        return;
    }

    if (key == "qemu") {
        strlcpy(qemu, value.c_str(), sizeof(qemu));
    } else if (android::base::StartsWith(key, "androidboot.")) {
        property_set(android::base::StringPrintf("ro.boot.%s", key.c_str() + 12).c_str(),
                     value.c_str());
    }
}

通過cmdline獲取串號ro.boot.serialno,cmdline見上一小節(jié)方法三:

androidboot.serialno=12345678

sys.serialno:

system/core/drmservice/drmservice.c

       if(SERIALNO_FROM_IDB)//read serialno form idb
        {
                vendor_storage_read_sn();
                property_set("sys.serialno", sn_buf_idb[0] ? sn_buf_idb : "12345678");
                write_serialno2kernel(sn_buf_idb[0] ? sn_buf_idb : "12345678");
                SLOGE("get serialno from idb,serialno = %s",sn_buf_idb);
        }

由于是寫入的SN,所以從idb中獲取SN.

ro.serialno:

init.rk30board.rc:

//運(yùn)行drmservice
service drmservice /system/bin/drmservice
    class main
    oneshot
    
# set ro.serialno
on property:sys.serialno=*
    setprop ro.serialno ${sys.serialno}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容