mtk sn号/barcode号
在使用MTK平台SN_WRITE工具写Barcode号时会同时把值写入NV内 和 proinfo分区内 保存,NV解释:Non-Volatitle;
mtk (sn号),sn号是手机序列号,可以在手机的【设置】-【关闭手机】-【型号】-【序列号】中查看,
mtk平台的存储sn号的属性是:
thor:/ $ getprop |grep serial
[ro.boot.serialno]: [BAAAAAA000123]
[ro.serialno]: [BAAAAAA000123]
C:\Users\a>adb devices
List of devices attached
BAAAAAA000123 device
adb devices的值来源于此节点:/config/usb_gadget/g1/strings/0x409/serialnumber
[sn的传递和赋值流程基本梳理清楚]
SN号的最开始初始写入: vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c
----->set_serial_num()->read_product_info()
----->boot_linux_from_storage()–>cmdline_tmpbuf
这里你可以查看 cat /proc/cmdline 中androidboot.serialno中的值是否以写入
而cmdline中的内容是在开机启动的init进程里进行解析分段中不同的属性,过程如下:
/system/core/init/property_service.cpp
void PropertyInit() { selinux_callback cb; cb.func_audit = PropertyAuditCallback; selinux_set_callback(SELINUX_CB_AUDIT, cb); mkdir("/dev/__properties__", S_IRWXU | S_IXGRP | S_IXOTH); CreateSerializedPropertyInfo(); if (__system_property_area_init()) { LOG(FATAL) << "Failed to initialize property area"; } if (!property_info_area.LoadDefaultPath()) { LOG(FATAL) << "Failed to load serialized property info file"; } // If arguments are passed both on the command line and in DT, // properties set in DT always have priority over the command-line ones. ProcessKernelDt(); ProcessKernelCmdline();//对cmdline解析 ProcessBootconfig(); // Propagate the kernel variables to internal variables // used by init as well as the current required properties. ExportKernelBootProps();//在此处又将ro.boot.serialno 赋值给[ro.serialno] PropertyLoadBootDefaults(); } static void ProcessBootconfig() { ImportBootconfig([&](const std::string& key, const std::string& value) { if (StartsWith(key, ANDROIDBOOT_PREFIX)) { InitPropertySet("ro.boot." + key.substr(ANDROIDBOOT_PREFIX.size()), value);//以ro.boot.serialno属性存储 } }); } static void ExportKernelBootProps() { constexpr const char* UNSET = ""; struct { const char* src_prop; const char* dst_prop; const char* default_value; } prop_map[] = { // clang-format off { "ro.boot.serialno", "ro.serialno", UNSET, },//左边赋值右边 { "ro.boot.mode", "ro.bootmode", "unknown", }, { "ro.boot.baseband", "ro.baseband", "unknown", }, { "ro.boot.bootloader", "ro.bootloader", "unknown", }, { "ro.boot.hardware", "ro.hardware", "unknown", }, { "ro.boot.revision", "ro.revision", "0", }, // clang-format on }; for (const auto& prop : prop_map) { std::string value = GetProperty(prop.src_prop, prop.default_value); if (value != UNSET) InitPropertySet(prop.dst_prop, value); } }
[修改SN号的字符长度]
我们通过工具写入的SN一般都是把barcode作为sn的写入字段,然而MTK一般原生代码是没有打开从BARCODE字段获取SN的,所以我们需要把从BARCODE去读SN的开关打开,并且按照自己的需求修改一下SN的字段长度
修改如下:原文:https://blog.csdn.net/shangguobuliuhen/article/details/126184929
--- a/vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c +++ b/vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c @@ -227,11 +227,13 @@ static uint8_t AB_retry_count; /* The following option should be defined in project make file. */ /* #define SERIAL_NUM_FROM_BARCODE */ +#define SERIAL_NUM_FROM_BARCODE + #if defined(CONFIG_MTK_USB_UNIQUE_SERIAL) || (defined(MTK_SECURITY_SW_SUPPORT) && defined(MTK_SEC_FASTBOOT_UNLOCK_SUPPORT)) -#define SERIALNO_LEN 38 /* from preloader */ +#define SERIALNO_LEN 64 /* from preloader */ char sn_buf[SN_BUF_LEN + 1] = ""; /* will read from EFUSE_CTR_BASE */ #else -#define SERIALNO_LEN 38 +#define SERIALNO_LEN 64 char sn_buf[SN_BUF_LEN + 1] = FASTBOOT_DEVNAME; #endif
【SN Write需要打开的宏控】
MTK平台如何用Build.getSerial()方法读取写入的SN号
这里直接复制MTK论坛那边的开发回复(通过MTK的写号工具SN Write):
在/vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c
中,将 #define SERIAL_NUM_FROM_BARCODE 宏定义打开
这时SN Write工具写Barcode即可,其他无需修改。
这是最简单的方式,相当于serial no取Barcode空间的值。
【SN_Writer 写入 SN】原文出处:Android10.0(MTK)-----SN_Writer 写入 SN 注意事项
一定一定不要勾方框中的玩意、否则写号的时候将不会写入proinfo 分区,proinfo 分区的信息将会是空、你代码再怎么读读出来都是空,下面是读 proinfo 分区的源码。
vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c
评论