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> 219d29a682SPrzemyslaw Marczak #include <power/pmic.h> 229d29a682SPrzemyslaw Marczak #include <mmc.h> 239d29a682SPrzemyslaw Marczak 249d29a682SPrzemyslaw Marczak DECLARE_GLOBAL_DATA_PTR; 259d29a682SPrzemyslaw Marczak 261d07c101SPrzemyslaw Marczak #ifdef CONFIG_SET_DFU_ALT_INFO 27899a5282SPrzemyslaw Marczak void set_dfu_alt_info(char *interface, char *devstr) 281d07c101SPrzemyslaw Marczak { 291d07c101SPrzemyslaw Marczak size_t buf_size = CONFIG_SET_DFU_ALT_BUF_LEN; 301d07c101SPrzemyslaw Marczak ALLOC_CACHE_ALIGN_BUFFER(char, buf, buf_size); 311d07c101SPrzemyslaw Marczak char *alt_info = "Settings not found!"; 321d07c101SPrzemyslaw Marczak char *status = "error!\n"; 331d07c101SPrzemyslaw Marczak char *alt_setting; 341d07c101SPrzemyslaw Marczak char *alt_sep; 351d07c101SPrzemyslaw Marczak int offset = 0; 361d07c101SPrzemyslaw Marczak 371d07c101SPrzemyslaw Marczak puts("DFU alt info setting: "); 381d07c101SPrzemyslaw Marczak 39899a5282SPrzemyslaw Marczak alt_setting = get_dfu_alt_boot(interface, devstr); 401d07c101SPrzemyslaw Marczak if (alt_setting) { 411d07c101SPrzemyslaw Marczak setenv("dfu_alt_boot", alt_setting); 421d07c101SPrzemyslaw Marczak offset = snprintf(buf, buf_size, "%s", alt_setting); 431d07c101SPrzemyslaw Marczak } 441d07c101SPrzemyslaw Marczak 45899a5282SPrzemyslaw Marczak alt_setting = get_dfu_alt_system(interface, devstr); 461d07c101SPrzemyslaw Marczak if (alt_setting) { 471d07c101SPrzemyslaw Marczak if (offset) 481d07c101SPrzemyslaw Marczak alt_sep = ";"; 491d07c101SPrzemyslaw Marczak else 501d07c101SPrzemyslaw Marczak alt_sep = ""; 511d07c101SPrzemyslaw Marczak 521d07c101SPrzemyslaw Marczak offset += snprintf(buf + offset, buf_size - offset, 531d07c101SPrzemyslaw Marczak "%s%s", alt_sep, alt_setting); 541d07c101SPrzemyslaw Marczak } 551d07c101SPrzemyslaw Marczak 561d07c101SPrzemyslaw Marczak if (offset) { 571d07c101SPrzemyslaw Marczak alt_info = buf; 581d07c101SPrzemyslaw Marczak status = "done\n"; 591d07c101SPrzemyslaw Marczak } 601d07c101SPrzemyslaw Marczak 611d07c101SPrzemyslaw Marczak setenv("dfu_alt_info", alt_info); 621d07c101SPrzemyslaw Marczak puts(status); 631d07c101SPrzemyslaw Marczak } 641d07c101SPrzemyslaw Marczak #endif 651d07c101SPrzemyslaw Marczak 66eee2fab0SPiotr Wilczek #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG 67eee2fab0SPiotr Wilczek void set_board_info(void) 68eee2fab0SPiotr Wilczek { 69eee2fab0SPiotr Wilczek char info[64]; 70eee2fab0SPiotr Wilczek 710dc579f3SPrzemyslaw Marczak snprintf(info, ARRAY_SIZE(info), "%u.%u", (s5p_cpu_rev & 0xf0) >> 4, 720dc579f3SPrzemyslaw Marczak s5p_cpu_rev & 0xf); 73eee2fab0SPiotr Wilczek setenv("soc_rev", info); 74eee2fab0SPiotr Wilczek 75eee2fab0SPiotr Wilczek snprintf(info, ARRAY_SIZE(info), "%x", s5p_cpu_id); 76eee2fab0SPiotr Wilczek setenv("soc_id", info); 77eee2fab0SPiotr Wilczek 78eee2fab0SPiotr Wilczek #ifdef CONFIG_REVISION_TAG 79eee2fab0SPiotr Wilczek snprintf(info, ARRAY_SIZE(info), "%x", get_board_rev()); 80eee2fab0SPiotr Wilczek setenv("board_rev", info); 81eee2fab0SPiotr Wilczek #endif 82eee2fab0SPiotr Wilczek #ifdef CONFIG_OF_LIBFDT 83c9c36bf5SPrzemyslaw Marczak const char *bdtype = ""; 84c9c36bf5SPrzemyslaw Marczak const char *bdname = CONFIG_SYS_BOARD; 85c9c36bf5SPrzemyslaw Marczak 86c9c36bf5SPrzemyslaw Marczak #ifdef CONFIG_BOARD_TYPES 87c9c36bf5SPrzemyslaw Marczak bdtype = get_board_type(); 88*bc3f39eaSPrzemyslaw Marczak if (!bdtype) 89*bc3f39eaSPrzemyslaw Marczak bdtype = ""; 90*bc3f39eaSPrzemyslaw Marczak 91c9c36bf5SPrzemyslaw Marczak sprintf(info, "%s%s", bdname, bdtype); 92c9c36bf5SPrzemyslaw Marczak setenv("boardname", info); 93c9c36bf5SPrzemyslaw Marczak #endif 94c9c36bf5SPrzemyslaw Marczak snprintf(info, ARRAY_SIZE(info), "%s%x-%s%s.dtb", 95c9c36bf5SPrzemyslaw Marczak CONFIG_SYS_SOC, s5p_cpu_id, bdname, bdtype); 96eee2fab0SPiotr Wilczek setenv("fdtfile", info); 97eee2fab0SPiotr Wilczek #endif 98eee2fab0SPiotr Wilczek } 99eee2fab0SPiotr Wilczek #endif /* CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG */ 100eee2fab0SPiotr Wilczek 1019d29a682SPrzemyslaw Marczak #ifdef CONFIG_LCD_MENU 1029d29a682SPrzemyslaw Marczak static int power_key_pressed(u32 reg) 1039d29a682SPrzemyslaw Marczak { 1049d29a682SPrzemyslaw Marczak struct pmic *pmic; 1059d29a682SPrzemyslaw Marczak u32 status; 1069d29a682SPrzemyslaw Marczak u32 mask; 1079d29a682SPrzemyslaw Marczak 1089d29a682SPrzemyslaw Marczak pmic = pmic_get(KEY_PWR_PMIC_NAME); 1099d29a682SPrzemyslaw Marczak if (!pmic) { 1109d29a682SPrzemyslaw Marczak printf("%s: Not found\n", KEY_PWR_PMIC_NAME); 1119d29a682SPrzemyslaw Marczak return 0; 1129d29a682SPrzemyslaw Marczak } 1139d29a682SPrzemyslaw Marczak 1149d29a682SPrzemyslaw Marczak if (pmic_probe(pmic)) 1159d29a682SPrzemyslaw Marczak return 0; 1169d29a682SPrzemyslaw Marczak 1179d29a682SPrzemyslaw Marczak if (reg == KEY_PWR_STATUS_REG) 1189d29a682SPrzemyslaw Marczak mask = KEY_PWR_STATUS_MASK; 1199d29a682SPrzemyslaw Marczak else 1209d29a682SPrzemyslaw Marczak mask = KEY_PWR_INTERRUPT_MASK; 1219d29a682SPrzemyslaw Marczak 1229d29a682SPrzemyslaw Marczak if (pmic_reg_read(pmic, reg, &status)) 1239d29a682SPrzemyslaw Marczak return 0; 1249d29a682SPrzemyslaw Marczak 1259d29a682SPrzemyslaw Marczak return !!(status & mask); 1269d29a682SPrzemyslaw Marczak } 1279d29a682SPrzemyslaw Marczak 1289d29a682SPrzemyslaw Marczak static int key_pressed(int key) 1299d29a682SPrzemyslaw Marczak { 1309d29a682SPrzemyslaw Marczak int value; 1319d29a682SPrzemyslaw Marczak 1329d29a682SPrzemyslaw Marczak switch (key) { 1339d29a682SPrzemyslaw Marczak case KEY_POWER: 1349d29a682SPrzemyslaw Marczak value = power_key_pressed(KEY_PWR_INTERRUPT_REG); 1359d29a682SPrzemyslaw Marczak break; 1369d29a682SPrzemyslaw Marczak case KEY_VOLUMEUP: 1379d29a682SPrzemyslaw Marczak value = !gpio_get_value(KEY_VOL_UP_GPIO); 1389d29a682SPrzemyslaw Marczak break; 1399d29a682SPrzemyslaw Marczak case KEY_VOLUMEDOWN: 1409d29a682SPrzemyslaw Marczak value = !gpio_get_value(KEY_VOL_DOWN_GPIO); 1419d29a682SPrzemyslaw Marczak break; 1429d29a682SPrzemyslaw Marczak default: 1439d29a682SPrzemyslaw Marczak value = 0; 1449d29a682SPrzemyslaw Marczak break; 1459d29a682SPrzemyslaw Marczak } 1469d29a682SPrzemyslaw Marczak 1479d29a682SPrzemyslaw Marczak return value; 1489d29a682SPrzemyslaw Marczak } 1499d29a682SPrzemyslaw Marczak 1509d29a682SPrzemyslaw Marczak static int check_keys(void) 1519d29a682SPrzemyslaw Marczak { 1529d29a682SPrzemyslaw Marczak int keys = 0; 1539d29a682SPrzemyslaw Marczak 1549d29a682SPrzemyslaw Marczak if (key_pressed(KEY_POWER)) 1559d29a682SPrzemyslaw Marczak keys += KEY_POWER; 1569d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEUP)) 1579d29a682SPrzemyslaw Marczak keys += KEY_VOLUMEUP; 1589d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEDOWN)) 1599d29a682SPrzemyslaw Marczak keys += KEY_VOLUMEDOWN; 1609d29a682SPrzemyslaw Marczak 1619d29a682SPrzemyslaw Marczak return keys; 1629d29a682SPrzemyslaw Marczak } 1639d29a682SPrzemyslaw Marczak 1649d29a682SPrzemyslaw Marczak /* 1659d29a682SPrzemyslaw Marczak * 0 BOOT_MODE_INFO 1669d29a682SPrzemyslaw Marczak * 1 BOOT_MODE_THOR 1679d29a682SPrzemyslaw Marczak * 2 BOOT_MODE_UMS 1689d29a682SPrzemyslaw Marczak * 3 BOOT_MODE_DFU 1699d29a682SPrzemyslaw Marczak * 4 BOOT_MODE_EXIT 1709d29a682SPrzemyslaw Marczak */ 1719d29a682SPrzemyslaw Marczak static char * 172e6bfe79fSPrzemyslaw Marczak mode_name[BOOT_MODE_EXIT + 1][2] = { 173e6bfe79fSPrzemyslaw Marczak {"DEVICE", ""}, 174e6bfe79fSPrzemyslaw Marczak {"THOR", "thor"}, 175e6bfe79fSPrzemyslaw Marczak {"UMS", "ums"}, 176e6bfe79fSPrzemyslaw Marczak {"DFU", "dfu"}, 1775c7b8a37SPrzemyslaw Marczak {"GPT", "gpt"}, 1780954dd61SInha Song {"ENV", "env"}, 179e6bfe79fSPrzemyslaw Marczak {"EXIT", ""}, 1809d29a682SPrzemyslaw Marczak }; 1819d29a682SPrzemyslaw Marczak 1829d29a682SPrzemyslaw Marczak static char * 1839d29a682SPrzemyslaw Marczak mode_info[BOOT_MODE_EXIT + 1] = { 1849d29a682SPrzemyslaw Marczak "info", 1859d29a682SPrzemyslaw Marczak "downloader", 1869d29a682SPrzemyslaw Marczak "mass storage", 1879d29a682SPrzemyslaw Marczak "firmware update", 1885c7b8a37SPrzemyslaw Marczak "restore", 1890954dd61SInha Song "default", 1909d29a682SPrzemyslaw Marczak "and run normal boot" 1919d29a682SPrzemyslaw Marczak }; 1929d29a682SPrzemyslaw Marczak 1939d29a682SPrzemyslaw Marczak static char * 194e6bfe79fSPrzemyslaw Marczak mode_cmd[BOOT_MODE_EXIT + 1] = { 195e6bfe79fSPrzemyslaw Marczak "", 196e6bfe79fSPrzemyslaw Marczak "thor 0 mmc 0", 197e6bfe79fSPrzemyslaw Marczak "ums 0 mmc 0", 198e6bfe79fSPrzemyslaw Marczak "dfu 0 mmc 0", 1995c7b8a37SPrzemyslaw Marczak "gpt write mmc 0 $partitions", 2000954dd61SInha Song "env default -a; saveenv", 201e6bfe79fSPrzemyslaw Marczak "", 2029d29a682SPrzemyslaw Marczak }; 2039d29a682SPrzemyslaw Marczak 2049d29a682SPrzemyslaw Marczak static void display_board_info(void) 2059d29a682SPrzemyslaw Marczak { 2069d29a682SPrzemyslaw Marczak #ifdef CONFIG_GENERIC_MMC 2079d29a682SPrzemyslaw Marczak struct mmc *mmc = find_mmc_device(0); 2089d29a682SPrzemyslaw Marczak #endif 2099d29a682SPrzemyslaw Marczak vidinfo_t *vid = &panel_info; 2109d29a682SPrzemyslaw Marczak 2119d29a682SPrzemyslaw Marczak lcd_position_cursor(4, 4); 2129d29a682SPrzemyslaw Marczak 2139d29a682SPrzemyslaw Marczak lcd_printf("%s\n\t", U_BOOT_VERSION); 2149d29a682SPrzemyslaw Marczak lcd_puts("\n\t\tBoard Info:\n"); 2159d29a682SPrzemyslaw Marczak #ifdef CONFIG_SYS_BOARD 2169d29a682SPrzemyslaw Marczak lcd_printf("\tBoard name: %s\n", CONFIG_SYS_BOARD); 2179d29a682SPrzemyslaw Marczak #endif 2189d29a682SPrzemyslaw Marczak #ifdef CONFIG_REVISION_TAG 2199d29a682SPrzemyslaw Marczak lcd_printf("\tBoard rev: %u\n", get_board_rev()); 2209d29a682SPrzemyslaw Marczak #endif 2219d29a682SPrzemyslaw Marczak lcd_printf("\tDRAM banks: %u\n", CONFIG_NR_DRAM_BANKS); 2229d29a682SPrzemyslaw Marczak lcd_printf("\tDRAM size: %u MB\n", gd->ram_size / SZ_1M); 2239d29a682SPrzemyslaw Marczak 2249d29a682SPrzemyslaw Marczak #ifdef CONFIG_GENERIC_MMC 2259d29a682SPrzemyslaw Marczak if (mmc) { 2269d29a682SPrzemyslaw Marczak if (!mmc->capacity) 2279d29a682SPrzemyslaw Marczak mmc_init(mmc); 2289d29a682SPrzemyslaw Marczak 2299d29a682SPrzemyslaw Marczak lcd_printf("\teMMC size: %llu MB\n", mmc->capacity / SZ_1M); 2309d29a682SPrzemyslaw Marczak } 2319d29a682SPrzemyslaw Marczak #endif 2329d29a682SPrzemyslaw Marczak if (vid) 2339d29a682SPrzemyslaw Marczak lcd_printf("\tDisplay resolution: %u x % u\n", 2349d29a682SPrzemyslaw Marczak vid->vl_col, vid->vl_row); 2359d29a682SPrzemyslaw Marczak 2369d29a682SPrzemyslaw Marczak lcd_printf("\tDisplay BPP: %u\n", 1 << vid->vl_bpix); 2379d29a682SPrzemyslaw Marczak } 2389d29a682SPrzemyslaw Marczak 2399d29a682SPrzemyslaw Marczak static int mode_leave_menu(int mode) 2409d29a682SPrzemyslaw Marczak { 2419d29a682SPrzemyslaw Marczak char *exit_option; 242e6bfe79fSPrzemyslaw Marczak char *exit_reset = "reset"; 2439d29a682SPrzemyslaw Marczak char *exit_back = "back"; 2449d29a682SPrzemyslaw Marczak cmd_tbl_t *cmd; 2459d29a682SPrzemyslaw Marczak int cmd_result; 2469d29a682SPrzemyslaw Marczak int leave; 2479d29a682SPrzemyslaw Marczak 2489d29a682SPrzemyslaw Marczak lcd_clear(); 2499d29a682SPrzemyslaw Marczak 2509d29a682SPrzemyslaw Marczak switch (mode) { 2519d29a682SPrzemyslaw Marczak case BOOT_MODE_EXIT: 2529d29a682SPrzemyslaw Marczak return 1; 2539d29a682SPrzemyslaw Marczak case BOOT_MODE_INFO: 2549d29a682SPrzemyslaw Marczak display_board_info(); 2559d29a682SPrzemyslaw Marczak exit_option = exit_back; 2569d29a682SPrzemyslaw Marczak leave = 0; 2579d29a682SPrzemyslaw Marczak break; 2589d29a682SPrzemyslaw Marczak default: 259e6bfe79fSPrzemyslaw Marczak cmd = find_cmd(mode_name[mode][1]); 2609d29a682SPrzemyslaw Marczak if (cmd) { 261e6bfe79fSPrzemyslaw Marczak printf("Enter: %s %s\n", mode_name[mode][0], 2629d29a682SPrzemyslaw Marczak mode_info[mode]); 263e6bfe79fSPrzemyslaw Marczak lcd_printf("\n\n\t%s %s\n", mode_name[mode][0], 2649d29a682SPrzemyslaw Marczak mode_info[mode]); 2659d29a682SPrzemyslaw Marczak lcd_puts("\n\tDo not turn off device before finish!\n"); 2669d29a682SPrzemyslaw Marczak 267e6bfe79fSPrzemyslaw Marczak cmd_result = run_command(mode_cmd[mode], 0); 2689d29a682SPrzemyslaw Marczak 2699d29a682SPrzemyslaw Marczak if (cmd_result == CMD_RET_SUCCESS) { 2709d29a682SPrzemyslaw Marczak printf("Command finished\n"); 2719d29a682SPrzemyslaw Marczak lcd_clear(); 2729d29a682SPrzemyslaw Marczak lcd_printf("\n\n\t%s finished\n", 273e6bfe79fSPrzemyslaw Marczak mode_name[mode][0]); 2749d29a682SPrzemyslaw Marczak 275e6bfe79fSPrzemyslaw Marczak exit_option = exit_reset; 2769d29a682SPrzemyslaw Marczak leave = 1; 2779d29a682SPrzemyslaw Marczak } else { 2789d29a682SPrzemyslaw Marczak printf("Command error\n"); 2799d29a682SPrzemyslaw Marczak lcd_clear(); 2809d29a682SPrzemyslaw Marczak lcd_printf("\n\n\t%s command error\n", 281e6bfe79fSPrzemyslaw Marczak mode_name[mode][0]); 2829d29a682SPrzemyslaw Marczak 2839d29a682SPrzemyslaw Marczak exit_option = exit_back; 2849d29a682SPrzemyslaw Marczak leave = 0; 2859d29a682SPrzemyslaw Marczak } 2869d29a682SPrzemyslaw Marczak } else { 2879d29a682SPrzemyslaw Marczak lcd_puts("\n\n\tThis mode is not supported.\n"); 2889d29a682SPrzemyslaw Marczak exit_option = exit_back; 2899d29a682SPrzemyslaw Marczak leave = 0; 2909d29a682SPrzemyslaw Marczak } 2919d29a682SPrzemyslaw Marczak } 2929d29a682SPrzemyslaw Marczak 2939d29a682SPrzemyslaw Marczak lcd_printf("\n\n\tPress POWER KEY to %s\n", exit_option); 2949d29a682SPrzemyslaw Marczak 2959d29a682SPrzemyslaw Marczak /* Clear PWR button Rising edge interrupt status flag */ 2969d29a682SPrzemyslaw Marczak power_key_pressed(KEY_PWR_INTERRUPT_REG); 2979d29a682SPrzemyslaw Marczak 2989d29a682SPrzemyslaw Marczak /* Wait for PWR key */ 2999d29a682SPrzemyslaw Marczak while (!key_pressed(KEY_POWER)) 3009d29a682SPrzemyslaw Marczak mdelay(1); 3019d29a682SPrzemyslaw Marczak 3029d29a682SPrzemyslaw Marczak lcd_clear(); 3039d29a682SPrzemyslaw Marczak return leave; 3049d29a682SPrzemyslaw Marczak } 3059d29a682SPrzemyslaw Marczak 3069d29a682SPrzemyslaw Marczak static void display_download_menu(int mode) 3079d29a682SPrzemyslaw Marczak { 3089d29a682SPrzemyslaw Marczak char *selection[BOOT_MODE_EXIT + 1]; 3099d29a682SPrzemyslaw Marczak int i; 3109d29a682SPrzemyslaw Marczak 3119d29a682SPrzemyslaw Marczak for (i = 0; i <= BOOT_MODE_EXIT; i++) 3129d29a682SPrzemyslaw Marczak selection[i] = "[ ]"; 3139d29a682SPrzemyslaw Marczak 3149d29a682SPrzemyslaw Marczak selection[mode] = "[=>]"; 3159d29a682SPrzemyslaw Marczak 3169d29a682SPrzemyslaw Marczak lcd_clear(); 317605d7e2aSPrzemyslaw Marczak lcd_printf("\n\n\t\tDownload Mode Menu\n\n"); 3189d29a682SPrzemyslaw Marczak 3199d29a682SPrzemyslaw Marczak for (i = 0; i <= BOOT_MODE_EXIT; i++) 3209d29a682SPrzemyslaw Marczak lcd_printf("\t%s %s - %s\n\n", selection[i], 321e6bfe79fSPrzemyslaw Marczak mode_name[i][0], 3229d29a682SPrzemyslaw Marczak mode_info[i]); 3239d29a682SPrzemyslaw Marczak } 3249d29a682SPrzemyslaw Marczak 3259d29a682SPrzemyslaw Marczak static void download_menu(void) 3269d29a682SPrzemyslaw Marczak { 3279d29a682SPrzemyslaw Marczak int mode = 0; 3289d29a682SPrzemyslaw Marczak int last_mode = 0; 3299d29a682SPrzemyslaw Marczak int run; 330605d7e2aSPrzemyslaw Marczak int key = 0; 331605d7e2aSPrzemyslaw Marczak int timeout = 15; /* sec */ 332605d7e2aSPrzemyslaw Marczak int i; 3339d29a682SPrzemyslaw Marczak 3349d29a682SPrzemyslaw Marczak display_download_menu(mode); 3359d29a682SPrzemyslaw Marczak 336605d7e2aSPrzemyslaw Marczak lcd_puts("\n"); 337605d7e2aSPrzemyslaw Marczak 338605d7e2aSPrzemyslaw Marczak /* Start count if no key is pressed */ 339605d7e2aSPrzemyslaw Marczak while (check_keys()) 340605d7e2aSPrzemyslaw Marczak continue; 341605d7e2aSPrzemyslaw Marczak 342605d7e2aSPrzemyslaw Marczak while (timeout--) { 343605d7e2aSPrzemyslaw Marczak lcd_printf("\r\tNormal boot will start in: %2.d seconds.", 344605d7e2aSPrzemyslaw Marczak timeout); 345605d7e2aSPrzemyslaw Marczak 346605d7e2aSPrzemyslaw Marczak /* about 1000 ms in for loop */ 347605d7e2aSPrzemyslaw Marczak for (i = 0; i < 10; i++) { 348605d7e2aSPrzemyslaw Marczak mdelay(100); 349605d7e2aSPrzemyslaw Marczak key = check_keys(); 350605d7e2aSPrzemyslaw Marczak if (key) 351605d7e2aSPrzemyslaw Marczak break; 352605d7e2aSPrzemyslaw Marczak } 353605d7e2aSPrzemyslaw Marczak if (key) 354605d7e2aSPrzemyslaw Marczak break; 355605d7e2aSPrzemyslaw Marczak } 356605d7e2aSPrzemyslaw Marczak 357605d7e2aSPrzemyslaw Marczak if (!key) { 358605d7e2aSPrzemyslaw Marczak lcd_clear(); 359605d7e2aSPrzemyslaw Marczak return; 360605d7e2aSPrzemyslaw Marczak } 361605d7e2aSPrzemyslaw Marczak 3629d29a682SPrzemyslaw Marczak while (1) { 3639d29a682SPrzemyslaw Marczak run = 0; 3649d29a682SPrzemyslaw Marczak 3659d29a682SPrzemyslaw Marczak if (mode != last_mode) 3669d29a682SPrzemyslaw Marczak display_download_menu(mode); 3679d29a682SPrzemyslaw Marczak 3689d29a682SPrzemyslaw Marczak last_mode = mode; 369f418a1cfSPrzemyslaw Marczak mdelay(200); 3709d29a682SPrzemyslaw Marczak 3719d29a682SPrzemyslaw Marczak key = check_keys(); 3729d29a682SPrzemyslaw Marczak switch (key) { 3739d29a682SPrzemyslaw Marczak case KEY_POWER: 3749d29a682SPrzemyslaw Marczak run = 1; 3759d29a682SPrzemyslaw Marczak break; 3769d29a682SPrzemyslaw Marczak case KEY_VOLUMEUP: 3779d29a682SPrzemyslaw Marczak if (mode > 0) 3789d29a682SPrzemyslaw Marczak mode--; 3799d29a682SPrzemyslaw Marczak break; 3809d29a682SPrzemyslaw Marczak case KEY_VOLUMEDOWN: 3819d29a682SPrzemyslaw Marczak if (mode < BOOT_MODE_EXIT) 3829d29a682SPrzemyslaw Marczak mode++; 3839d29a682SPrzemyslaw Marczak break; 3849d29a682SPrzemyslaw Marczak default: 3859d29a682SPrzemyslaw Marczak break; 3869d29a682SPrzemyslaw Marczak } 3879d29a682SPrzemyslaw Marczak 3889d29a682SPrzemyslaw Marczak if (run) { 3899d29a682SPrzemyslaw Marczak if (mode_leave_menu(mode)) 390e6bfe79fSPrzemyslaw Marczak run_command("reset", 0); 3919d29a682SPrzemyslaw Marczak 3929d29a682SPrzemyslaw Marczak display_download_menu(mode); 3939d29a682SPrzemyslaw Marczak } 3949d29a682SPrzemyslaw Marczak } 3959d29a682SPrzemyslaw Marczak 3969d29a682SPrzemyslaw Marczak lcd_clear(); 3979d29a682SPrzemyslaw Marczak } 3989d29a682SPrzemyslaw Marczak 3999d29a682SPrzemyslaw Marczak void check_boot_mode(void) 4009d29a682SPrzemyslaw Marczak { 4019d29a682SPrzemyslaw Marczak int pwr_key; 4029d29a682SPrzemyslaw Marczak 4039d29a682SPrzemyslaw Marczak pwr_key = power_key_pressed(KEY_PWR_STATUS_REG); 4049d29a682SPrzemyslaw Marczak if (!pwr_key) 4059d29a682SPrzemyslaw Marczak return; 4069d29a682SPrzemyslaw Marczak 4079d29a682SPrzemyslaw Marczak /* Clear PWR button Rising edge interrupt status flag */ 4089d29a682SPrzemyslaw Marczak power_key_pressed(KEY_PWR_INTERRUPT_REG); 4099d29a682SPrzemyslaw Marczak 4109d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEUP)) 411605d7e2aSPrzemyslaw Marczak download_menu(); 4129d29a682SPrzemyslaw Marczak else if (key_pressed(KEY_VOLUMEDOWN)) 4139d29a682SPrzemyslaw Marczak mode_leave_menu(BOOT_MODE_THOR); 4149d29a682SPrzemyslaw Marczak } 4159d29a682SPrzemyslaw Marczak 4169d29a682SPrzemyslaw Marczak void keys_init(void) 4179d29a682SPrzemyslaw Marczak { 4189d29a682SPrzemyslaw Marczak /* Set direction to input */ 4197f196101SSimon Glass gpio_request(KEY_VOL_UP_GPIO, "volume-up"); 4207f196101SSimon Glass gpio_request(KEY_VOL_DOWN_GPIO, "volume-down"); 4219d29a682SPrzemyslaw Marczak gpio_direction_input(KEY_VOL_UP_GPIO); 4229d29a682SPrzemyslaw Marczak gpio_direction_input(KEY_VOL_DOWN_GPIO); 4239d29a682SPrzemyslaw Marczak } 4249d29a682SPrzemyslaw Marczak #endif /* CONFIG_LCD_MENU */ 425679549d1SPrzemyslaw Marczak 426679549d1SPrzemyslaw Marczak #ifdef CONFIG_CMD_BMP 427679549d1SPrzemyslaw Marczak void draw_logo(void) 428679549d1SPrzemyslaw Marczak { 429679549d1SPrzemyslaw Marczak int x, y; 430679549d1SPrzemyslaw Marczak ulong addr; 431679549d1SPrzemyslaw Marczak 432679549d1SPrzemyslaw Marczak addr = panel_info.logo_addr; 433679549d1SPrzemyslaw Marczak if (!addr) { 434679549d1SPrzemyslaw Marczak error("There is no logo data."); 435679549d1SPrzemyslaw Marczak return; 436679549d1SPrzemyslaw Marczak } 437679549d1SPrzemyslaw Marczak 438679549d1SPrzemyslaw Marczak if (panel_info.vl_width >= panel_info.logo_width) { 439679549d1SPrzemyslaw Marczak x = ((panel_info.vl_width - panel_info.logo_width) >> 1); 440903afe18SPrzemyslaw Marczak x += panel_info.logo_x_offset; /* For X center align */ 441679549d1SPrzemyslaw Marczak } else { 442679549d1SPrzemyslaw Marczak x = 0; 443679549d1SPrzemyslaw Marczak printf("Warning: image width is bigger than display width\n"); 444679549d1SPrzemyslaw Marczak } 445679549d1SPrzemyslaw Marczak 446679549d1SPrzemyslaw Marczak if (panel_info.vl_height >= panel_info.logo_height) { 447679549d1SPrzemyslaw Marczak y = ((panel_info.vl_height - panel_info.logo_height) >> 1); 448903afe18SPrzemyslaw Marczak y += panel_info.logo_y_offset; /* For Y center align */ 449679549d1SPrzemyslaw Marczak } else { 450679549d1SPrzemyslaw Marczak y = 0; 451679549d1SPrzemyslaw Marczak printf("Warning: image height is bigger than display height\n"); 452679549d1SPrzemyslaw Marczak } 453679549d1SPrzemyslaw Marczak 454679549d1SPrzemyslaw Marczak bmp_display(addr, x, y); 455679549d1SPrzemyslaw Marczak } 456679549d1SPrzemyslaw Marczak #endif /* CONFIG_CMD_BMP */ 457