mtk sn号/barcode号

sancaiodm Android源码学习 2023-06-29 1280 0

在使用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空间的值。

getSerial.png



【SN_Writer 写入 SN】原文出处:Android10.0(MTK)-----SN_Writer 写入 SN 注意事项

一般我们写入 SN 号是通过MTK的工具 SN_Writer,但是要注意的是!这个工具写入SN号可以分为两种方式。这两种方式都需要注意一个地方、如下图:

SN_Writer.png

一定一定不要勾方框中的玩意、否则写号的时候将不会写入proinfo 分区,proinfo 分区的信息将会是空、你代码再怎么读读出来都是空,下面是读 proinfo 分区的源码。

vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c

proinfo.png

评论