lin
2025-03-22 34bf7c4dd3c00c587f836898977857f2fe9bac74
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*
 *  * Copyright 2000-2009
 *   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 *    *
 *     * SPDX-License-Identifier:    GPL-2.0+
 *     */
#include <common.h>
#include <config.h>
#include <command.h>
#include <sunxi_board.h>
#include <sprite.h>
DECLARE_GLOBAL_DATA_PTR;
 
#define PL_CFG1_ADDR  0x07022004
#define PL_DAT_ADDR  0x07022010
 
#ifdef CONFIG_SUNXI_AUTO_UPDATE
extern int sunxi_auto_update_main(void);
extern int sunxi_board_shutdown(void);
#endif
 
 
int do_sprite_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
   __maybe_unused int ret;
   printf("sunxi work mode=0x%x\n", get_boot_work_mode());
   if(get_boot_work_mode() == WORK_MODE_USB_PRODUCT) {
       printf("run usb efex\n");
       if(sunxi_usb_dev_register(2))
       {
           printf("invalid usb device\n");
       }
       sunxi_usb_main_loop(2500);
   }
#ifdef CONFIG_SUNXI_SDMMC
   else if (get_boot_work_mode() == WORK_MODE_CARD_PRODUCT) {
       printf("run card sprite\n");
 
       u32 reg_val;
       reg_val = readl(PL_CFG1_ADDR);
       reg_val &= ~(0x700);
       reg_val |= 0x100;
       writel(reg_val, PL_CFG1_ADDR);
       reg_val = readl(PL_DAT_ADDR);
       reg_val |= 0x400;        
       writel(reg_val, PL_DAT_ADDR);
 
       sprite_led_init();
       ret = sunxi_card_sprite_main(0, NULL);
       sprite_led_exit(ret);
       return ret;
   }
#endif
#ifdef CONFIG_SUNXI_SPRITE_RECOVERY
   else if (get_boot_work_mode() == WORK_MODE_SPRITE_RECOVERY) {
       printf("run sprite recovery\n");
       sprite_led_init();
       ret = sprite_form_sysrecovery();
       sprite_led_exit(ret);
       return ret;
   }
#endif
#ifdef CONFIG_SUNXI_AUTO_UPDATE
   else if (get_boot_work_mode() == WORK_MODE_CARD_UPDATE ||
       get_boot_work_mode() == WORK_MODE_UDISK_UPDATE) {
       printf("run auto update\n");
       sprite_led_init();
       ret = sunxi_auto_update_main();
       sprite_led_exit(ret);
       if (!ret) {
           printf("update finish,going to poweroff the system...\n");
           sunxi_update_subsequent_processing(SUNXI_UPDATE_NEXT_ACTION_SHUTDOWN);
       }
       return ret;
   }
#endif
   else {
       printf("others\n");
   }
 
   return 0;
}
 
U_BOOT_CMD(
   sprite_test, 2, 0, do_sprite_test,
   "do a sprite test",
   "NULL"
);