xref: /rk3399_rockchip-uboot/cmd/rkimgtest.c (revision 73ec4e0398125f41aa20c70f6316416e96a4e8d2)
1*73ec4e03SJoseph Chen /*
2*73ec4e03SJoseph Chen  * (C) Copyright 2019 Rockchip Electronics Co., Ltd
3*73ec4e03SJoseph Chen  *
4*73ec4e03SJoseph Chen  * SPDX-License-Identifier:     GPL-2.0+
5*73ec4e03SJoseph Chen  */
6*73ec4e03SJoseph Chen 
7*73ec4e03SJoseph Chen #include <common.h>
8*73ec4e03SJoseph Chen #include <malloc.h>
9*73ec4e03SJoseph Chen 
10*73ec4e03SJoseph Chen static int do_rkimg_test(cmd_tbl_t *cmdtp, int flag,
11*73ec4e03SJoseph Chen 			 int argc, char *const argv[])
12*73ec4e03SJoseph Chen {
13*73ec4e03SJoseph Chen 	struct blk_desc *dev_desc;
14*73ec4e03SJoseph Chen 	u32 *buffer;
15*73ec4e03SJoseph Chen 	int ret;
16*73ec4e03SJoseph Chen 
17*73ec4e03SJoseph Chen 	if (argc != 3)
18*73ec4e03SJoseph Chen 		return CMD_RET_USAGE;
19*73ec4e03SJoseph Chen 
20*73ec4e03SJoseph Chen 	dev_desc = blk_get_dev(argv[1], simple_strtoul(argv[2], NULL, 16));
21*73ec4e03SJoseph Chen 	if (!dev_desc) {
22*73ec4e03SJoseph Chen 		printf("%s: dev_desc is NULL!\n", __func__);
23*73ec4e03SJoseph Chen 		return CMD_RET_FAILURE;
24*73ec4e03SJoseph Chen 	}
25*73ec4e03SJoseph Chen 
26*73ec4e03SJoseph Chen 	/* read one block from beginning of IDB data */
27*73ec4e03SJoseph Chen 	buffer = memalign(ARCH_DMA_MINALIGN, 1024);
28*73ec4e03SJoseph Chen 	ret = blk_dread(dev_desc, 64, 2, buffer);
29*73ec4e03SJoseph Chen 	if (ret != 2) {
30*73ec4e03SJoseph Chen 		printf("%s: Failed to read data from IDB\n", __func__);
31*73ec4e03SJoseph Chen 		free(buffer);
32*73ec4e03SJoseph Chen 		return CMD_RET_FAILURE;
33*73ec4e03SJoseph Chen 	}
34*73ec4e03SJoseph Chen 
35*73ec4e03SJoseph Chen 	if (buffer[0] == 0xFCDC8C3B) {
36*73ec4e03SJoseph Chen 		ret = CMD_RET_SUCCESS;
37*73ec4e03SJoseph Chen 
38*73ec4e03SJoseph Chen 		if (!strcmp("mmc", argv[1]))
39*73ec4e03SJoseph Chen 			printf("Found IDB in SDcard\n");
40*73ec4e03SJoseph Chen 		else
41*73ec4e03SJoseph Chen 			printf("Found IDB in U-disk\n");
42*73ec4e03SJoseph Chen 
43*73ec4e03SJoseph Chen 		/* TAG in IDB */
44*73ec4e03SJoseph Chen 		if (0 == buffer[128 + 104 / 4]) {
45*73ec4e03SJoseph Chen 			if (!strcmp("mmc", argv[1]))
46*73ec4e03SJoseph Chen 				env_update("bootargs", "sdfwupdate");
47*73ec4e03SJoseph Chen 			else
48*73ec4e03SJoseph Chen 				env_update("bootargs", "usbfwupdate");
49*73ec4e03SJoseph Chen 		}
50*73ec4e03SJoseph Chen 	} else {
51*73ec4e03SJoseph Chen 		ret = CMD_RET_FAILURE;
52*73ec4e03SJoseph Chen 	}
53*73ec4e03SJoseph Chen 
54*73ec4e03SJoseph Chen 	free(buffer);
55*73ec4e03SJoseph Chen 
56*73ec4e03SJoseph Chen 	return ret;
57*73ec4e03SJoseph Chen }
58*73ec4e03SJoseph Chen 
59*73ec4e03SJoseph Chen U_BOOT_CMD(
60*73ec4e03SJoseph Chen 	rkimgtest, 3, 0,    do_rkimg_test,
61*73ec4e03SJoseph Chen 	"Test if storage media have rockchip image",
62*73ec4e03SJoseph Chen 	"<devtype> <devnum>"
63*73ec4e03SJoseph Chen );
64