2022-8-3----Android10.0(MTK)-----SN_Writer 写入 SN 注意事项
一、SN序列號
?設(shè)置-設(shè)備信息-型號和硬件 可以查看到 SN 號,而通過代碼分析可以知道、設(shè)置是通過讀取?ro.serialno 屬性來獲取SN。
?二、SN_Writer 寫入 SN
一般我們寫入 SN 號是通過MTK的工具?SN_Writer,但是要注意的是!這個工具寫入SN號可以分為兩種方式。這兩種方式都需要注意一個地方、如下圖:
?一定一定不要勾方框中的玩意、否則寫號的時候?qū)⒉粫懭?proinfo 分區(qū),proinfo 分區(qū)的信息將會是空、你代碼再怎么讀讀出來都是空,下面是讀?proinfo 分區(qū)的源碼。
vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c?下面介紹兩種寫入的方式。
1、第一種方式 寫入Barcode
寫入Barcode,然后在代碼里把宏開關(guān)打開
/vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c中,將 #define SERIAL_NUM_FROM_BARCODE 宏定義打開
這個時候 SN 號就會去讀?寫入的Barcode的值。
PS說明:用第一種方式?寫入 Barcode 的時候,寫入了 proinfo分區(qū),然后開機(jī)的過程中,會將該分區(qū)的 barcode 值賦予 gsm.serialno,如果沒有把? #define SERIAL_NUM_FROM_BARCODE 宏定義打開,那么將不會賦予 ro.serialno,所以這個時候你去設(shè)置下面查看該序列號,顯示的SN號和你寫入的SN號是不一樣的。為了保證一致,所以記得打開宏定義。
這個時候開機(jī)的過程中會把分區(qū)的?barcode 值賦予?gsm.serialno 和?ro.serialno 這兩個屬性。
2、第二種方式 寫入Serial No
?注意:一般 SN_Writer 是將該選項給隱藏的、如果要想顯示出來、按照MTK提供的FAQ操作。
下面是FAQ提供的資料:
1. SN Writer Tool 工具端
1.1. 用 v1.1632.00 及其之后的版本
1.2. SN Writer Tool 先關(guān)閉,修改程序目錄下 SN_setup.ini 文件
Enable Serial No = True
Serial Num From IMEI = False
1.3. 打開 SN Writer Tool,進(jìn)入 "System Config" 配置界面,勾選左上方的 "Serial No."
1.4. 返回主界面點擊 "Start" ,在號碼輸入界面中 "SerialNo" 中輸入序列號 注意:SerialNo 只能包含英文字母或數(shù)字
2. 移動設(shè)備端
2.1. 確認(rèn) proinfo 分區(qū)名稱 早期的 MBR 分區(qū)格式設(shè)備,proinfo分區(qū)的名字是"PRO_INFO", 請通過 Scatter File 進(jìn)行確認(rèn)。 后續(xù)代碼中涉及"proinfo"字符串判斷的地方請對應(yīng)修改。
2.2. /app/mt_boot/mt_boot.c 打開宏定義 打開默認(rèn)關(guān)閉的 /* #define SERIAL_NUM_FROM_BARCODE */ -> #define SERIAL_NUM_FROM_BARCODE
2.3. /app/mt_boot/mt_boot.c 中 read_product_info 函數(shù) 修改為以下:
static inline int read_product_info(char *buf) { #define PROINFO_OFFSET 116 // barcode:64 + imei:40 + bt:6 + wifi:6 int tmp = 0; char * buf_blk = (char *)0;if (!buf) return 0;buf_blk = malloc(BLK_SIZE); if (!buf_blk) { dprintf(CRITICAL, "[error] alloc proinfo buffer fail.\n"); return 0;} memset(buf_blk, 0, BLK_SIZE); dprintf(CRITICAL, "begin read proinfo\n"); tmp = mboot_recovery_load_raw_part("proinfo", buf_blk, BLK_SIZE); if (tmp != BLK_SIZE) {dprintf(CRITICAL, "[error] read proinfo fail, only read size %d, block size %d.\n", tmp, BLK_SIZE); free(buf_blk); return 0;} memcpy(buf, buf_blk + PROINFO_OFFSET, SN_BUF_LEN);buf[SN_BUF_LEN] = '\0';dprintf(CRITICAL, "get serialno from proinfo: \"%s\"\n", buf);free(buf_blk); for (tmp = 0; tmp < SN_BUF_LEN; tmp++){if ( (buf[tmp] == 0 || buf[tmp] == 0x20) && tmp > 0){ break;} else if ( !isalpha(buf[tmp]) && !isdigit(buf[tmp])) return 0; } return tmp;}3. 編譯LK,燒入機(jī)器,用 SN Writer tool寫入 serial num。
四、后續(xù)
如果想了解具體的過程、可以閱讀源碼、打log理清。
vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c void mt_boot_init(const struct app_descriptor *app) {unsigned usb_init = 0;unsigned sz = 0; #ifdef MTK_AB_OTA_UPDATERint ret; #endifset_serial_num();#ifdef MTK_DEBUG_SHELLif (app != NULL)goto lk_debug; #endifif (g_boot_mode == FASTBOOT)goto fastboot;#ifdef MTK_SECURITY_SW_SUPPORT #if MTK_FORCE_VERIFIED_BOOT_SIG_VFY/* verify oem image with android verified boot signature instead of mediatek proprietary signature *//* verification is postponed to boot image loading stage *//* note in this case, boot/recovery image will be verified even when secure boot is disabled */g_boot_state = BOOT_STATE_RED; #elseif (0 != sec_boot_check(0))g_boot_state = BOOT_STATE_RED; #endif #endif/* Will not return */boot_linux_from_storage();fastboot:target_fastboot_init();if (!usb_init)udc_init(&surf_udc_device);mt_part_dump();sz = target_get_max_flash_size();fastboot_init(target_get_scratch_address(), sz);udc_start();#ifdef MTK_DEBUG_SHELL lk_debug:mtk_wdt_disable();dprintf(INFO, "mt_boot_init not go to kernel and disable wdt !!\n"); #endif}?其中的?set_serial_num() 函數(shù)
static void set_serial_num(void) {unsigned int len;char *id_tmp = get_env("MTK_DEVICE_ID");if (!id_tmp) {pal_log_info("Set serial # to default value.\n");len = strlen(DEFAULT_SERIAL_NUM);len = (len < SN_BUF_LEN) ? len : SN_BUF_LEN;strncpy(sn_buf, DEFAULT_SERIAL_NUM, len);sn_buf[len] = '\0';} else {pal_log_info("Set serial # from para.\n");len = strlen(id_tmp);len = (len < SN_BUF_LEN) ? len : SN_BUF_LEN;strncpy(sn_buf, id_tmp, len);sn_buf[len] = '\0';}#ifdef CONFIG_MTK_USB_UNIQUE_SERIALint errcode = read_product_usbid(sn_buf);if (errcode)pal_log_err("Set serial # from efuse. error: %d\n", errcode);len = strlen(sn_buf);len = (len < SN_BUF_LEN) ? len : SN_BUF_LEN;sn_buf[len] = '\0'; #endif // CONFIG_MTK_USB_UNIQUE_SERIAL#ifdef SERIAL_NUM_FROM_BARCODElen = (unsigned int)read_product_info(sn_buf); // sn_buf[] may be changed.if (len == 0) {len = strlen(DEFAULT_SERIAL_NUM);len = (len < SN_BUF_LEN) ? len : SN_BUF_LEN;strncpy(sn_buf, DEFAULT_SERIAL_NUM, len);} elselen = (len < SN_BUF_LEN) ? len : SN_BUF_LEN;sn_buf[len] = '\0'; #endif // SERIAL_NUM_FROM_BARCODE//pal_log_err("Serial #: \"%s\"\n", sn_buf);surf_udc_device.serialno = sn_buf; }總結(jié)
以上是生活随笔為你收集整理的2022-8-3----Android10.0(MTK)-----SN_Writer 写入 SN 注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新媒体指数评价方法:相应计算公式
- 下一篇: 这一切,只因心中有梦