xref: /rk3399_rockchip-uboot/cmd/rkimgtest.c (revision 6230e224c58a87faad6939b906edc7d042109e70)
173ec4e03SJoseph Chen /*
273ec4e03SJoseph Chen  * (C) Copyright 2019 Rockchip Electronics Co., Ltd
373ec4e03SJoseph Chen  *
473ec4e03SJoseph Chen  * SPDX-License-Identifier:     GPL-2.0+
573ec4e03SJoseph Chen  */
673ec4e03SJoseph Chen 
773ec4e03SJoseph Chen #include <common.h>
873ec4e03SJoseph Chen #include <malloc.h>
973ec4e03SJoseph Chen 
do_rkimg_test(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])1073ec4e03SJoseph Chen static int do_rkimg_test(cmd_tbl_t *cmdtp, int flag,
1173ec4e03SJoseph Chen 			 int argc, char *const argv[])
1273ec4e03SJoseph Chen {
1373ec4e03SJoseph Chen 	struct blk_desc *dev_desc;
1473ec4e03SJoseph Chen 	u32 *buffer;
1573ec4e03SJoseph Chen 	int ret;
1673ec4e03SJoseph Chen 
1773ec4e03SJoseph Chen 	if (argc != 3)
1873ec4e03SJoseph Chen 		return CMD_RET_USAGE;
1973ec4e03SJoseph Chen 
2073ec4e03SJoseph Chen 	dev_desc = blk_get_dev(argv[1], simple_strtoul(argv[2], NULL, 16));
2173ec4e03SJoseph Chen 	if (!dev_desc) {
2273ec4e03SJoseph Chen 		printf("%s: dev_desc is NULL!\n", __func__);
2373ec4e03SJoseph Chen 		return CMD_RET_FAILURE;
2473ec4e03SJoseph Chen 	}
2573ec4e03SJoseph Chen 
2673ec4e03SJoseph Chen 	/* read one block from beginning of IDB data */
2773ec4e03SJoseph Chen 	buffer = memalign(ARCH_DMA_MINALIGN, 1024);
2873ec4e03SJoseph Chen 	ret = blk_dread(dev_desc, 64, 2, buffer);
2973ec4e03SJoseph Chen 	if (ret != 2) {
3073ec4e03SJoseph Chen 		printf("%s: Failed to read data from IDB\n", __func__);
3173ec4e03SJoseph Chen 		free(buffer);
3273ec4e03SJoseph Chen 		return CMD_RET_FAILURE;
3373ec4e03SJoseph Chen 	}
3473ec4e03SJoseph Chen 
3573ec4e03SJoseph Chen 	if (buffer[0] == 0xFCDC8C3B) {
3673ec4e03SJoseph Chen 		ret = CMD_RET_SUCCESS;
3773ec4e03SJoseph Chen 
3873ec4e03SJoseph Chen 		if (!strcmp("mmc", argv[1]))
3973ec4e03SJoseph Chen 			printf("Found IDB in SDcard\n");
4073ec4e03SJoseph Chen 		else
4173ec4e03SJoseph Chen 			printf("Found IDB in U-disk\n");
4273ec4e03SJoseph Chen 
4373ec4e03SJoseph Chen 		/* TAG in IDB */
4473ec4e03SJoseph Chen 		if (0 == buffer[128 + 104 / 4]) {
4573ec4e03SJoseph Chen 			if (!strcmp("mmc", argv[1]))
4673ec4e03SJoseph Chen 				env_update("bootargs", "sdfwupdate");
4773ec4e03SJoseph Chen 			else
4873ec4e03SJoseph Chen 				env_update("bootargs", "usbfwupdate");
4973ec4e03SJoseph Chen 		}
50*6230e224SJason Zhu 	} else if (buffer[0] == 0x534e4b52 || buffer[0] == 0x534e5252) {
51*6230e224SJason Zhu 		/* The 0x534e4b52 & 0x534e5252 are the new idb block header tag */
52*6230e224SJason Zhu 		ret = CMD_RET_SUCCESS;
5373ec4e03SJoseph Chen 	} else {
5473ec4e03SJoseph Chen 		ret = CMD_RET_FAILURE;
5573ec4e03SJoseph Chen 	}
5673ec4e03SJoseph Chen 
5773ec4e03SJoseph Chen 	free(buffer);
5873ec4e03SJoseph Chen 
5973ec4e03SJoseph Chen 	return ret;
6073ec4e03SJoseph Chen }
6173ec4e03SJoseph Chen 
6273ec4e03SJoseph Chen U_BOOT_CMD(
6373ec4e03SJoseph Chen 	rkimgtest, 3, 0,    do_rkimg_test,
6473ec4e03SJoseph Chen 	"Test if storage media have rockchip image",
6573ec4e03SJoseph Chen 	"<devtype> <devnum>"
6673ec4e03SJoseph Chen );
67