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