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)