factoryBurn: dnl: add burn single bootloader cpy [1/1]
PD#SWPL-196940
Problem:
need support burn only one bootloader copy
Solution:
add support part bootloader-user/boot0/boot1
Verify:
t950d5
Change-Id: Ieb700423f54501a73235d95bc8234d73eb948997
Signed-off-by: yihui wu <yihui.wu@amlogic.com>
diff --git a/cmd/amlogic/bootloader_status.c b/cmd/amlogic/bootloader_status.c
index fdfac02..d78c529 100644
--- a/cmd/amlogic/bootloader_status.c
+++ b/cmd/amlogic/bootloader_status.c
@@ -364,12 +364,14 @@
return -1;
}
+#ifdef CONFIG_MESON_S7D
iret = update_boot_hdr_4_s7d_reva(buffer, BOOTLOADER_MAX_SIZE - BOOTLOADER_OFFSET, 0);
if (iret) {
printf("Failed to write s7d reva boot0\n");
free(buffer);
return -1;
}
+#endif//#ifdef CONFIG_MESON_S7D
iret = store_boot_write("bootloader", i, BOOTLOADER_MAX_SIZE - BOOTLOADER_OFFSET, buffer);
if (iret) {
diff --git a/cmd/amlogic/store_wrapper.c b/cmd/amlogic/store_wrapper.c
index c07f6d3..213c529 100644
--- a/cmd/amlogic/store_wrapper.c
+++ b/cmd/amlogic/store_wrapper.c
@@ -9,6 +9,7 @@
#include <asm/amlogic/arch/cpu_config.h>
#include <amlogic/store_wrapper.h>
#include <u-boot/sha256.h>
+#include <amlogic/aml_mmc.h>
#define debugP(fmt...) //printf("Dbg[WRP]L%d:", __LINE__),printf(fmt)
#define errorP(fmt...) printf("Err[WRP]L%d:", __LINE__),printf(fmt)
@@ -150,6 +151,113 @@
return ret;
}
+#ifdef CONFIG_CMD_MMC
+static int _amlmmc_rdwr_bootloader(int dev, int map, unsigned int size, void *src, int iswrite)
+{
+ int ret = 0, i, count = 3;
+ unsigned long n;
+ char *partname[3] = {"user", "boot0", "boot1"};
+ struct mmc *mmc = NULL;
+ lbaint_t start = 1, blkcnt;
+
+ mmc = find_mmc_device(dev);
+ if (!mmc) {
+ printf("%s() %d: not valid emmc %d\n", __func__, __LINE__, dev);
+ return -1;
+ }
+ /* make sure mmc is initialized! */
+ ret = mmc_init(mmc);
+ if (ret) {
+ printf("%s() %d: emmc %d init %d\n", __func__, __LINE__, dev, ret);
+ return -2;
+ }
+
+ blkcnt = (size + mmc->read_bl_len - 1) / mmc->read_bl_len;
+
+ /* erase bootloader in user/boot0/boot1 */
+ for (i = 0; i < count; i++) {
+ if (map & (1 << i)) {
+ if (blk_select_hwpart_devnum(UCLASS_MMC, 1, i)) {
+ printf("%s() %d: switch dev %d to %s fail\n",
+ __func__, __LINE__, dev, partname[i]);
+ ret = -3;
+ break;
+ }
+
+ printf("To %s " LBAFU " blocks at " LBAFU " @%s\n",
+ iswrite ? "Write" : "Read", blkcnt, start, partname[i]);
+ if (iswrite)
+ n = blk_dwrite(mmc_get_blk_desc(mmc), start, blkcnt, src);
+ else
+ n = blk_dread(mmc_get_blk_desc(mmc), start, blkcnt, src);
+ if (n != blkcnt) {
+ printf("mmc rd/wr %s failed\n", partname[i]);
+ ret = -4;
+ break;
+ }
+ }
+ }
+
+ /* try to switch back to user. */
+ if (blk_select_hwpart_devnum(UCLASS_MMC, 1, 0)) {
+ errorP("Fail switch to user\n");
+ return -5;
+ }
+ return ret;
+}
+#else
+static int _amlmmc_rdwr_bootloader(int dev, int map, unsigned int size, void *src, int iswrite)
+{
+ errorP("MMC not enable\n");
+ return -1;
+}
+#endif// #ifdef CONFIG_CMD_MMC
+
+static int _amlmmc_write_bootloader(int dev, int map, unsigned int size, void *src)
+{
+ return _amlmmc_rdwr_bootloader(dev, map, size, src, 1);
+}
+
+static int _amlmmc_read_bootloader(int dev, int map, unsigned int size, void *src)
+{
+ return _amlmmc_rdwr_bootloader(dev, map, size, src, 0);
+}
+
+int store_bootloader_ops(int ops, const char *name, void *pdata, unsigned int szdata)
+{
+ int map = 0;
+ int cpy = 0;
+ int ret = -1;
+ const int DEV = 1;
+ const char *_names[] = {"bootloader-user", "bootloader-boot0", "bootloader-boot1"};
+
+ for (; cpy < ARRAY_SIZE(_names); ++cpy) {
+ if (!strcmp(_names[cpy], name))
+ break;
+ }
+ if (cpy > 2) {
+ errorP("inval cpy %d\n", cpy);
+ return -__LINE__;
+ }
+ map = (1<<cpy);
+ switch (ops) {
+ case _STORE_BOOT_OP_WRITE: {
+ ret = _amlmmc_write_bootloader(DEV, map, szdata, pdata);
+ break;
+ }
+ case _STORE_BOOT_OP_READ: {
+ ret = _amlmmc_read_bootloader(DEV, map, szdata, pdata);
+ break;
+ }
+ case _STORE_BOOT_OP_ERASE:
+ default:
+ errorP("inval op:%d\n", ops);
+ return -__LINE__;
+ }
+
+ return ret;
+}
+
#ifndef CONFIG_AML_V3_FACTORY_BURN//storage wrapper
#define FB_ERR(fmt ...) printf("[ERR]%s:L%d:", __func__, __LINE__), printf(fmt)
#define FB_EXIT(fmt ...) do { FB_ERR(fmt); return -__LINE__; } while (0)
diff --git a/drivers/fastboot/fb_command.c b/drivers/fastboot/fb_command.c
index a6a1664..5650311 100644
--- a/drivers/fastboot/fb_command.c
+++ b/drivers/fastboot/fb_command.c
@@ -610,12 +610,14 @@
char *slot_name = NULL;
char partname[32] = {0};
+#ifdef CONFIG_MESON_S7D
ret = update_boot_hdr_4_s7d_reva(fastboot_buf_addr, image_size, 0);
if (ret) {
printf("Failed to write s7d reva boot0\n");
fastboot_fail("Failed to write s7d reva boot0", response);
return;
}
+#endif//#ifdef CONFIG_MESON_S7D
slot_name = env_get("active_slot");
if (slot_name && (strcmp(slot_name, "_a") == 0))
@@ -807,12 +809,14 @@
strcpy(name, "dtb");
} else if (!strcmp(cmd_parameter, "bootloader-boot0") ||
!strcmp(cmd_parameter, "bootloader-boot1")) {
+#ifdef CONFIG_MESON_S7D
ret = update_boot_hdr_4_s7d_reva(fastboot_buf_addr, image_size, 0);
if (ret) {
printf("Failed to write s7d reva boot0\n");
fastboot_fail("Failed to write s7d reva boot0-1", response);
return;
}
+#endif//#ifdef CONFIG_MESON_S7D
strlcpy(name, cmd_parameter, 31);
} else {
strlcpy(name, cmd_parameter, 31);
diff --git a/drivers/usb/gadget/v3_burning/v3_common/v3_tool_buff_manager.c b/drivers/usb/gadget/v3_burning/v3_common/v3_tool_buff_manager.c
index ab6208a..a5ad2bb 100644
--- a/drivers/usb/gadget/v3_burning/v3_common/v3_tool_buff_manager.c
+++ b/drivers/usb/gadget/v3_burning/v3_common/v3_tool_buff_manager.c
@@ -82,6 +82,9 @@
if (!strcmp("bootloader", part)) {
ret = bootloader_read(vryBuff, 0, imgTotalLen);
sha1_update(&ctx, vryBuff, imgTotalLen);
+ } else if (!strncmp("bootloader-", part, strnlen("bootloader-", 12))) {
+ ret = store_bootloader_ops(_STORE_BOOT_OP_READ, part, vryBuff, imgTotalLen);
+ sha1_update(&ctx, vryBuff, imgTotalLen);
} else if (!strcmp("_aml_dtb", part)) {
ret = store_dtb_rw(vryBuff, imgTotalLen, 2);
sha1_update(&ctx, vryBuff, imgTotalLen);
@@ -283,6 +286,7 @@
if (strcmp("bootloader", cmnInf->partName) &&
strcmp("_aml_dtb", cmnInf->partName) &&
+ strncmp("bootloader-", cmnInf->partName, strnlen("bootloader-", 12)) &&
strcmp("gpt", cmnInf->partName))
_usbDownInf.dataSize = _mymin(leftLen, _RAW_IMG_TRANSFER_LEN);
else
@@ -398,6 +402,9 @@
case V3TOOL_MEDIA_TYPE_STORE: {
if (!strcmp("bootloader", partName)) {
ret = bootloader_write(dataBuf, 0, thisTransferLen);
+ } else if (!strncmp("bootloader-", partName, strnlen("bootloader-", 12))) {
+ FB_MSG("write %s \n", partName);
+ ret = store_bootloader_ops(_STORE_BOOT_OP_WRITE, partName, dataBuf, thisTransferLen);
} else if (!strcmp("_aml_dtb", partName)) {
ret = store_dtb_rw(dataBuf, thisTransferLen, 1);
} else if (!strcmp("gpt", partName)) {
@@ -483,12 +490,16 @@
case V3TOOL_MEDIA_TYPE_STORE: {
if (!strcmp("bootloader", partName) ||
!strcmp("_aml_dtb", partName) ||
+ !strncmp("bootloader-", partName, strnlen("bootloader-", 12)) ||
!strcmp("gpt", partName)) {
_usbUpInf.dataSize = leftLen;
dataSize = leftLen;
}
if (!strcmp("bootloader", partName)) {
ret = bootloader_read(dataBuf, 0, dataSize);
+ } else if (!strncmp("bootloader-", partName, strnlen("bootloader-", 12))) {
+ FB_MSG("write %s \n", partName);
+ ret = store_bootloader_ops(_STORE_BOOT_OP_READ, partName, dataBuf, dataSize);
} else if (!strcmp("_aml_dtb", partName)) {
//'2' means using 'store dtb iread' rather than 'read'
ret = store_dtb_rw(dataBuf, dataSize, 2);
diff --git a/drivers/usb/gadget/v3_burning/v3_common/v3_tool_media.c b/drivers/usb/gadget/v3_burning/v3_common/v3_tool_media.c
index 30e046f..37cb3c7 100644
--- a/drivers/usb/gadget/v3_burning/v3_common/v3_tool_media.c
+++ b/drivers/usb/gadget/v3_burning/v3_common/v3_tool_media.c
@@ -340,6 +340,7 @@
return 0;
}
+#ifdef CONFIG_MESON_S7D
int update_boot_hdr_4_s7d_reva(u8 *data_buf, unsigned int binsz, int isread)
{
const cpu_id_t cpuid = get_cpu_id();
@@ -394,6 +395,7 @@
FB_MSG("boot hdr changed\n");
return 0;
}
+#endif//#ifdef CONFIG_MESON_S7D
int bootloader_write(u8 *dataBuf, unsigned off, unsigned binsz)
{
@@ -403,10 +405,12 @@
//_bl2x_mode_check_header(pInfo);
if (is_bootloader_discrte(&discreteMode))
return -__LINE__;
+#ifdef CONFIG_MESON_S7D
if (update_boot_hdr_4_s7d_reva(dataBuf, binsz, 0)) {
FB_ERR("Fail in update x5m inf\n");
return -__LINE__;
}
+#endif//#ifdef CONFIG_MESON_S7D
if (!discreteMode) {
return _bootloader_write(dataBuf, off, binsz, "bootloader");
} else {
@@ -569,10 +573,13 @@
memcpy(pBuf, src_data, binsz);
}
#endif//#ifdef CONFIG_UPDATE_UBOOT_NOCS
+#ifdef CONFIG_MESON_S7D
if (update_boot_hdr_4_s7d_reva(pBuf, binsz, 1)) {
FB_ERR("Fail in update x5m inf\n");
return -__LINE__;
}
+#endif//#ifdef CONFIG_MESON_S7D
+
return 0;
}
@@ -613,11 +620,14 @@
#endif// #if 1//storage wrapper
-int v3tool_media_check_image_size(int64_t imgsz, const char *part)
+int v3tool_media_check_image_size(int64_t imgsz, const char *_part)
{
int ret = 0;
u64 partcap = 0;
+ const char *part = _part;
+ if (!strncmp("bootloader-", part, strnlen("bootloader-", 11)))
+ part = "bootloader";
if (!strcmp("bootloader", part)) {
const unsigned int bootSz = bootloader_copy_sz();
if (imgsz > bootSz)
@@ -800,7 +810,8 @@
FB_MSG("remain bootloader as nocs scs chip\n");
ret = usb_burn_erase_data(1);
} else {
- if (v3tool_work_mode_get() == V3TOOL_WORK_MODE_USB_PRODUCE) {
+ if (v3tool_work_mode_get() == V3TOOL_WORK_MODE_USB_PRODUCE ||
+ store_get_type() != BOOT_EMMC) {
ret = store_erase(NULL, 0, 0, 0);
} else {
FB_MSG("remain bootloader as not usb boot\n");
diff --git a/include/amlogic/store_wrapper.h b/include/amlogic/store_wrapper.h
index 6a38566..a520402 100644
--- a/include/amlogic/store_wrapper.h
+++ b/include/amlogic/store_wrapper.h
@@ -19,6 +19,15 @@
int store_boot_copy_enable(int id);
+enum {
+ _STORE_BOOT_OP_WRITE = 0,
+ _STORE_BOOT_OP_READ,
+ _STORE_BOOT_OP_ERASE,
+ _STORE_BOOT_OP_NUM
+};
+
+int store_bootloader_ops(int ops, const char *name, void *pdata, unsigned int szdata);
+
int update_boot_hdr_4_s7d_reva(u8 *data_buf, unsigned int binsz, int isread);
#ifdef CONFIG_CMD_MMC
int usb_burn_erase_data(unsigned char init_flag);