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> 15*cf92e05cSSimon 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(); 88c9c36bf5SPrzemyslaw Marczak sprintf(info, "%s%s", bdname, bdtype); 89c9c36bf5SPrzemyslaw Marczak setenv("boardname", info); 90c9c36bf5SPrzemyslaw Marczak #endif 91c9c36bf5SPrzemyslaw Marczak snprintf(info, ARRAY_SIZE(info), "%s%x-%s%s.dtb", 92c9c36bf5SPrzemyslaw Marczak CONFIG_SYS_SOC, s5p_cpu_id, bdname, bdtype); 93eee2fab0SPiotr Wilczek setenv("fdtfile", info); 94eee2fab0SPiotr Wilczek #endif 95eee2fab0SPiotr Wilczek } 96eee2fab0SPiotr Wilczek #endif /* CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG */ 97eee2fab0SPiotr Wilczek 989d29a682SPrzemyslaw Marczak #ifdef CONFIG_LCD_MENU 999d29a682SPrzemyslaw Marczak static int power_key_pressed(u32 reg) 1009d29a682SPrzemyslaw Marczak { 1019d29a682SPrzemyslaw Marczak struct pmic *pmic; 1029d29a682SPrzemyslaw Marczak u32 status; 1039d29a682SPrzemyslaw Marczak u32 mask; 1049d29a682SPrzemyslaw Marczak 1059d29a682SPrzemyslaw Marczak pmic = pmic_get(KEY_PWR_PMIC_NAME); 1069d29a682SPrzemyslaw Marczak if (!pmic) { 1079d29a682SPrzemyslaw Marczak printf("%s: Not found\n", KEY_PWR_PMIC_NAME); 1089d29a682SPrzemyslaw Marczak return 0; 1099d29a682SPrzemyslaw Marczak } 1109d29a682SPrzemyslaw Marczak 1119d29a682SPrzemyslaw Marczak if (pmic_probe(pmic)) 1129d29a682SPrzemyslaw Marczak return 0; 1139d29a682SPrzemyslaw Marczak 1149d29a682SPrzemyslaw Marczak if (reg == KEY_PWR_STATUS_REG) 1159d29a682SPrzemyslaw Marczak mask = KEY_PWR_STATUS_MASK; 1169d29a682SPrzemyslaw Marczak else 1179d29a682SPrzemyslaw Marczak mask = KEY_PWR_INTERRUPT_MASK; 1189d29a682SPrzemyslaw Marczak 1199d29a682SPrzemyslaw Marczak if (pmic_reg_read(pmic, reg, &status)) 1209d29a682SPrzemyslaw Marczak return 0; 1219d29a682SPrzemyslaw Marczak 1229d29a682SPrzemyslaw Marczak return !!(status & mask); 1239d29a682SPrzemyslaw Marczak } 1249d29a682SPrzemyslaw Marczak 1259d29a682SPrzemyslaw Marczak static int key_pressed(int key) 1269d29a682SPrzemyslaw Marczak { 1279d29a682SPrzemyslaw Marczak int value; 1289d29a682SPrzemyslaw Marczak 1299d29a682SPrzemyslaw Marczak switch (key) { 1309d29a682SPrzemyslaw Marczak case KEY_POWER: 1319d29a682SPrzemyslaw Marczak value = power_key_pressed(KEY_PWR_INTERRUPT_REG); 1329d29a682SPrzemyslaw Marczak break; 1339d29a682SPrzemyslaw Marczak case KEY_VOLUMEUP: 1349d29a682SPrzemyslaw Marczak value = !gpio_get_value(KEY_VOL_UP_GPIO); 1359d29a682SPrzemyslaw Marczak break; 1369d29a682SPrzemyslaw Marczak case KEY_VOLUMEDOWN: 1379d29a682SPrzemyslaw Marczak value = !gpio_get_value(KEY_VOL_DOWN_GPIO); 1389d29a682SPrzemyslaw Marczak break; 1399d29a682SPrzemyslaw Marczak default: 1409d29a682SPrzemyslaw Marczak value = 0; 1419d29a682SPrzemyslaw Marczak break; 1429d29a682SPrzemyslaw Marczak } 1439d29a682SPrzemyslaw Marczak 1449d29a682SPrzemyslaw Marczak return value; 1459d29a682SPrzemyslaw Marczak } 1469d29a682SPrzemyslaw Marczak 1479d29a682SPrzemyslaw Marczak static int check_keys(void) 1489d29a682SPrzemyslaw Marczak { 1499d29a682SPrzemyslaw Marczak int keys = 0; 1509d29a682SPrzemyslaw Marczak 1519d29a682SPrzemyslaw Marczak if (key_pressed(KEY_POWER)) 1529d29a682SPrzemyslaw Marczak keys += KEY_POWER; 1539d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEUP)) 1549d29a682SPrzemyslaw Marczak keys += KEY_VOLUMEUP; 1559d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEDOWN)) 1569d29a682SPrzemyslaw Marczak keys += KEY_VOLUMEDOWN; 1579d29a682SPrzemyslaw Marczak 1589d29a682SPrzemyslaw Marczak return keys; 1599d29a682SPrzemyslaw Marczak } 1609d29a682SPrzemyslaw Marczak 1619d29a682SPrzemyslaw Marczak /* 1629d29a682SPrzemyslaw Marczak * 0 BOOT_MODE_INFO 1639d29a682SPrzemyslaw Marczak * 1 BOOT_MODE_THOR 1649d29a682SPrzemyslaw Marczak * 2 BOOT_MODE_UMS 1659d29a682SPrzemyslaw Marczak * 3 BOOT_MODE_DFU 1669d29a682SPrzemyslaw Marczak * 4 BOOT_MODE_EXIT 1679d29a682SPrzemyslaw Marczak */ 1689d29a682SPrzemyslaw Marczak static char * 169e6bfe79fSPrzemyslaw Marczak mode_name[BOOT_MODE_EXIT + 1][2] = { 170e6bfe79fSPrzemyslaw Marczak {"DEVICE", ""}, 171e6bfe79fSPrzemyslaw Marczak {"THOR", "thor"}, 172e6bfe79fSPrzemyslaw Marczak {"UMS", "ums"}, 173e6bfe79fSPrzemyslaw Marczak {"DFU", "dfu"}, 1745c7b8a37SPrzemyslaw Marczak {"GPT", "gpt"}, 1750954dd61SInha Song {"ENV", "env"}, 176e6bfe79fSPrzemyslaw Marczak {"EXIT", ""}, 1779d29a682SPrzemyslaw Marczak }; 1789d29a682SPrzemyslaw Marczak 1799d29a682SPrzemyslaw Marczak static char * 1809d29a682SPrzemyslaw Marczak mode_info[BOOT_MODE_EXIT + 1] = { 1819d29a682SPrzemyslaw Marczak "info", 1829d29a682SPrzemyslaw Marczak "downloader", 1839d29a682SPrzemyslaw Marczak "mass storage", 1849d29a682SPrzemyslaw Marczak "firmware update", 1855c7b8a37SPrzemyslaw Marczak "restore", 1860954dd61SInha Song "default", 1879d29a682SPrzemyslaw Marczak "and run normal boot" 1889d29a682SPrzemyslaw Marczak }; 1899d29a682SPrzemyslaw Marczak 1909d29a682SPrzemyslaw Marczak static char * 191e6bfe79fSPrzemyslaw Marczak mode_cmd[BOOT_MODE_EXIT + 1] = { 192e6bfe79fSPrzemyslaw Marczak "", 193e6bfe79fSPrzemyslaw Marczak "thor 0 mmc 0", 194e6bfe79fSPrzemyslaw Marczak "ums 0 mmc 0", 195e6bfe79fSPrzemyslaw Marczak "dfu 0 mmc 0", 1965c7b8a37SPrzemyslaw Marczak "gpt write mmc 0 $partitions", 1970954dd61SInha Song "env default -a; saveenv", 198e6bfe79fSPrzemyslaw Marczak "", 1999d29a682SPrzemyslaw Marczak }; 2009d29a682SPrzemyslaw Marczak 2019d29a682SPrzemyslaw Marczak static void display_board_info(void) 2029d29a682SPrzemyslaw Marczak { 2039d29a682SPrzemyslaw Marczak #ifdef CONFIG_GENERIC_MMC 2049d29a682SPrzemyslaw Marczak struct mmc *mmc = find_mmc_device(0); 2059d29a682SPrzemyslaw Marczak #endif 2069d29a682SPrzemyslaw Marczak vidinfo_t *vid = &panel_info; 2079d29a682SPrzemyslaw Marczak 2089d29a682SPrzemyslaw Marczak lcd_position_cursor(4, 4); 2099d29a682SPrzemyslaw Marczak 2109d29a682SPrzemyslaw Marczak lcd_printf("%s\n\t", U_BOOT_VERSION); 2119d29a682SPrzemyslaw Marczak lcd_puts("\n\t\tBoard Info:\n"); 2129d29a682SPrzemyslaw Marczak #ifdef CONFIG_SYS_BOARD 2139d29a682SPrzemyslaw Marczak lcd_printf("\tBoard name: %s\n", CONFIG_SYS_BOARD); 2149d29a682SPrzemyslaw Marczak #endif 2159d29a682SPrzemyslaw Marczak #ifdef CONFIG_REVISION_TAG 2169d29a682SPrzemyslaw Marczak lcd_printf("\tBoard rev: %u\n", get_board_rev()); 2179d29a682SPrzemyslaw Marczak #endif 2189d29a682SPrzemyslaw Marczak lcd_printf("\tDRAM banks: %u\n", CONFIG_NR_DRAM_BANKS); 2199d29a682SPrzemyslaw Marczak lcd_printf("\tDRAM size: %u MB\n", gd->ram_size / SZ_1M); 2209d29a682SPrzemyslaw Marczak 2219d29a682SPrzemyslaw Marczak #ifdef CONFIG_GENERIC_MMC 2229d29a682SPrzemyslaw Marczak if (mmc) { 2239d29a682SPrzemyslaw Marczak if (!mmc->capacity) 2249d29a682SPrzemyslaw Marczak mmc_init(mmc); 2259d29a682SPrzemyslaw Marczak 2269d29a682SPrzemyslaw Marczak lcd_printf("\teMMC size: %llu MB\n", mmc->capacity / SZ_1M); 2279d29a682SPrzemyslaw Marczak } 2289d29a682SPrzemyslaw Marczak #endif 2299d29a682SPrzemyslaw Marczak if (vid) 2309d29a682SPrzemyslaw Marczak lcd_printf("\tDisplay resolution: %u x % u\n", 2319d29a682SPrzemyslaw Marczak vid->vl_col, vid->vl_row); 2329d29a682SPrzemyslaw Marczak 2339d29a682SPrzemyslaw Marczak lcd_printf("\tDisplay BPP: %u\n", 1 << vid->vl_bpix); 2349d29a682SPrzemyslaw Marczak } 2359d29a682SPrzemyslaw Marczak 2369d29a682SPrzemyslaw Marczak static int mode_leave_menu(int mode) 2379d29a682SPrzemyslaw Marczak { 2389d29a682SPrzemyslaw Marczak char *exit_option; 239e6bfe79fSPrzemyslaw Marczak char *exit_reset = "reset"; 2409d29a682SPrzemyslaw Marczak char *exit_back = "back"; 2419d29a682SPrzemyslaw Marczak cmd_tbl_t *cmd; 2429d29a682SPrzemyslaw Marczak int cmd_result; 2439d29a682SPrzemyslaw Marczak int leave; 2449d29a682SPrzemyslaw Marczak 2459d29a682SPrzemyslaw Marczak lcd_clear(); 2469d29a682SPrzemyslaw Marczak 2479d29a682SPrzemyslaw Marczak switch (mode) { 2489d29a682SPrzemyslaw Marczak case BOOT_MODE_EXIT: 2499d29a682SPrzemyslaw Marczak return 1; 2509d29a682SPrzemyslaw Marczak case BOOT_MODE_INFO: 2519d29a682SPrzemyslaw Marczak display_board_info(); 2529d29a682SPrzemyslaw Marczak exit_option = exit_back; 2539d29a682SPrzemyslaw Marczak leave = 0; 2549d29a682SPrzemyslaw Marczak break; 2559d29a682SPrzemyslaw Marczak default: 256e6bfe79fSPrzemyslaw Marczak cmd = find_cmd(mode_name[mode][1]); 2579d29a682SPrzemyslaw Marczak if (cmd) { 258e6bfe79fSPrzemyslaw Marczak printf("Enter: %s %s\n", mode_name[mode][0], 2599d29a682SPrzemyslaw Marczak mode_info[mode]); 260e6bfe79fSPrzemyslaw Marczak lcd_printf("\n\n\t%s %s\n", mode_name[mode][0], 2619d29a682SPrzemyslaw Marczak mode_info[mode]); 2629d29a682SPrzemyslaw Marczak lcd_puts("\n\tDo not turn off device before finish!\n"); 2639d29a682SPrzemyslaw Marczak 264e6bfe79fSPrzemyslaw Marczak cmd_result = run_command(mode_cmd[mode], 0); 2659d29a682SPrzemyslaw Marczak 2669d29a682SPrzemyslaw Marczak if (cmd_result == CMD_RET_SUCCESS) { 2679d29a682SPrzemyslaw Marczak printf("Command finished\n"); 2689d29a682SPrzemyslaw Marczak lcd_clear(); 2699d29a682SPrzemyslaw Marczak lcd_printf("\n\n\t%s finished\n", 270e6bfe79fSPrzemyslaw Marczak mode_name[mode][0]); 2719d29a682SPrzemyslaw Marczak 272e6bfe79fSPrzemyslaw Marczak exit_option = exit_reset; 2739d29a682SPrzemyslaw Marczak leave = 1; 2749d29a682SPrzemyslaw Marczak } else { 2759d29a682SPrzemyslaw Marczak printf("Command error\n"); 2769d29a682SPrzemyslaw Marczak lcd_clear(); 2779d29a682SPrzemyslaw Marczak lcd_printf("\n\n\t%s command error\n", 278e6bfe79fSPrzemyslaw Marczak mode_name[mode][0]); 2799d29a682SPrzemyslaw Marczak 2809d29a682SPrzemyslaw Marczak exit_option = exit_back; 2819d29a682SPrzemyslaw Marczak leave = 0; 2829d29a682SPrzemyslaw Marczak } 2839d29a682SPrzemyslaw Marczak } else { 2849d29a682SPrzemyslaw Marczak lcd_puts("\n\n\tThis mode is not supported.\n"); 2859d29a682SPrzemyslaw Marczak exit_option = exit_back; 2869d29a682SPrzemyslaw Marczak leave = 0; 2879d29a682SPrzemyslaw Marczak } 2889d29a682SPrzemyslaw Marczak } 2899d29a682SPrzemyslaw Marczak 2909d29a682SPrzemyslaw Marczak lcd_printf("\n\n\tPress POWER KEY to %s\n", exit_option); 2919d29a682SPrzemyslaw Marczak 2929d29a682SPrzemyslaw Marczak /* Clear PWR button Rising edge interrupt status flag */ 2939d29a682SPrzemyslaw Marczak power_key_pressed(KEY_PWR_INTERRUPT_REG); 2949d29a682SPrzemyslaw Marczak 2959d29a682SPrzemyslaw Marczak /* Wait for PWR key */ 2969d29a682SPrzemyslaw Marczak while (!key_pressed(KEY_POWER)) 2979d29a682SPrzemyslaw Marczak mdelay(1); 2989d29a682SPrzemyslaw Marczak 2999d29a682SPrzemyslaw Marczak lcd_clear(); 3009d29a682SPrzemyslaw Marczak return leave; 3019d29a682SPrzemyslaw Marczak } 3029d29a682SPrzemyslaw Marczak 3039d29a682SPrzemyslaw Marczak static void display_download_menu(int mode) 3049d29a682SPrzemyslaw Marczak { 3059d29a682SPrzemyslaw Marczak char *selection[BOOT_MODE_EXIT + 1]; 3069d29a682SPrzemyslaw Marczak int i; 3079d29a682SPrzemyslaw Marczak 3089d29a682SPrzemyslaw Marczak for (i = 0; i <= BOOT_MODE_EXIT; i++) 3099d29a682SPrzemyslaw Marczak selection[i] = "[ ]"; 3109d29a682SPrzemyslaw Marczak 3119d29a682SPrzemyslaw Marczak selection[mode] = "[=>]"; 3129d29a682SPrzemyslaw Marczak 3139d29a682SPrzemyslaw Marczak lcd_clear(); 314605d7e2aSPrzemyslaw Marczak lcd_printf("\n\n\t\tDownload Mode Menu\n\n"); 3159d29a682SPrzemyslaw Marczak 3169d29a682SPrzemyslaw Marczak for (i = 0; i <= BOOT_MODE_EXIT; i++) 3179d29a682SPrzemyslaw Marczak lcd_printf("\t%s %s - %s\n\n", selection[i], 318e6bfe79fSPrzemyslaw Marczak mode_name[i][0], 3199d29a682SPrzemyslaw Marczak mode_info[i]); 3209d29a682SPrzemyslaw Marczak } 3219d29a682SPrzemyslaw Marczak 3229d29a682SPrzemyslaw Marczak static void download_menu(void) 3239d29a682SPrzemyslaw Marczak { 3249d29a682SPrzemyslaw Marczak int mode = 0; 3259d29a682SPrzemyslaw Marczak int last_mode = 0; 3269d29a682SPrzemyslaw Marczak int run; 327605d7e2aSPrzemyslaw Marczak int key = 0; 328605d7e2aSPrzemyslaw Marczak int timeout = 15; /* sec */ 329605d7e2aSPrzemyslaw Marczak int i; 3309d29a682SPrzemyslaw Marczak 3319d29a682SPrzemyslaw Marczak display_download_menu(mode); 3329d29a682SPrzemyslaw Marczak 333605d7e2aSPrzemyslaw Marczak lcd_puts("\n"); 334605d7e2aSPrzemyslaw Marczak 335605d7e2aSPrzemyslaw Marczak /* Start count if no key is pressed */ 336605d7e2aSPrzemyslaw Marczak while (check_keys()) 337605d7e2aSPrzemyslaw Marczak continue; 338605d7e2aSPrzemyslaw Marczak 339605d7e2aSPrzemyslaw Marczak while (timeout--) { 340605d7e2aSPrzemyslaw Marczak lcd_printf("\r\tNormal boot will start in: %2.d seconds.", 341605d7e2aSPrzemyslaw Marczak timeout); 342605d7e2aSPrzemyslaw Marczak 343605d7e2aSPrzemyslaw Marczak /* about 1000 ms in for loop */ 344605d7e2aSPrzemyslaw Marczak for (i = 0; i < 10; i++) { 345605d7e2aSPrzemyslaw Marczak mdelay(100); 346605d7e2aSPrzemyslaw Marczak key = check_keys(); 347605d7e2aSPrzemyslaw Marczak if (key) 348605d7e2aSPrzemyslaw Marczak break; 349605d7e2aSPrzemyslaw Marczak } 350605d7e2aSPrzemyslaw Marczak if (key) 351605d7e2aSPrzemyslaw Marczak break; 352605d7e2aSPrzemyslaw Marczak } 353605d7e2aSPrzemyslaw Marczak 354605d7e2aSPrzemyslaw Marczak if (!key) { 355605d7e2aSPrzemyslaw Marczak lcd_clear(); 356605d7e2aSPrzemyslaw Marczak return; 357605d7e2aSPrzemyslaw Marczak } 358605d7e2aSPrzemyslaw Marczak 3599d29a682SPrzemyslaw Marczak while (1) { 3609d29a682SPrzemyslaw Marczak run = 0; 3619d29a682SPrzemyslaw Marczak 3629d29a682SPrzemyslaw Marczak if (mode != last_mode) 3639d29a682SPrzemyslaw Marczak display_download_menu(mode); 3649d29a682SPrzemyslaw Marczak 3659d29a682SPrzemyslaw Marczak last_mode = mode; 366f418a1cfSPrzemyslaw Marczak mdelay(200); 3679d29a682SPrzemyslaw Marczak 3689d29a682SPrzemyslaw Marczak key = check_keys(); 3699d29a682SPrzemyslaw Marczak switch (key) { 3709d29a682SPrzemyslaw Marczak case KEY_POWER: 3719d29a682SPrzemyslaw Marczak run = 1; 3729d29a682SPrzemyslaw Marczak break; 3739d29a682SPrzemyslaw Marczak case KEY_VOLUMEUP: 3749d29a682SPrzemyslaw Marczak if (mode > 0) 3759d29a682SPrzemyslaw Marczak mode--; 3769d29a682SPrzemyslaw Marczak break; 3779d29a682SPrzemyslaw Marczak case KEY_VOLUMEDOWN: 3789d29a682SPrzemyslaw Marczak if (mode < BOOT_MODE_EXIT) 3799d29a682SPrzemyslaw Marczak mode++; 3809d29a682SPrzemyslaw Marczak break; 3819d29a682SPrzemyslaw Marczak default: 3829d29a682SPrzemyslaw Marczak break; 3839d29a682SPrzemyslaw Marczak } 3849d29a682SPrzemyslaw Marczak 3859d29a682SPrzemyslaw Marczak if (run) { 3869d29a682SPrzemyslaw Marczak if (mode_leave_menu(mode)) 387e6bfe79fSPrzemyslaw Marczak run_command("reset", 0); 3889d29a682SPrzemyslaw Marczak 3899d29a682SPrzemyslaw Marczak display_download_menu(mode); 3909d29a682SPrzemyslaw Marczak } 3919d29a682SPrzemyslaw Marczak } 3929d29a682SPrzemyslaw Marczak 3939d29a682SPrzemyslaw Marczak lcd_clear(); 3949d29a682SPrzemyslaw Marczak } 3959d29a682SPrzemyslaw Marczak 3969d29a682SPrzemyslaw Marczak void check_boot_mode(void) 3979d29a682SPrzemyslaw Marczak { 3989d29a682SPrzemyslaw Marczak int pwr_key; 3999d29a682SPrzemyslaw Marczak 4009d29a682SPrzemyslaw Marczak pwr_key = power_key_pressed(KEY_PWR_STATUS_REG); 4019d29a682SPrzemyslaw Marczak if (!pwr_key) 4029d29a682SPrzemyslaw Marczak return; 4039d29a682SPrzemyslaw Marczak 4049d29a682SPrzemyslaw Marczak /* Clear PWR button Rising edge interrupt status flag */ 4059d29a682SPrzemyslaw Marczak power_key_pressed(KEY_PWR_INTERRUPT_REG); 4069d29a682SPrzemyslaw Marczak 4079d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEUP)) 408605d7e2aSPrzemyslaw Marczak download_menu(); 4099d29a682SPrzemyslaw Marczak else if (key_pressed(KEY_VOLUMEDOWN)) 4109d29a682SPrzemyslaw Marczak mode_leave_menu(BOOT_MODE_THOR); 4119d29a682SPrzemyslaw Marczak } 4129d29a682SPrzemyslaw Marczak 4139d29a682SPrzemyslaw Marczak void keys_init(void) 4149d29a682SPrzemyslaw Marczak { 4159d29a682SPrzemyslaw Marczak /* Set direction to input */ 4167f196101SSimon Glass gpio_request(KEY_VOL_UP_GPIO, "volume-up"); 4177f196101SSimon Glass gpio_request(KEY_VOL_DOWN_GPIO, "volume-down"); 4189d29a682SPrzemyslaw Marczak gpio_direction_input(KEY_VOL_UP_GPIO); 4199d29a682SPrzemyslaw Marczak gpio_direction_input(KEY_VOL_DOWN_GPIO); 4209d29a682SPrzemyslaw Marczak } 4219d29a682SPrzemyslaw Marczak #endif /* CONFIG_LCD_MENU */ 422679549d1SPrzemyslaw Marczak 423679549d1SPrzemyslaw Marczak #ifdef CONFIG_CMD_BMP 424679549d1SPrzemyslaw Marczak void draw_logo(void) 425679549d1SPrzemyslaw Marczak { 426679549d1SPrzemyslaw Marczak int x, y; 427679549d1SPrzemyslaw Marczak ulong addr; 428679549d1SPrzemyslaw Marczak 429679549d1SPrzemyslaw Marczak addr = panel_info.logo_addr; 430679549d1SPrzemyslaw Marczak if (!addr) { 431679549d1SPrzemyslaw Marczak error("There is no logo data."); 432679549d1SPrzemyslaw Marczak return; 433679549d1SPrzemyslaw Marczak } 434679549d1SPrzemyslaw Marczak 435679549d1SPrzemyslaw Marczak if (panel_info.vl_width >= panel_info.logo_width) { 436679549d1SPrzemyslaw Marczak x = ((panel_info.vl_width - panel_info.logo_width) >> 1); 437903afe18SPrzemyslaw Marczak x += panel_info.logo_x_offset; /* For X center align */ 438679549d1SPrzemyslaw Marczak } else { 439679549d1SPrzemyslaw Marczak x = 0; 440679549d1SPrzemyslaw Marczak printf("Warning: image width is bigger than display width\n"); 441679549d1SPrzemyslaw Marczak } 442679549d1SPrzemyslaw Marczak 443679549d1SPrzemyslaw Marczak if (panel_info.vl_height >= panel_info.logo_height) { 444679549d1SPrzemyslaw Marczak y = ((panel_info.vl_height - panel_info.logo_height) >> 1); 445903afe18SPrzemyslaw Marczak y += panel_info.logo_y_offset; /* For Y center align */ 446679549d1SPrzemyslaw Marczak } else { 447679549d1SPrzemyslaw Marczak y = 0; 448679549d1SPrzemyslaw Marczak printf("Warning: image height is bigger than display height\n"); 449679549d1SPrzemyslaw Marczak } 450679549d1SPrzemyslaw Marczak 451679549d1SPrzemyslaw Marczak bmp_display(addr, x, y); 452679549d1SPrzemyslaw Marczak } 453679549d1SPrzemyslaw Marczak #endif /* CONFIG_CMD_BMP */ 454