mirror of
https://git.codelinaro.org/clo/qsdk/oss/boot/u-boot-2016.git
synced 2025-12-10 07:44:53 +01:00
Flash: Adding support to change flash type
Adding a new command 'flupdate' to change the flash type to mmc/nand/nor. flupdate set will set the flash type to the provided type. flupdate clear will reset the flash type to default. Command usage: flupdate set mmc/nand/nor flupdate clear Change-Id: Ib328cc1fea0b37f27e6479d55fce08365fbfcf69 Signed-off-by: Hariharan K <quic_harihk@quicinc.com>
This commit is contained in:
parent
db31f148ec
commit
f8a0c7a770
1 changed files with 72 additions and 28 deletions
|
|
@ -52,6 +52,8 @@ struct header {
|
||||||
} __attribute__ ((__packed__));
|
} __attribute__ ((__packed__));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
uint32_t flash_type_new = -1;
|
||||||
|
|
||||||
static int write_to_flash(int flash_type, uint32_t address, uint32_t offset,
|
static int write_to_flash(int flash_type, uint32_t address, uint32_t offset,
|
||||||
uint32_t part_size, uint32_t file_size, char *layout)
|
uint32_t part_size, uint32_t file_size, char *layout)
|
||||||
{
|
{
|
||||||
|
|
@ -204,7 +206,7 @@ char * const argv[])
|
||||||
uint32_t file_size = 0;
|
uint32_t file_size = 0;
|
||||||
uint32_t size_block, start_block, file_size_cpy;
|
uint32_t size_block, start_block, file_size_cpy;
|
||||||
char *part_name = NULL, *filesize, *loadaddr;
|
char *part_name = NULL, *filesize, *loadaddr;
|
||||||
int flash_type, ret, retn;
|
int flash_type, ret;
|
||||||
unsigned int active_part = 0;
|
unsigned int active_part = 0;
|
||||||
char *layout = NULL;
|
char *layout = NULL;
|
||||||
#ifdef CONFIG_IPQ806X
|
#ifdef CONFIG_IPQ806X
|
||||||
|
|
@ -214,13 +216,14 @@ char * const argv[])
|
||||||
offset = 0;
|
offset = 0;
|
||||||
part_size = 0;
|
part_size = 0;
|
||||||
layout = "default";
|
layout = "default";
|
||||||
retn = CMD_RET_FAILURE;
|
ret = CMD_RET_USAGE;
|
||||||
|
|
||||||
#ifdef CONFIG_QCA_MMC
|
#ifdef CONFIG_QCA_MMC
|
||||||
block_dev_desc_t *blk_dev;
|
block_dev_desc_t *blk_dev;
|
||||||
#endif
|
#endif
|
||||||
disk_partition_t disk_info = {0};
|
disk_partition_t disk_info = {0};
|
||||||
qca_smem_flash_info_t *sfi = &qca_smem_flash_info;
|
qca_smem_flash_info_t *sfi = &qca_smem_flash_info;
|
||||||
|
flash_type = (flash_type_new != -1) ? flash_type_new : sfi->flash_type;
|
||||||
#ifdef CONFIG_CMD_NAND
|
#ifdef CONFIG_CMD_NAND
|
||||||
nand_info_t *nand = &nand_info[CONFIG_NAND_FLASH_INFO_IDX];
|
nand_info_t *nand = &nand_info[CONFIG_NAND_FLASH_INFO_IDX];
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -229,49 +232,48 @@ char * const argv[])
|
||||||
|
|
||||||
if (flash_cmd) {
|
if (flash_cmd) {
|
||||||
if ((argc < 2) || (argc > 4))
|
if ((argc < 2) || (argc > 4))
|
||||||
return CMD_RET_USAGE;
|
goto exit;
|
||||||
|
|
||||||
if (argc == 2) {
|
if (argc == 2) {
|
||||||
loadaddr = getenv("fileaddr");
|
loadaddr = getenv("fileaddr");
|
||||||
if (loadaddr != NULL)
|
if (loadaddr != NULL)
|
||||||
load_addr = simple_strtoul(loadaddr, NULL, 16);
|
load_addr = simple_strtoul(loadaddr, NULL, 16);
|
||||||
else
|
else
|
||||||
return CMD_RET_USAGE;
|
goto exit;
|
||||||
|
|
||||||
filesize = getenv("filesize");
|
filesize = getenv("filesize");
|
||||||
if (filesize != NULL)
|
if (filesize != NULL)
|
||||||
file_size = simple_strtoul(filesize, NULL, 16);
|
file_size = simple_strtoul(filesize, NULL, 16);
|
||||||
else
|
else
|
||||||
return CMD_RET_USAGE;
|
goto exit;
|
||||||
|
|
||||||
} else if (argc == 4) {
|
} else if (argc == 4) {
|
||||||
load_addr = simple_strtoul(argv[2], NULL, 16);
|
load_addr = simple_strtoul(argv[2], NULL, 16);
|
||||||
file_size = simple_strtoul(argv[3], NULL, 16);
|
file_size = simple_strtoul(argv[3], NULL, 16);
|
||||||
|
|
||||||
} else
|
} else
|
||||||
return CMD_RET_USAGE;
|
goto exit;
|
||||||
|
|
||||||
file_size_cpy = file_size;
|
file_size_cpy = file_size;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (argc != 2)
|
if (argc != 2)
|
||||||
return CMD_RET_USAGE;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
flash_type = sfi->flash_type;
|
|
||||||
part_name = argv[1];
|
part_name = argv[1];
|
||||||
|
|
||||||
if (((sfi->flash_type == SMEM_BOOT_NAND_FLASH) ||
|
if (((flash_type == SMEM_BOOT_NAND_FLASH) ||
|
||||||
(sfi->flash_type == SMEM_BOOT_QSPI_NAND_FLASH))) {
|
(flash_type == SMEM_BOOT_QSPI_NAND_FLASH))) {
|
||||||
|
|
||||||
ret = smem_getpart(part_name, &start_block, &size_block);
|
ret = smem_getpart(part_name, &start_block, &size_block);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
#ifdef IPQ_UBI_VOL_WRITE_SUPPORT
|
#ifdef IPQ_UBI_VOL_WRITE_SUPPORT
|
||||||
if (ubi_vol_present(part_name))
|
if (ubi_vol_present(part_name))
|
||||||
return write_ubi_vol(part_name, load_addr,
|
ret = write_ubi_vol(part_name, load_addr,
|
||||||
file_size);
|
file_size);
|
||||||
#endif
|
#endif
|
||||||
return retn;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
offset = sfi->flash_block_size * start_block;
|
offset = sfi->flash_block_size * start_block;
|
||||||
|
|
@ -293,8 +295,8 @@ char * const argv[])
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_QCA_MMC
|
#ifdef CONFIG_QCA_MMC
|
||||||
} else if (sfi->flash_type == SMEM_BOOT_MMC_FLASH ||
|
} else if (flash_type == SMEM_BOOT_MMC_FLASH ||
|
||||||
sfi->flash_type == SMEM_BOOT_NO_FLASH) {
|
flash_type == SMEM_BOOT_NO_FLASH) {
|
||||||
|
|
||||||
blk_dev = mmc_get_dev(mmc_host.dev_num);
|
blk_dev = mmc_get_dev(mmc_host.dev_num);
|
||||||
if (blk_dev != NULL) {
|
if (blk_dev != NULL) {
|
||||||
|
|
@ -319,14 +321,13 @@ char * const argv[])
|
||||||
ret = get_partition_info_efi_by_name(blk_dev,
|
ret = get_partition_info_efi_by_name(blk_dev,
|
||||||
part_name, &disk_info);
|
part_name, &disk_info);
|
||||||
if (ret)
|
if (ret)
|
||||||
return retn;
|
goto exit;
|
||||||
|
|
||||||
offset = (ulong)disk_info.start;
|
offset = (ulong)disk_info.start;
|
||||||
part_size = (ulong)disk_info.size;
|
part_size = (ulong)disk_info.size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else if (sfi->flash_type == SMEM_BOOT_SPI_FLASH) {
|
} else if (flash_type == SMEM_BOOT_SPI_FLASH) {
|
||||||
|
|
||||||
if (get_which_flash_param(part_name)) {
|
if (get_which_flash_param(part_name)) {
|
||||||
|
|
||||||
|
|
@ -334,7 +335,7 @@ char * const argv[])
|
||||||
flash_type = SMEM_BOOT_NAND_FLASH;
|
flash_type = SMEM_BOOT_NAND_FLASH;
|
||||||
ret = getpart_offset_size(part_name, &offset, &part_size);
|
ret = getpart_offset_size(part_name, &offset, &part_size);
|
||||||
if (ret)
|
if (ret)
|
||||||
return retn;
|
goto exit;
|
||||||
|
|
||||||
} else if (((sfi->flash_secondary_type == SMEM_BOOT_NAND_FLASH)||
|
} else if (((sfi->flash_secondary_type == SMEM_BOOT_NAND_FLASH)||
|
||||||
(sfi->flash_secondary_type == SMEM_BOOT_QSPI_NAND_FLASH))
|
(sfi->flash_secondary_type == SMEM_BOOT_QSPI_NAND_FLASH))
|
||||||
|
|
@ -379,7 +380,7 @@ char * const argv[])
|
||||||
ret = get_partition_info_efi_by_name(blk_dev,
|
ret = get_partition_info_efi_by_name(blk_dev,
|
||||||
part_name, &disk_info);
|
part_name, &disk_info);
|
||||||
if (ret)
|
if (ret)
|
||||||
return retn;
|
goto exit;
|
||||||
|
|
||||||
offset = (ulong)disk_info.start;
|
offset = (ulong)disk_info.start;
|
||||||
part_size = (ulong)disk_info.size;
|
part_size = (ulong)disk_info.size;
|
||||||
|
|
@ -387,16 +388,15 @@ char * const argv[])
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
ret = smem_getpart(part_name, &start_block,
|
ret = smem_getpart(part_name, &start_block,
|
||||||
&size_block);
|
&size_block);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
#ifdef IPQ_UBI_VOL_WRITE_SUPPORT
|
#ifdef IPQ_UBI_VOL_WRITE_SUPPORT
|
||||||
if (ubi_vol_present(part_name))
|
if (ubi_vol_present(part_name))
|
||||||
return write_ubi_vol(part_name,
|
ret = write_ubi_vol(part_name,
|
||||||
load_addr, file_size);
|
load_addr, file_size);
|
||||||
#endif
|
#endif
|
||||||
return retn;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
offset = sfi->flash_block_size * start_block;
|
offset = sfi->flash_block_size * start_block;
|
||||||
|
|
@ -409,9 +409,11 @@ char * const argv[])
|
||||||
if (((flash_type == SMEM_BOOT_NAND_FLASH) ||
|
if (((flash_type == SMEM_BOOT_NAND_FLASH) ||
|
||||||
(flash_type == SMEM_BOOT_QSPI_NAND_FLASH))) {
|
(flash_type == SMEM_BOOT_QSPI_NAND_FLASH))) {
|
||||||
|
|
||||||
adj_size = file_size % nand->writesize;
|
if (nand->writesize) {
|
||||||
if (adj_size)
|
adj_size = file_size % nand->writesize;
|
||||||
file_size = file_size + (nand->writesize - adj_size);
|
if (adj_size)
|
||||||
|
file_size = file_size + (nand->writesize - adj_size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (flash_type == SMEM_BOOT_MMC_FLASH) {
|
if (flash_type == SMEM_BOOT_MMC_FLASH) {
|
||||||
|
|
@ -426,15 +428,18 @@ char * const argv[])
|
||||||
|
|
||||||
if (file_size > part_size) {
|
if (file_size > part_size) {
|
||||||
printf("Image size is greater than partition memory\n");
|
printf("Image size is greater than partition memory\n");
|
||||||
return CMD_RET_FAILURE;
|
ret = CMD_RET_FAILURE;
|
||||||
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = write_to_flash(flash_type, load_addr, offset, part_size,
|
ret = write_to_flash(flash_type, load_addr, offset, part_size,
|
||||||
file_size, layout);
|
file_size, layout);
|
||||||
} else
|
} else
|
||||||
ret = fl_erase(flash_type, offset, part_size, layout);
|
ret = fl_erase(flash_type, offset, part_size, layout);
|
||||||
|
exit:
|
||||||
return ret;
|
if (ret)
|
||||||
|
flash_type_new = -1;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_IPQ_MIBIB_RELOAD
|
#ifdef CONFIG_IPQ_MIBIB_RELOAD
|
||||||
|
|
@ -597,6 +602,39 @@ char * const argv[])
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int do_flupdate(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||||
|
char * const argv[])
|
||||||
|
{
|
||||||
|
int ret = CMD_RET_USAGE;
|
||||||
|
|
||||||
|
if (argc < 2 || argc > 3)
|
||||||
|
goto quit;
|
||||||
|
|
||||||
|
if (!strncmp(argv[1], "set", 3)) {
|
||||||
|
if(argc != 3)
|
||||||
|
goto quit;
|
||||||
|
if (!strncmp(argv[2], "mmc", 3))
|
||||||
|
flash_type_new = SMEM_BOOT_MMC_FLASH;
|
||||||
|
else if (!strncmp(argv[2], "nor", 3))
|
||||||
|
flash_type_new = SMEM_BOOT_SPI_FLASH;
|
||||||
|
else if (!strncmp(argv[2], "nand", 4))
|
||||||
|
flash_type_new = SMEM_BOOT_QSPI_NAND_FLASH;
|
||||||
|
else {
|
||||||
|
flash_type_new = -1;
|
||||||
|
goto quit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[1], "clear", 5)) /* set flash type to default */
|
||||||
|
flash_type_new = -1;
|
||||||
|
else
|
||||||
|
goto quit;
|
||||||
|
|
||||||
|
ret = CMD_RET_SUCCESS;
|
||||||
|
quit:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
U_BOOT_CMD(
|
U_BOOT_CMD(
|
||||||
flash, 4, 0, do_flash,
|
flash, 4, 0, do_flash,
|
||||||
"flash part_name \n"
|
"flash part_name \n"
|
||||||
|
|
@ -633,3 +671,9 @@ U_BOOT_CMD(
|
||||||
"Init the flash \n"
|
"Init the flash \n"
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
U_BOOT_CMD(
|
||||||
|
flupdate, 3, 0, do_flupdate,
|
||||||
|
"flupdate set mmc/nand/nor ; flupdate clear \n",
|
||||||
|
"flash type update \n"
|
||||||
|
);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue