Implement get Serial Number
Root cause:N/A
How to fix:N/A
Feature:implement get Serial Number from prodinfo partition
Change-Id: Iab230a16d19ded77115b9197357b91036d148b96
RiskArea:PCBA
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index a9ac9d4..edcd171 100755
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -103,6 +103,11 @@
char **buf);
void *info_buf;
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+void *prodinfo_buf;
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
void write_device_info_mmc(device_info *dev);
void write_device_info_flash(device_info *dev);
static int aboot_save_boot_hash_mmc(uint32_t image_addr, uint32_t image_size);
@@ -114,6 +119,11 @@
/* fastboot command function pointer */
typedef void (*fastboot_cmd_fn) (const char *, void *, unsigned);
bool get_perm_attr_status();
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+void write_prod_info(prod_info *dev);
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end */
struct fastboot_cmd_desc {
char * name;
@@ -171,6 +181,13 @@
static const char *alarmboot_cmdline = " androidboot.alarmboot=true";
static const char *loglevel = " quiet";
static const char *battchg_pause = " androidboot.mode=charger";
+/*[20200605][TracyChui] Implement get Serial Number start */
+#if defined(ENABLE_PRODINFO_ACCESS)
+static const char *cust_sn_cmdline = " androidboot.customer_serialno=";
+static const char *factory_sn_cmdline = " androidboot.factory_serialno=";
+static const char *UsbAdbEnable = " androidboot.adb_enable=1";
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
static const char *auth_kernel = " androidboot.authorized_kernel=true";
static const char *secondary_gpt_enable = " gpt";
#ifdef MDTP_SUPPORT
@@ -260,6 +277,11 @@
static char *target_boot_params = NULL;
static bool boot_reason_alarm;
static bool devinfo_present = true;
+/*[20200605][TracyChui] Implement get Serial Number start */
+#if defined(ENABLE_PRODINFO_ACCESS)
+static bool prodinfo_present = true;
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
bool boot_into_fastboot = false;
static uint32_t dt_size = 0;
static char *vbcmdline;
@@ -270,6 +292,11 @@
/* Assuming unauthorized kernel image by default */
static int auth_kernel_img = 0;
static device_info device = {DEVICE_MAGIC,0,0,0,0,{0},{0},{0},1,{0},0,{0}};
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+static prod_info prod = {PRODINFO_MAGIC, {0}, {0}, 0};
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
/*[Arima_8910][jhchen] add fuse check property 20181031 begin*/
#ifdef ENABLE_FUSE_CHECK
@@ -352,7 +379,18 @@
char max_download_size[MAX_RSP_SIZE];
char charger_screen_enabled[MAX_RSP_SIZE];
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+char cust_sn_buf[PRODINFO_MAX_SSN_LEN + 1];
+char factory_sn_buf[PRODINFO_MAX_SSN_LEN + 1];
+char AdbEnable[MAX_RSP_SIZE];
+#endif
+#if defined(ENABLE_PRODINFO_ACCESS)
+char sn_buf[PRODINFO_MAX_ISN_LEN + 1];
+#else
char sn_buf[13];
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
char display_panel_buf[MAX_PANEL_BUF_SIZE];
char panel_display_mode[MAX_RSP_SIZE];
char soc_version_str[MAX_RSP_SIZE];
@@ -496,6 +534,11 @@
int have_cmdline = 0;
unsigned char *cmdline_final = NULL;
int pause_at_bootup = 0;
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+ int AdbEnable = 0;
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
bool warm_boot = false;
bool gpt_exists = partition_gpt_exists();
int have_target_boot_params = 0;
@@ -567,6 +610,14 @@
cmdline_len += strlen(usb_sn_cmdline);
cmdline_len += strlen(sn_buf);
+/*[20200605][TracyChui] Implement get Serial Number start */
+#if defined(ENABLE_PRODINFO_ACCESS)
+ cmdline_len += strlen(cust_sn_cmdline);
+ cmdline_len += strlen(cust_sn_buf);
+ cmdline_len += strlen(factory_sn_cmdline);
+ cmdline_len += strlen(factory_sn_buf);
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end */
#if VERIFIED_BOOT
if (VB_M <= target_get_vb_version())
@@ -613,6 +664,20 @@
cmdline_len += strlen(battchg_pause);
}
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+ if (prod.is_adb_enabled) {
+ dprintf(CRITICAL, "Device will enable adb\n");
+
+ prod.is_adb_enabled = 0;
+ write_prod_info(&prod);
+
+ AdbEnable = 1;
+ cmdline_len += strlen(UsbAdbEnable);
+ }
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
+
if(target_use_signed_kernel() && auth_kernel_img) {
cmdline_len += strlen(auth_kernel);
}
@@ -955,6 +1020,27 @@
if (have_cmdline) --dst;
have_cmdline = 1;
while ((*dst++ = *src++));
+
+ /* [20200605][TracyChui] Implement get Serial Number */
+ #if defined(ENABLE_PRODINFO_ACCESS)
+ src = cust_sn_cmdline;
+ if (have_cmdline) --dst;
+ have_cmdline = 1;
+ while ((*dst++ = *src++));
+ src = cust_sn_buf;
+ if (have_cmdline) --dst;
+ have_cmdline = 1;
+ while ((*dst++ = *src++));
+ src = factory_sn_cmdline;
+ if (have_cmdline) --dst;
+ have_cmdline = 1;
+ while ((*dst++ = *src++));
+ src = factory_sn_buf;
+ if (have_cmdline) --dst;
+ have_cmdline = 1;
+ while ((*dst++ = *src++));
+ #endif
+ /*[20200605][TracyChui] Implement get Serial Number end */
if (warm_boot) {
if (have_cmdline) --dst;
src = warmboot_cmdline;
@@ -1000,6 +1086,16 @@
while ((*dst++ = *src++));
}
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+ if (AdbEnable) {
+ src = UsbAdbEnable;
+ if (have_cmdline) --dst;
+ while ((*dst++ = *src++));
+ }
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
+
if(target_use_signed_kernel() && auth_kernel_img) {
src = auth_kernel;
if (have_cmdline) --dst;
@@ -2666,6 +2762,85 @@
}
}
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+void write_prod_info_mmc(prod_info *dev)
+{
+ unsigned long long ptn = 0;
+ unsigned long long size;
+ int index = INVALID_PTN;
+ uint32_t blocksize;
+ uint8_t lun = 0;
+ uint32_t ret = 0;
+
+ if (prodinfo_present)
+ index = partition_get_index("prodinfo");
+ else
+ index = partition_get_index("aboot");
+
+ ptn = partition_get_offset(index);
+ if(ptn == 0)
+ {
+ return;
+ }
+
+ lun = partition_get_lun(index);
+ mmc_set_lun(lun);
+
+ size = partition_get_size(index);
+
+ blocksize = mmc_get_device_blocksize();
+
+ if (prodinfo_present)
+ ret = mmc_write(ptn, blocksize, (void *)prodinfo_buf);
+ else
+ ret = mmc_write((ptn + size - blocksize), blocksize, (void *)prodinfo_buf);
+ if (ret)
+ {
+ dprintf(CRITICAL, "ERROR: Cannot write prod info\n");
+ ASSERT(0);
+ }
+}
+
+void read_prod_info_mmc(struct prod_info *info)
+{
+ unsigned long long ptn = 0;
+ unsigned long long size;
+ int index = INVALID_PTN;
+ uint32_t blocksize;
+ uint32_t ret = 0;
+
+ if ((index = partition_get_index("prodinfo")) < 0)
+ {
+ prodinfo_present = false;
+ index = partition_get_index("aboot");
+ }
+
+ ptn = partition_get_offset(index);
+ if(ptn == 0)
+ {
+ return;
+ }
+
+ mmc_set_lun(partition_get_lun(index));
+
+ size = partition_get_size(index);
+
+ blocksize = mmc_get_device_blocksize();
+
+ if (prodinfo_present)
+ ret = mmc_read(ptn, (void *)prodinfo_buf, blocksize);
+ else
+ ret = mmc_read((ptn + size - blocksize), (void *)prodinfo_buf, blocksize);
+ if (ret)
+ {
+ dprintf(CRITICAL, "ERROR: Cannot read prod info\n");
+ ASSERT(0);
+ }
+}
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
+
void write_device_info_flash(device_info *dev)
{
struct device_info *info = memalign(PAGE_SIZE, ROUNDUP(BOOT_IMG_MAX_PAGE_SIZE, PAGE_SIZE));
@@ -2997,6 +3172,54 @@
read_device_info_flash(dev);
}
}
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+void write_prod_info(prod_info *dev)
+{
+ if(target_is_emmc_boot())
+ {
+ struct prod_info *info = memalign(PAGE_SIZE, ROUNDUP(BOOT_IMG_MAX_PAGE_SIZE, PAGE_SIZE));
+ if(info == NULL)
+ {
+ dprintf(CRITICAL, "Failed to allocate memory for prod info struct\n");
+ ASSERT(0);
+ }
+ prodinfo_buf = info;
+ memcpy(info, dev, sizeof(struct prod_info));
+
+ write_prod_info_mmc(info);
+ free(info);
+ }
+}
+
+void read_prod_info(prod_info *dev)
+{
+ if(target_is_emmc_boot())
+ {
+ struct prod_info *info = memalign(PAGE_SIZE, ROUNDUP(BOOT_IMG_MAX_PAGE_SIZE, PAGE_SIZE));
+ if(info == NULL)
+ {
+ dprintf(CRITICAL, "Failed to allocate memory for prod info struct\n");
+ ASSERT(0);
+ }
+ prodinfo_buf = info;
+
+ read_prod_info_mmc(info);
+
+ if (memcmp(info->magic, PRODINFO_MAGIC, PRODINFO_MAGIC_SIZE))
+ {
+ memcpy(info->magic, PRODINFO_MAGIC, PRODINFO_MAGIC_SIZE);
+ memcpy(info->isn, "No_Serial_Number", PRODINFO_MAX_ISN_LEN);
+ memcpy(info->ssn, "No_Custer_Serial_Number", PRODINFO_MAX_SSN_LEN);
+ info->is_adb_enabled = 0;
+ write_prod_info(info);
+ }
+ memcpy(dev, info, sizeof(prod_info));
+ free(info);
+ }
+}
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
void reset_device_info()
{
@@ -4704,6 +4927,18 @@
fastboot_okay("");
}
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+void CmdOemEnableAdb(const char *arg, void *data, unsigned size)
+{
+ dprintf(INFO, "Enabling Adb\n");
+ prod.is_adb_enabled = 1;
+ write_prod_info(&prod);
+ fastboot_okay("");
+}
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
+
void cmd_oem_off_mode_charger(const char *arg, void *data, unsigned size)
{
char *p = NULL;
@@ -4816,6 +5051,12 @@
fastboot_info(response);
snprintf(response, sizeof(response), "\tDisplay panel: %s", (device.display_panel));
fastboot_info(response);
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+ snprintf(response, sizeof(response), "\tAdb enabled: %s", prod.is_adb_enabled ? "true" : "false");
+ fastboot_info(response);
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
fastboot_okay("");
}
@@ -5215,6 +5456,11 @@
{"oem run-tests", cmd_oem_runtests},
#endif
#endif
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+ {"oem adb_enable", CmdOemEnableAdb},
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
};
int fastboot_cmds_count = sizeof(cmd_list)/sizeof(cmd_list[0]);
@@ -5257,6 +5503,15 @@
device.charger_screen_enabled);
fastboot_publish("charger-screen-enabled",
(const char *) charger_screen_enabled);
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+ read_prod_info(&prod);
+ snprintf(AdbEnable, MAX_RSP_SIZE, "%d",
+ prod.is_adb_enabled);
+ fastboot_publish("adb-enabled",
+ (const char *) AdbEnable);
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
fastboot_publish("off-mode-charge", (const char *) charger_screen_enabled);
snprintf(panel_display_mode, MAX_RSP_SIZE, "%s",
device.display_panel);
@@ -5330,6 +5585,11 @@
ASSERT((MEMBASE + MEMSIZE) > MEMBASE);
read_device_info(&device);
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+ read_prod_info(&prod);
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
read_allow_oem_unlock(&device);
/* Detect multi-slot support */
@@ -5350,8 +5610,22 @@
}
target_serialno((unsigned char *) sn_buf);
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+ dprintf(CRITICAL,"serial number: %s\n",sn_buf);
+#else
dprintf(SPEW,"serial number: %s\n",sn_buf);
-
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
+/*[20200605][TracyChui] Implement get Serial Number start */
+#if defined(ENABLE_PRODINFO_ACCESS)
+ read_prod_info(&prod);
+ snprintf((char *)cust_sn_buf, PRODINFO_MAX_SSN_LEN + 1, "%s", prod.ssn);
+ dprintf(CRITICAL,"customer serial number: %s\n", cust_sn_buf);
+ snprintf((char *)factory_sn_buf, PRODINFO_MAX_ISN_LEN + 1, "%s", prod.isn);
+ dprintf(CRITICAL,"factory serial number: %s\n", factory_sn_buf);
+#endif
+ /*[20200605][TracyChui] Implement get Serial Number end */
memset(display_panel_buf, '\0', MAX_PANEL_BUF_SIZE);
/*
diff --git a/app/aboot/devinfo.h b/app/aboot/devinfo.h
old mode 100644
new mode 100755
index f7b02b4..d264250
--- a/app/aboot/devinfo.h
+++ b/app/aboot/devinfo.h
@@ -60,4 +60,23 @@
uint32_t user_public_key_length;
uint8_t user_public_key[MAX_USER_KEY_SIZE];
};
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+typedef struct prod_info prod_info;
+
+#define PRODINFO_MAGIC "ANDROID!PRODINFO"
+#define PRODINFO_MAGIC_SIZE 16
+#define PRODINFO_MAX_ISN_LEN 32
+#define PRODINFO_MAX_SSN_LEN 32
+struct prod_info
+{
+ unsigned char magic[PRODINFO_MAGIC_SIZE];
+ unsigned char isn[PRODINFO_MAX_ISN_LEN];
+ unsigned char ssn[PRODINFO_MAX_SSN_LEN];
+ bool is_adb_enabled;
+};
+
+void read_prod_info(prod_info *dev);
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
#endif
diff --git a/app/aboot/fastboot.c b/app/aboot/fastboot.c
old mode 100644
new mode 100755
index cac7f8f..6aea42a
--- a/app/aboot/fastboot.c
+++ b/app/aboot/fastboot.c
@@ -38,6 +38,9 @@
#include <dev/udc.h>
#include "fastboot.h"
#include <err.h>
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#include <devinfo.h>
+/*[20200605][TracyChui] Implement get Serial Number end*/
#ifdef USB30_SUPPORT
#include <usb30_udc.h>
@@ -638,7 +641,13 @@
int fastboot_init(void *base, unsigned size)
{
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+ char sn_buf[PRODINFO_MAX_ISN_LEN + 1];
+#else
char sn_buf[13];
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end*/
thread_t *thr;
dprintf(INFO, "fastboot_init()\n");
diff --git a/makefile b/makefile
index 6a67921..eb88f91 100755
--- a/makefile
+++ b/makefile
@@ -81,6 +81,10 @@
CFLAGS += -DENABLE_FUSE_CHECK=1
# [Arima_8910][jhchen] 20181031 end
+#[20200605][TracyChui] Implement get Serial Number start
+CFLAGS += -DENABLE_PRODINFO_ACCESS=1
+#[20200605][TracyChui] Implement get Serial Number end
+
# setup toolchain prefix
TOOLCHAIN_PREFIX ?= arm-eabi-
CFLAGS += -fstack-protector-all
@@ -186,6 +190,11 @@
DEFINES += TARGET_USE_SYSTEM_AS_ROOT_IMAGE=0
endif
+#[20200605][TracyChui]Show SW and modem version and internal storage size on fastboot screen start
+DEFINES += ARIMA_BOOTLOADER_VERSION=\"$(ARIMA_SW_VERSION_ABOOT)\"
+DEFINES += ARIMA_BASEBAND_VERSION=\"$(MODEM_BUILDID)\"
+#[20200605][TracyChui]Show SW and modem version and internal storage size on fastboot screen end
+
# these need to be filled out by the project/target/platform rules.mk files
TARGET :=
PLATFORM :=
diff --git a/target/msm8953/init.c b/target/msm8953/init.c
old mode 100644
new mode 100755
index 2195f83..7e1fe9f
--- a/target/msm8953/init.c
+++ b/target/msm8953/init.c
@@ -61,6 +61,9 @@
#include "target/display.h"
#include "recovery.h"
#include <ab_partition_parser.h>
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#include <devinfo.h>
+/*[20200605][TracyChui] Implement get Serial Number end*/
#if LONG_PRESS_POWER_ON
#include <shutdown_detect.h>
@@ -418,11 +421,22 @@
void target_serialno(unsigned char *buf)
{
+/*[20200605][TracyChui] Implement get Serial Number start*/
+#if defined(ENABLE_PRODINFO_ACCESS)
+ prod_info prod = {PRODINFO_MAGIC, {0}, {0}, 0};
+ if (target_is_emmc_boot()) {
+ read_prod_info(&prod);
+ snprintf((char *)buf, PRODINFO_MAX_SSN_LEN + 1, "%s", prod.ssn);
+ }
+#else
uint32_t serialno;
if (target_is_emmc_boot()) {
serialno = mmc_get_psn();
snprintf((char *)buf, 13, "%x", serialno);
}
+#endif
+/*[20200605][TracyChui] Implement get Serial Number end */
+
}
unsigned board_machtype(void)