1679549d1SPrzemyslaw Marczak /* 2679549d1SPrzemyslaw Marczak * Copyright (C) 2013 Samsung Electronics 3679549d1SPrzemyslaw Marczak * Przemyslaw Marczak <p.marczak@samsung.com> 4679549d1SPrzemyslaw Marczak * 5679549d1SPrzemyslaw Marczak * SPDX-License-Identifier: GPL-2.0+ 6679549d1SPrzemyslaw Marczak */ 7679549d1SPrzemyslaw Marczak 8679549d1SPrzemyslaw Marczak #include <common.h> 9679549d1SPrzemyslaw Marczak #include <lcd.h> 10679549d1SPrzemyslaw Marczak #include <libtizen.h> 11679549d1SPrzemyslaw Marczak #include <samsung/misc.h> 129d29a682SPrzemyslaw Marczak #include <errno.h> 139d29a682SPrzemyslaw Marczak #include <version.h> 141d07c101SPrzemyslaw Marczak #include <malloc.h> 15cf92e05cSSimon Glass #include <memalign.h> 161ace4022SAlexey Brodkin #include <linux/sizes.h> 179d29a682SPrzemyslaw Marczak #include <asm/arch/cpu.h> 189d29a682SPrzemyslaw Marczak #include <asm/gpio.h> 199d29a682SPrzemyslaw Marczak #include <linux/input.h> 20ca2b933aSPrzemyslaw Marczak #include <dm.h> 21*f6e76202SSimon Glass /* 22*f6e76202SSimon Glass * Use #ifdef to work around conflicting headers while we wait for this to be 23*f6e76202SSimon Glass * converted to driver model. 24*f6e76202SSimon Glass */ 25*f6e76202SSimon Glass #ifdef CONFIG_DM_PMIC_MAX77686 26*f6e76202SSimon Glass #include <power/max77686_pmic.h> 27*f6e76202SSimon Glass #endif 28*f6e76202SSimon Glass #ifdef CONFIG_DM_PMIC_MAX8998 29*f6e76202SSimon Glass #include <power/max8998_pmic.h> 30*f6e76202SSimon Glass #endif 31*f6e76202SSimon Glass #ifdef CONFIG_PMIC_MAX8997 32*f6e76202SSimon Glass #include <power/max8997_pmic.h> 33*f6e76202SSimon Glass #endif 349d29a682SPrzemyslaw Marczak #include <power/pmic.h> 359d29a682SPrzemyslaw Marczak #include <mmc.h> 369d29a682SPrzemyslaw Marczak 379d29a682SPrzemyslaw Marczak DECLARE_GLOBAL_DATA_PTR; 389d29a682SPrzemyslaw Marczak 391d07c101SPrzemyslaw Marczak #ifdef CONFIG_SET_DFU_ALT_INFO 40899a5282SPrzemyslaw Marczak void set_dfu_alt_info(char *interface, char *devstr) 411d07c101SPrzemyslaw Marczak { 421d07c101SPrzemyslaw Marczak size_t buf_size = CONFIG_SET_DFU_ALT_BUF_LEN; 431d07c101SPrzemyslaw Marczak ALLOC_CACHE_ALIGN_BUFFER(char, buf, buf_size); 441d07c101SPrzemyslaw Marczak char *alt_info = "Settings not found!"; 451d07c101SPrzemyslaw Marczak char *status = "error!\n"; 461d07c101SPrzemyslaw Marczak char *alt_setting; 471d07c101SPrzemyslaw Marczak char *alt_sep; 481d07c101SPrzemyslaw Marczak int offset = 0; 491d07c101SPrzemyslaw Marczak 501d07c101SPrzemyslaw Marczak puts("DFU alt info setting: "); 511d07c101SPrzemyslaw Marczak 52899a5282SPrzemyslaw Marczak alt_setting = get_dfu_alt_boot(interface, devstr); 531d07c101SPrzemyslaw Marczak if (alt_setting) { 541d07c101SPrzemyslaw Marczak setenv("dfu_alt_boot", alt_setting); 551d07c101SPrzemyslaw Marczak offset = snprintf(buf, buf_size, "%s", alt_setting); 561d07c101SPrzemyslaw Marczak } 571d07c101SPrzemyslaw Marczak 58899a5282SPrzemyslaw Marczak alt_setting = get_dfu_alt_system(interface, devstr); 591d07c101SPrzemyslaw Marczak if (alt_setting) { 601d07c101SPrzemyslaw Marczak if (offset) 611d07c101SPrzemyslaw Marczak alt_sep = ";"; 621d07c101SPrzemyslaw Marczak else 631d07c101SPrzemyslaw Marczak alt_sep = ""; 641d07c101SPrzemyslaw Marczak 651d07c101SPrzemyslaw Marczak offset += snprintf(buf + offset, buf_size - offset, 661d07c101SPrzemyslaw Marczak "%s%s", alt_sep, alt_setting); 671d07c101SPrzemyslaw Marczak } 681d07c101SPrzemyslaw Marczak 691d07c101SPrzemyslaw Marczak if (offset) { 701d07c101SPrzemyslaw Marczak alt_info = buf; 711d07c101SPrzemyslaw Marczak status = "done\n"; 721d07c101SPrzemyslaw Marczak } 731d07c101SPrzemyslaw Marczak 741d07c101SPrzemyslaw Marczak setenv("dfu_alt_info", alt_info); 751d07c101SPrzemyslaw Marczak puts(status); 761d07c101SPrzemyslaw Marczak } 771d07c101SPrzemyslaw Marczak #endif 781d07c101SPrzemyslaw Marczak 79eee2fab0SPiotr Wilczek #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG 80eee2fab0SPiotr Wilczek void set_board_info(void) 81eee2fab0SPiotr Wilczek { 82eee2fab0SPiotr Wilczek char info[64]; 83eee2fab0SPiotr Wilczek 840dc579f3SPrzemyslaw Marczak snprintf(info, ARRAY_SIZE(info), "%u.%u", (s5p_cpu_rev & 0xf0) >> 4, 850dc579f3SPrzemyslaw Marczak s5p_cpu_rev & 0xf); 86eee2fab0SPiotr Wilczek setenv("soc_rev", info); 87eee2fab0SPiotr Wilczek 88eee2fab0SPiotr Wilczek snprintf(info, ARRAY_SIZE(info), "%x", s5p_cpu_id); 89eee2fab0SPiotr Wilczek setenv("soc_id", info); 90eee2fab0SPiotr Wilczek 91eee2fab0SPiotr Wilczek #ifdef CONFIG_REVISION_TAG 92eee2fab0SPiotr Wilczek snprintf(info, ARRAY_SIZE(info), "%x", get_board_rev()); 93eee2fab0SPiotr Wilczek setenv("board_rev", info); 94eee2fab0SPiotr Wilczek #endif 95eee2fab0SPiotr Wilczek #ifdef CONFIG_OF_LIBFDT 96c9c36bf5SPrzemyslaw Marczak const char *bdtype = ""; 97c9c36bf5SPrzemyslaw Marczak const char *bdname = CONFIG_SYS_BOARD; 98c9c36bf5SPrzemyslaw Marczak 99c9c36bf5SPrzemyslaw Marczak #ifdef CONFIG_BOARD_TYPES 100c9c36bf5SPrzemyslaw Marczak bdtype = get_board_type(); 101bc3f39eaSPrzemyslaw Marczak if (!bdtype) 102bc3f39eaSPrzemyslaw Marczak bdtype = ""; 103bc3f39eaSPrzemyslaw Marczak 104c9c36bf5SPrzemyslaw Marczak sprintf(info, "%s%s", bdname, bdtype); 105c9c36bf5SPrzemyslaw Marczak setenv("boardname", info); 106c9c36bf5SPrzemyslaw Marczak #endif 107c9c36bf5SPrzemyslaw Marczak snprintf(info, ARRAY_SIZE(info), "%s%x-%s%s.dtb", 108c9c36bf5SPrzemyslaw Marczak CONFIG_SYS_SOC, s5p_cpu_id, bdname, bdtype); 109eee2fab0SPiotr Wilczek setenv("fdtfile", info); 110eee2fab0SPiotr Wilczek #endif 111eee2fab0SPiotr Wilczek } 112eee2fab0SPiotr Wilczek #endif /* CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG */ 113eee2fab0SPiotr Wilczek 1149d29a682SPrzemyslaw Marczak #ifdef CONFIG_LCD_MENU 1159d29a682SPrzemyslaw Marczak static int power_key_pressed(u32 reg) 1169d29a682SPrzemyslaw Marczak { 117fc47cf9dSSimon Glass #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */ 1189d29a682SPrzemyslaw Marczak struct pmic *pmic; 1199d29a682SPrzemyslaw Marczak u32 status; 1209d29a682SPrzemyslaw Marczak u32 mask; 1219d29a682SPrzemyslaw Marczak 1229d29a682SPrzemyslaw Marczak pmic = pmic_get(KEY_PWR_PMIC_NAME); 1239d29a682SPrzemyslaw Marczak if (!pmic) { 1249d29a682SPrzemyslaw Marczak printf("%s: Not found\n", KEY_PWR_PMIC_NAME); 1259d29a682SPrzemyslaw Marczak return 0; 1269d29a682SPrzemyslaw Marczak } 1279d29a682SPrzemyslaw Marczak 1289d29a682SPrzemyslaw Marczak if (pmic_probe(pmic)) 1299d29a682SPrzemyslaw Marczak return 0; 1309d29a682SPrzemyslaw Marczak 1319d29a682SPrzemyslaw Marczak if (reg == KEY_PWR_STATUS_REG) 1329d29a682SPrzemyslaw Marczak mask = KEY_PWR_STATUS_MASK; 1339d29a682SPrzemyslaw Marczak else 1349d29a682SPrzemyslaw Marczak mask = KEY_PWR_INTERRUPT_MASK; 1359d29a682SPrzemyslaw Marczak 1369d29a682SPrzemyslaw Marczak if (pmic_reg_read(pmic, reg, &status)) 1379d29a682SPrzemyslaw Marczak return 0; 1389d29a682SPrzemyslaw Marczak 1399d29a682SPrzemyslaw Marczak return !!(status & mask); 140fc47cf9dSSimon Glass #else 141fc47cf9dSSimon Glass return 0; 142fc47cf9dSSimon Glass #endif 1439d29a682SPrzemyslaw Marczak } 1449d29a682SPrzemyslaw Marczak 1459d29a682SPrzemyslaw Marczak static int key_pressed(int key) 1469d29a682SPrzemyslaw Marczak { 1479d29a682SPrzemyslaw Marczak int value; 1489d29a682SPrzemyslaw Marczak 1499d29a682SPrzemyslaw Marczak switch (key) { 1509d29a682SPrzemyslaw Marczak case KEY_POWER: 1519d29a682SPrzemyslaw Marczak value = power_key_pressed(KEY_PWR_INTERRUPT_REG); 1529d29a682SPrzemyslaw Marczak break; 1539d29a682SPrzemyslaw Marczak case KEY_VOLUMEUP: 1549d29a682SPrzemyslaw Marczak value = !gpio_get_value(KEY_VOL_UP_GPIO); 1559d29a682SPrzemyslaw Marczak break; 1569d29a682SPrzemyslaw Marczak case KEY_VOLUMEDOWN: 1579d29a682SPrzemyslaw Marczak value = !gpio_get_value(KEY_VOL_DOWN_GPIO); 1589d29a682SPrzemyslaw Marczak break; 1599d29a682SPrzemyslaw Marczak default: 1609d29a682SPrzemyslaw Marczak value = 0; 1619d29a682SPrzemyslaw Marczak break; 1629d29a682SPrzemyslaw Marczak } 1639d29a682SPrzemyslaw Marczak 1649d29a682SPrzemyslaw Marczak return value; 1659d29a682SPrzemyslaw Marczak } 1669d29a682SPrzemyslaw Marczak 167531a4a66SSimon Glass #ifdef CONFIG_LCD 1689d29a682SPrzemyslaw Marczak static int check_keys(void) 1699d29a682SPrzemyslaw Marczak { 1709d29a682SPrzemyslaw Marczak int keys = 0; 1719d29a682SPrzemyslaw Marczak 1729d29a682SPrzemyslaw Marczak if (key_pressed(KEY_POWER)) 1739d29a682SPrzemyslaw Marczak keys += KEY_POWER; 1749d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEUP)) 1759d29a682SPrzemyslaw Marczak keys += KEY_VOLUMEUP; 1769d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEDOWN)) 1779d29a682SPrzemyslaw Marczak keys += KEY_VOLUMEDOWN; 1789d29a682SPrzemyslaw Marczak 1799d29a682SPrzemyslaw Marczak return keys; 1809d29a682SPrzemyslaw Marczak } 1819d29a682SPrzemyslaw Marczak 1829d29a682SPrzemyslaw Marczak /* 1839d29a682SPrzemyslaw Marczak * 0 BOOT_MODE_INFO 1849d29a682SPrzemyslaw Marczak * 1 BOOT_MODE_THOR 1859d29a682SPrzemyslaw Marczak * 2 BOOT_MODE_UMS 1869d29a682SPrzemyslaw Marczak * 3 BOOT_MODE_DFU 1879d29a682SPrzemyslaw Marczak * 4 BOOT_MODE_EXIT 1889d29a682SPrzemyslaw Marczak */ 1899d29a682SPrzemyslaw Marczak static char * 190e6bfe79fSPrzemyslaw Marczak mode_name[BOOT_MODE_EXIT + 1][2] = { 191e6bfe79fSPrzemyslaw Marczak {"DEVICE", ""}, 192e6bfe79fSPrzemyslaw Marczak {"THOR", "thor"}, 193e6bfe79fSPrzemyslaw Marczak {"UMS", "ums"}, 194e6bfe79fSPrzemyslaw Marczak {"DFU", "dfu"}, 1955c7b8a37SPrzemyslaw Marczak {"GPT", "gpt"}, 1960954dd61SInha Song {"ENV", "env"}, 197e6bfe79fSPrzemyslaw Marczak {"EXIT", ""}, 1989d29a682SPrzemyslaw Marczak }; 1999d29a682SPrzemyslaw Marczak 2009d29a682SPrzemyslaw Marczak static char * 2019d29a682SPrzemyslaw Marczak mode_info[BOOT_MODE_EXIT + 1] = { 2029d29a682SPrzemyslaw Marczak "info", 2039d29a682SPrzemyslaw Marczak "downloader", 2049d29a682SPrzemyslaw Marczak "mass storage", 2059d29a682SPrzemyslaw Marczak "firmware update", 2065c7b8a37SPrzemyslaw Marczak "restore", 2070954dd61SInha Song "default", 2089d29a682SPrzemyslaw Marczak "and run normal boot" 2099d29a682SPrzemyslaw Marczak }; 2109d29a682SPrzemyslaw Marczak 2119d29a682SPrzemyslaw Marczak static char * 212e6bfe79fSPrzemyslaw Marczak mode_cmd[BOOT_MODE_EXIT + 1] = { 213e6bfe79fSPrzemyslaw Marczak "", 214e6bfe79fSPrzemyslaw Marczak "thor 0 mmc 0", 215e6bfe79fSPrzemyslaw Marczak "ums 0 mmc 0", 216e6bfe79fSPrzemyslaw Marczak "dfu 0 mmc 0", 2175c7b8a37SPrzemyslaw Marczak "gpt write mmc 0 $partitions", 2180954dd61SInha Song "env default -a; saveenv", 219e6bfe79fSPrzemyslaw Marczak "", 2209d29a682SPrzemyslaw Marczak }; 2219d29a682SPrzemyslaw Marczak 2229d29a682SPrzemyslaw Marczak static void display_board_info(void) 2239d29a682SPrzemyslaw Marczak { 2244aa2ba3aSMasahiro Yamada #ifdef CONFIG_MMC 2259d29a682SPrzemyslaw Marczak struct mmc *mmc = find_mmc_device(0); 2269d29a682SPrzemyslaw Marczak #endif 2279d29a682SPrzemyslaw Marczak vidinfo_t *vid = &panel_info; 2289d29a682SPrzemyslaw Marczak 2299d29a682SPrzemyslaw Marczak lcd_position_cursor(4, 4); 2309d29a682SPrzemyslaw Marczak 2319d29a682SPrzemyslaw Marczak lcd_printf("%s\n\t", U_BOOT_VERSION); 2329d29a682SPrzemyslaw Marczak lcd_puts("\n\t\tBoard Info:\n"); 2339d29a682SPrzemyslaw Marczak #ifdef CONFIG_SYS_BOARD 2349d29a682SPrzemyslaw Marczak lcd_printf("\tBoard name: %s\n", CONFIG_SYS_BOARD); 2359d29a682SPrzemyslaw Marczak #endif 2369d29a682SPrzemyslaw Marczak #ifdef CONFIG_REVISION_TAG 2379d29a682SPrzemyslaw Marczak lcd_printf("\tBoard rev: %u\n", get_board_rev()); 2389d29a682SPrzemyslaw Marczak #endif 2399d29a682SPrzemyslaw Marczak lcd_printf("\tDRAM banks: %u\n", CONFIG_NR_DRAM_BANKS); 2409d29a682SPrzemyslaw Marczak lcd_printf("\tDRAM size: %u MB\n", gd->ram_size / SZ_1M); 2419d29a682SPrzemyslaw Marczak 2424aa2ba3aSMasahiro Yamada #ifdef CONFIG_MMC 2439d29a682SPrzemyslaw Marczak if (mmc) { 2449d29a682SPrzemyslaw Marczak if (!mmc->capacity) 2459d29a682SPrzemyslaw Marczak mmc_init(mmc); 2469d29a682SPrzemyslaw Marczak 2479d29a682SPrzemyslaw Marczak lcd_printf("\teMMC size: %llu MB\n", mmc->capacity / SZ_1M); 2489d29a682SPrzemyslaw Marczak } 2499d29a682SPrzemyslaw Marczak #endif 2509d29a682SPrzemyslaw Marczak if (vid) 2519d29a682SPrzemyslaw Marczak lcd_printf("\tDisplay resolution: %u x % u\n", 2529d29a682SPrzemyslaw Marczak vid->vl_col, vid->vl_row); 2539d29a682SPrzemyslaw Marczak 2549d29a682SPrzemyslaw Marczak lcd_printf("\tDisplay BPP: %u\n", 1 << vid->vl_bpix); 2559d29a682SPrzemyslaw Marczak } 256531a4a66SSimon Glass #endif 2579d29a682SPrzemyslaw Marczak 2589d29a682SPrzemyslaw Marczak static int mode_leave_menu(int mode) 2599d29a682SPrzemyslaw Marczak { 260531a4a66SSimon Glass #ifdef CONFIG_LCD 2619d29a682SPrzemyslaw Marczak char *exit_option; 262e6bfe79fSPrzemyslaw Marczak char *exit_reset = "reset"; 2639d29a682SPrzemyslaw Marczak char *exit_back = "back"; 2649d29a682SPrzemyslaw Marczak cmd_tbl_t *cmd; 2659d29a682SPrzemyslaw Marczak int cmd_result; 2669d29a682SPrzemyslaw Marczak int leave; 2679d29a682SPrzemyslaw Marczak 2689d29a682SPrzemyslaw Marczak lcd_clear(); 2699d29a682SPrzemyslaw Marczak 2709d29a682SPrzemyslaw Marczak switch (mode) { 2719d29a682SPrzemyslaw Marczak case BOOT_MODE_EXIT: 2729d29a682SPrzemyslaw Marczak return 1; 2739d29a682SPrzemyslaw Marczak case BOOT_MODE_INFO: 2749d29a682SPrzemyslaw Marczak display_board_info(); 2759d29a682SPrzemyslaw Marczak exit_option = exit_back; 2769d29a682SPrzemyslaw Marczak leave = 0; 2779d29a682SPrzemyslaw Marczak break; 2789d29a682SPrzemyslaw Marczak default: 279e6bfe79fSPrzemyslaw Marczak cmd = find_cmd(mode_name[mode][1]); 2809d29a682SPrzemyslaw Marczak if (cmd) { 281e6bfe79fSPrzemyslaw Marczak printf("Enter: %s %s\n", mode_name[mode][0], 2829d29a682SPrzemyslaw Marczak mode_info[mode]); 283e6bfe79fSPrzemyslaw Marczak lcd_printf("\n\n\t%s %s\n", mode_name[mode][0], 2849d29a682SPrzemyslaw Marczak mode_info[mode]); 2859d29a682SPrzemyslaw Marczak lcd_puts("\n\tDo not turn off device before finish!\n"); 2869d29a682SPrzemyslaw Marczak 287e6bfe79fSPrzemyslaw Marczak cmd_result = run_command(mode_cmd[mode], 0); 2889d29a682SPrzemyslaw Marczak 2899d29a682SPrzemyslaw Marczak if (cmd_result == CMD_RET_SUCCESS) { 2909d29a682SPrzemyslaw Marczak printf("Command finished\n"); 2919d29a682SPrzemyslaw Marczak lcd_clear(); 2929d29a682SPrzemyslaw Marczak lcd_printf("\n\n\t%s finished\n", 293e6bfe79fSPrzemyslaw Marczak mode_name[mode][0]); 2949d29a682SPrzemyslaw Marczak 295e6bfe79fSPrzemyslaw Marczak exit_option = exit_reset; 2969d29a682SPrzemyslaw Marczak leave = 1; 2979d29a682SPrzemyslaw Marczak } else { 2989d29a682SPrzemyslaw Marczak printf("Command error\n"); 2999d29a682SPrzemyslaw Marczak lcd_clear(); 3009d29a682SPrzemyslaw Marczak lcd_printf("\n\n\t%s command error\n", 301e6bfe79fSPrzemyslaw Marczak mode_name[mode][0]); 3029d29a682SPrzemyslaw Marczak 3039d29a682SPrzemyslaw Marczak exit_option = exit_back; 3049d29a682SPrzemyslaw Marczak leave = 0; 3059d29a682SPrzemyslaw Marczak } 3069d29a682SPrzemyslaw Marczak } else { 3079d29a682SPrzemyslaw Marczak lcd_puts("\n\n\tThis mode is not supported.\n"); 3089d29a682SPrzemyslaw Marczak exit_option = exit_back; 3099d29a682SPrzemyslaw Marczak leave = 0; 3109d29a682SPrzemyslaw Marczak } 3119d29a682SPrzemyslaw Marczak } 3129d29a682SPrzemyslaw Marczak 3139d29a682SPrzemyslaw Marczak lcd_printf("\n\n\tPress POWER KEY to %s\n", exit_option); 3149d29a682SPrzemyslaw Marczak 3159d29a682SPrzemyslaw Marczak /* Clear PWR button Rising edge interrupt status flag */ 3169d29a682SPrzemyslaw Marczak power_key_pressed(KEY_PWR_INTERRUPT_REG); 3179d29a682SPrzemyslaw Marczak 3189d29a682SPrzemyslaw Marczak /* Wait for PWR key */ 3199d29a682SPrzemyslaw Marczak while (!key_pressed(KEY_POWER)) 3209d29a682SPrzemyslaw Marczak mdelay(1); 3219d29a682SPrzemyslaw Marczak 3229d29a682SPrzemyslaw Marczak lcd_clear(); 3239d29a682SPrzemyslaw Marczak return leave; 324531a4a66SSimon Glass #else 325531a4a66SSimon Glass return 0; 326531a4a66SSimon Glass #endif 3279d29a682SPrzemyslaw Marczak } 3289d29a682SPrzemyslaw Marczak 329531a4a66SSimon Glass #ifdef CONFIG_LCD 3309d29a682SPrzemyslaw Marczak static void display_download_menu(int mode) 3319d29a682SPrzemyslaw Marczak { 3329d29a682SPrzemyslaw Marczak char *selection[BOOT_MODE_EXIT + 1]; 3339d29a682SPrzemyslaw Marczak int i; 3349d29a682SPrzemyslaw Marczak 3359d29a682SPrzemyslaw Marczak for (i = 0; i <= BOOT_MODE_EXIT; i++) 3369d29a682SPrzemyslaw Marczak selection[i] = "[ ]"; 3379d29a682SPrzemyslaw Marczak 3389d29a682SPrzemyslaw Marczak selection[mode] = "[=>]"; 3399d29a682SPrzemyslaw Marczak 3409d29a682SPrzemyslaw Marczak lcd_clear(); 341605d7e2aSPrzemyslaw Marczak lcd_printf("\n\n\t\tDownload Mode Menu\n\n"); 3429d29a682SPrzemyslaw Marczak 3439d29a682SPrzemyslaw Marczak for (i = 0; i <= BOOT_MODE_EXIT; i++) 3449d29a682SPrzemyslaw Marczak lcd_printf("\t%s %s - %s\n\n", selection[i], 345de5f9733SMinkyu Kang mode_name[i][0], mode_info[i]); 3469d29a682SPrzemyslaw Marczak } 347531a4a66SSimon Glass #endif 3489d29a682SPrzemyslaw Marczak 3499d29a682SPrzemyslaw Marczak static void download_menu(void) 3509d29a682SPrzemyslaw Marczak { 351531a4a66SSimon Glass #ifdef CONFIG_LCD 3529d29a682SPrzemyslaw Marczak int mode = 0; 3539d29a682SPrzemyslaw Marczak int last_mode = 0; 3549d29a682SPrzemyslaw Marczak int run; 355605d7e2aSPrzemyslaw Marczak int key = 0; 356605d7e2aSPrzemyslaw Marczak int timeout = 15; /* sec */ 357605d7e2aSPrzemyslaw Marczak int i; 3589d29a682SPrzemyslaw Marczak 3599d29a682SPrzemyslaw Marczak display_download_menu(mode); 3609d29a682SPrzemyslaw Marczak 361605d7e2aSPrzemyslaw Marczak lcd_puts("\n"); 362605d7e2aSPrzemyslaw Marczak 363605d7e2aSPrzemyslaw Marczak /* Start count if no key is pressed */ 364605d7e2aSPrzemyslaw Marczak while (check_keys()) 365605d7e2aSPrzemyslaw Marczak continue; 366605d7e2aSPrzemyslaw Marczak 367605d7e2aSPrzemyslaw Marczak while (timeout--) { 368605d7e2aSPrzemyslaw Marczak lcd_printf("\r\tNormal boot will start in: %2.d seconds.", 369605d7e2aSPrzemyslaw Marczak timeout); 370605d7e2aSPrzemyslaw Marczak 371605d7e2aSPrzemyslaw Marczak /* about 1000 ms in for loop */ 372605d7e2aSPrzemyslaw Marczak for (i = 0; i < 10; i++) { 373605d7e2aSPrzemyslaw Marczak mdelay(100); 374605d7e2aSPrzemyslaw Marczak key = check_keys(); 375605d7e2aSPrzemyslaw Marczak if (key) 376605d7e2aSPrzemyslaw Marczak break; 377605d7e2aSPrzemyslaw Marczak } 378605d7e2aSPrzemyslaw Marczak if (key) 379605d7e2aSPrzemyslaw Marczak break; 380605d7e2aSPrzemyslaw Marczak } 381605d7e2aSPrzemyslaw Marczak 382605d7e2aSPrzemyslaw Marczak if (!key) { 383605d7e2aSPrzemyslaw Marczak lcd_clear(); 384605d7e2aSPrzemyslaw Marczak return; 385605d7e2aSPrzemyslaw Marczak } 386605d7e2aSPrzemyslaw Marczak 3879d29a682SPrzemyslaw Marczak while (1) { 3889d29a682SPrzemyslaw Marczak run = 0; 3899d29a682SPrzemyslaw Marczak 3909d29a682SPrzemyslaw Marczak if (mode != last_mode) 3919d29a682SPrzemyslaw Marczak display_download_menu(mode); 3929d29a682SPrzemyslaw Marczak 3939d29a682SPrzemyslaw Marczak last_mode = mode; 394f418a1cfSPrzemyslaw Marczak mdelay(200); 3959d29a682SPrzemyslaw Marczak 3969d29a682SPrzemyslaw Marczak key = check_keys(); 3979d29a682SPrzemyslaw Marczak switch (key) { 3989d29a682SPrzemyslaw Marczak case KEY_POWER: 3999d29a682SPrzemyslaw Marczak run = 1; 4009d29a682SPrzemyslaw Marczak break; 4019d29a682SPrzemyslaw Marczak case KEY_VOLUMEUP: 4029d29a682SPrzemyslaw Marczak if (mode > 0) 4039d29a682SPrzemyslaw Marczak mode--; 4049d29a682SPrzemyslaw Marczak break; 4059d29a682SPrzemyslaw Marczak case KEY_VOLUMEDOWN: 4069d29a682SPrzemyslaw Marczak if (mode < BOOT_MODE_EXIT) 4079d29a682SPrzemyslaw Marczak mode++; 4089d29a682SPrzemyslaw Marczak break; 4099d29a682SPrzemyslaw Marczak default: 4109d29a682SPrzemyslaw Marczak break; 4119d29a682SPrzemyslaw Marczak } 4129d29a682SPrzemyslaw Marczak 4139d29a682SPrzemyslaw Marczak if (run) { 4149d29a682SPrzemyslaw Marczak if (mode_leave_menu(mode)) 415e6bfe79fSPrzemyslaw Marczak run_command("reset", 0); 4169d29a682SPrzemyslaw Marczak 4179d29a682SPrzemyslaw Marczak display_download_menu(mode); 4189d29a682SPrzemyslaw Marczak } 4199d29a682SPrzemyslaw Marczak } 4209d29a682SPrzemyslaw Marczak 4219d29a682SPrzemyslaw Marczak lcd_clear(); 422531a4a66SSimon Glass #endif 4239d29a682SPrzemyslaw Marczak } 4249d29a682SPrzemyslaw Marczak 4259d29a682SPrzemyslaw Marczak void check_boot_mode(void) 4269d29a682SPrzemyslaw Marczak { 4279d29a682SPrzemyslaw Marczak int pwr_key; 4289d29a682SPrzemyslaw Marczak 4299d29a682SPrzemyslaw Marczak pwr_key = power_key_pressed(KEY_PWR_STATUS_REG); 4309d29a682SPrzemyslaw Marczak if (!pwr_key) 4319d29a682SPrzemyslaw Marczak return; 4329d29a682SPrzemyslaw Marczak 4339d29a682SPrzemyslaw Marczak /* Clear PWR button Rising edge interrupt status flag */ 4349d29a682SPrzemyslaw Marczak power_key_pressed(KEY_PWR_INTERRUPT_REG); 4359d29a682SPrzemyslaw Marczak 4369d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEUP)) 437605d7e2aSPrzemyslaw Marczak download_menu(); 4389d29a682SPrzemyslaw Marczak else if (key_pressed(KEY_VOLUMEDOWN)) 4399d29a682SPrzemyslaw Marczak mode_leave_menu(BOOT_MODE_THOR); 4409d29a682SPrzemyslaw Marczak } 4419d29a682SPrzemyslaw Marczak 4429d29a682SPrzemyslaw Marczak void keys_init(void) 4439d29a682SPrzemyslaw Marczak { 4449d29a682SPrzemyslaw Marczak /* Set direction to input */ 4457f196101SSimon Glass gpio_request(KEY_VOL_UP_GPIO, "volume-up"); 4467f196101SSimon Glass gpio_request(KEY_VOL_DOWN_GPIO, "volume-down"); 4479d29a682SPrzemyslaw Marczak gpio_direction_input(KEY_VOL_UP_GPIO); 4489d29a682SPrzemyslaw Marczak gpio_direction_input(KEY_VOL_DOWN_GPIO); 4499d29a682SPrzemyslaw Marczak } 4509d29a682SPrzemyslaw Marczak #endif /* CONFIG_LCD_MENU */ 451679549d1SPrzemyslaw Marczak 452679549d1SPrzemyslaw Marczak #ifdef CONFIG_CMD_BMP 453679549d1SPrzemyslaw Marczak void draw_logo(void) 454679549d1SPrzemyslaw Marczak { 455679549d1SPrzemyslaw Marczak int x, y; 456679549d1SPrzemyslaw Marczak ulong addr; 457679549d1SPrzemyslaw Marczak 458679549d1SPrzemyslaw Marczak addr = panel_info.logo_addr; 459679549d1SPrzemyslaw Marczak if (!addr) { 460679549d1SPrzemyslaw Marczak error("There is no logo data."); 461679549d1SPrzemyslaw Marczak return; 462679549d1SPrzemyslaw Marczak } 463679549d1SPrzemyslaw Marczak 464679549d1SPrzemyslaw Marczak if (panel_info.vl_width >= panel_info.logo_width) { 465679549d1SPrzemyslaw Marczak x = ((panel_info.vl_width - panel_info.logo_width) >> 1); 466903afe18SPrzemyslaw Marczak x += panel_info.logo_x_offset; /* For X center align */ 467679549d1SPrzemyslaw Marczak } else { 468679549d1SPrzemyslaw Marczak x = 0; 469679549d1SPrzemyslaw Marczak printf("Warning: image width is bigger than display width\n"); 470679549d1SPrzemyslaw Marczak } 471679549d1SPrzemyslaw Marczak 472679549d1SPrzemyslaw Marczak if (panel_info.vl_height >= panel_info.logo_height) { 473679549d1SPrzemyslaw Marczak y = ((panel_info.vl_height - panel_info.logo_height) >> 1); 474903afe18SPrzemyslaw Marczak y += panel_info.logo_y_offset; /* For Y center align */ 475679549d1SPrzemyslaw Marczak } else { 476679549d1SPrzemyslaw Marczak y = 0; 477679549d1SPrzemyslaw Marczak printf("Warning: image height is bigger than display height\n"); 478679549d1SPrzemyslaw Marczak } 479679549d1SPrzemyslaw Marczak 480679549d1SPrzemyslaw Marczak bmp_display(addr, x, y); 481679549d1SPrzemyslaw Marczak } 482679549d1SPrzemyslaw Marczak #endif /* CONFIG_CMD_BMP */ 483