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> 151ace4022SAlexey Brodkin #include <linux/sizes.h> 169d29a682SPrzemyslaw Marczak #include <asm/arch/cpu.h> 179d29a682SPrzemyslaw Marczak #include <asm/arch/gpio.h> 189d29a682SPrzemyslaw Marczak #include <asm/gpio.h> 199d29a682SPrzemyslaw Marczak #include <linux/input.h> 209d29a682SPrzemyslaw Marczak #include <power/pmic.h> 219d29a682SPrzemyslaw Marczak #include <mmc.h> 229d29a682SPrzemyslaw Marczak 239d29a682SPrzemyslaw Marczak DECLARE_GLOBAL_DATA_PTR; 249d29a682SPrzemyslaw Marczak 251d07c101SPrzemyslaw Marczak #ifdef CONFIG_SET_DFU_ALT_INFO 261d07c101SPrzemyslaw Marczak void set_dfu_alt_info(void) 271d07c101SPrzemyslaw Marczak { 281d07c101SPrzemyslaw Marczak size_t buf_size = CONFIG_SET_DFU_ALT_BUF_LEN; 291d07c101SPrzemyslaw Marczak ALLOC_CACHE_ALIGN_BUFFER(char, buf, buf_size); 301d07c101SPrzemyslaw Marczak char *alt_info = "Settings not found!"; 311d07c101SPrzemyslaw Marczak char *status = "error!\n"; 321d07c101SPrzemyslaw Marczak char *alt_setting; 331d07c101SPrzemyslaw Marczak char *alt_sep; 341d07c101SPrzemyslaw Marczak int offset = 0; 351d07c101SPrzemyslaw Marczak 361d07c101SPrzemyslaw Marczak puts("DFU alt info setting: "); 371d07c101SPrzemyslaw Marczak 381d07c101SPrzemyslaw Marczak alt_setting = get_dfu_alt_boot(); 391d07c101SPrzemyslaw Marczak if (alt_setting) { 401d07c101SPrzemyslaw Marczak setenv("dfu_alt_boot", alt_setting); 411d07c101SPrzemyslaw Marczak offset = snprintf(buf, buf_size, "%s", alt_setting); 421d07c101SPrzemyslaw Marczak } 431d07c101SPrzemyslaw Marczak 441d07c101SPrzemyslaw Marczak alt_setting = get_dfu_alt_system(); 451d07c101SPrzemyslaw Marczak if (alt_setting) { 461d07c101SPrzemyslaw Marczak if (offset) 471d07c101SPrzemyslaw Marczak alt_sep = ";"; 481d07c101SPrzemyslaw Marczak else 491d07c101SPrzemyslaw Marczak alt_sep = ""; 501d07c101SPrzemyslaw Marczak 511d07c101SPrzemyslaw Marczak offset += snprintf(buf + offset, buf_size - offset, 521d07c101SPrzemyslaw Marczak "%s%s", alt_sep, alt_setting); 531d07c101SPrzemyslaw Marczak } 541d07c101SPrzemyslaw Marczak 551d07c101SPrzemyslaw Marczak if (offset) { 561d07c101SPrzemyslaw Marczak alt_info = buf; 571d07c101SPrzemyslaw Marczak status = "done\n"; 581d07c101SPrzemyslaw Marczak } 591d07c101SPrzemyslaw Marczak 601d07c101SPrzemyslaw Marczak setenv("dfu_alt_info", alt_info); 611d07c101SPrzemyslaw Marczak puts(status); 621d07c101SPrzemyslaw Marczak } 631d07c101SPrzemyslaw Marczak #endif 641d07c101SPrzemyslaw Marczak 65eee2fab0SPiotr Wilczek #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG 66eee2fab0SPiotr Wilczek void set_board_info(void) 67eee2fab0SPiotr Wilczek { 68eee2fab0SPiotr Wilczek char info[64]; 69eee2fab0SPiotr Wilczek 700dc579f3SPrzemyslaw Marczak snprintf(info, ARRAY_SIZE(info), "%u.%u", (s5p_cpu_rev & 0xf0) >> 4, 710dc579f3SPrzemyslaw Marczak s5p_cpu_rev & 0xf); 72eee2fab0SPiotr Wilczek setenv("soc_rev", info); 73eee2fab0SPiotr Wilczek 74eee2fab0SPiotr Wilczek snprintf(info, ARRAY_SIZE(info), "%x", s5p_cpu_id); 75eee2fab0SPiotr Wilczek setenv("soc_id", info); 76eee2fab0SPiotr Wilczek 77eee2fab0SPiotr Wilczek #ifdef CONFIG_REVISION_TAG 78eee2fab0SPiotr Wilczek snprintf(info, ARRAY_SIZE(info), "%x", get_board_rev()); 79eee2fab0SPiotr Wilczek setenv("board_rev", info); 80eee2fab0SPiotr Wilczek #endif 81eee2fab0SPiotr Wilczek #ifdef CONFIG_OF_LIBFDT 82*c9c36bf5SPrzemyslaw Marczak const char *bdtype = ""; 83*c9c36bf5SPrzemyslaw Marczak const char *bdname = CONFIG_SYS_BOARD; 84*c9c36bf5SPrzemyslaw Marczak 85*c9c36bf5SPrzemyslaw Marczak #ifdef CONFIG_BOARD_TYPES 86*c9c36bf5SPrzemyslaw Marczak bdtype = get_board_type(); 87*c9c36bf5SPrzemyslaw Marczak sprintf(info, "%s%s", bdname, bdtype); 88*c9c36bf5SPrzemyslaw Marczak setenv("boardname", info); 89*c9c36bf5SPrzemyslaw Marczak #endif 90*c9c36bf5SPrzemyslaw Marczak snprintf(info, ARRAY_SIZE(info), "%s%x-%s%s.dtb", 91*c9c36bf5SPrzemyslaw Marczak CONFIG_SYS_SOC, s5p_cpu_id, bdname, bdtype); 92eee2fab0SPiotr Wilczek setenv("fdtfile", info); 93eee2fab0SPiotr Wilczek #endif 94eee2fab0SPiotr Wilczek } 95eee2fab0SPiotr Wilczek #endif /* CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG */ 96eee2fab0SPiotr Wilczek 979d29a682SPrzemyslaw Marczak #ifdef CONFIG_LCD_MENU 989d29a682SPrzemyslaw Marczak static int power_key_pressed(u32 reg) 999d29a682SPrzemyslaw Marczak { 1009d29a682SPrzemyslaw Marczak struct pmic *pmic; 1019d29a682SPrzemyslaw Marczak u32 status; 1029d29a682SPrzemyslaw Marczak u32 mask; 1039d29a682SPrzemyslaw Marczak 1049d29a682SPrzemyslaw Marczak pmic = pmic_get(KEY_PWR_PMIC_NAME); 1059d29a682SPrzemyslaw Marczak if (!pmic) { 1069d29a682SPrzemyslaw Marczak printf("%s: Not found\n", KEY_PWR_PMIC_NAME); 1079d29a682SPrzemyslaw Marczak return 0; 1089d29a682SPrzemyslaw Marczak } 1099d29a682SPrzemyslaw Marczak 1109d29a682SPrzemyslaw Marczak if (pmic_probe(pmic)) 1119d29a682SPrzemyslaw Marczak return 0; 1129d29a682SPrzemyslaw Marczak 1139d29a682SPrzemyslaw Marczak if (reg == KEY_PWR_STATUS_REG) 1149d29a682SPrzemyslaw Marczak mask = KEY_PWR_STATUS_MASK; 1159d29a682SPrzemyslaw Marczak else 1169d29a682SPrzemyslaw Marczak mask = KEY_PWR_INTERRUPT_MASK; 1179d29a682SPrzemyslaw Marczak 1189d29a682SPrzemyslaw Marczak if (pmic_reg_read(pmic, reg, &status)) 1199d29a682SPrzemyslaw Marczak return 0; 1209d29a682SPrzemyslaw Marczak 1219d29a682SPrzemyslaw Marczak return !!(status & mask); 1229d29a682SPrzemyslaw Marczak } 1239d29a682SPrzemyslaw Marczak 1249d29a682SPrzemyslaw Marczak static int key_pressed(int key) 1259d29a682SPrzemyslaw Marczak { 1269d29a682SPrzemyslaw Marczak int value; 1279d29a682SPrzemyslaw Marczak 1289d29a682SPrzemyslaw Marczak switch (key) { 1299d29a682SPrzemyslaw Marczak case KEY_POWER: 1309d29a682SPrzemyslaw Marczak value = power_key_pressed(KEY_PWR_INTERRUPT_REG); 1319d29a682SPrzemyslaw Marczak break; 1329d29a682SPrzemyslaw Marczak case KEY_VOLUMEUP: 1339d29a682SPrzemyslaw Marczak value = !gpio_get_value(KEY_VOL_UP_GPIO); 1349d29a682SPrzemyslaw Marczak break; 1359d29a682SPrzemyslaw Marczak case KEY_VOLUMEDOWN: 1369d29a682SPrzemyslaw Marczak value = !gpio_get_value(KEY_VOL_DOWN_GPIO); 1379d29a682SPrzemyslaw Marczak break; 1389d29a682SPrzemyslaw Marczak default: 1399d29a682SPrzemyslaw Marczak value = 0; 1409d29a682SPrzemyslaw Marczak break; 1419d29a682SPrzemyslaw Marczak } 1429d29a682SPrzemyslaw Marczak 1439d29a682SPrzemyslaw Marczak return value; 1449d29a682SPrzemyslaw Marczak } 1459d29a682SPrzemyslaw Marczak 1469d29a682SPrzemyslaw Marczak static int check_keys(void) 1479d29a682SPrzemyslaw Marczak { 1489d29a682SPrzemyslaw Marczak int keys = 0; 1499d29a682SPrzemyslaw Marczak 1509d29a682SPrzemyslaw Marczak if (key_pressed(KEY_POWER)) 1519d29a682SPrzemyslaw Marczak keys += KEY_POWER; 1529d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEUP)) 1539d29a682SPrzemyslaw Marczak keys += KEY_VOLUMEUP; 1549d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEDOWN)) 1559d29a682SPrzemyslaw Marczak keys += KEY_VOLUMEDOWN; 1569d29a682SPrzemyslaw Marczak 1579d29a682SPrzemyslaw Marczak return keys; 1589d29a682SPrzemyslaw Marczak } 1599d29a682SPrzemyslaw Marczak 1609d29a682SPrzemyslaw Marczak /* 1619d29a682SPrzemyslaw Marczak * 0 BOOT_MODE_INFO 1629d29a682SPrzemyslaw Marczak * 1 BOOT_MODE_THOR 1639d29a682SPrzemyslaw Marczak * 2 BOOT_MODE_UMS 1649d29a682SPrzemyslaw Marczak * 3 BOOT_MODE_DFU 1659d29a682SPrzemyslaw Marczak * 4 BOOT_MODE_EXIT 1669d29a682SPrzemyslaw Marczak */ 1679d29a682SPrzemyslaw Marczak static char * 168e6bfe79fSPrzemyslaw Marczak mode_name[BOOT_MODE_EXIT + 1][2] = { 169e6bfe79fSPrzemyslaw Marczak {"DEVICE", ""}, 170e6bfe79fSPrzemyslaw Marczak {"THOR", "thor"}, 171e6bfe79fSPrzemyslaw Marczak {"UMS", "ums"}, 172e6bfe79fSPrzemyslaw Marczak {"DFU", "dfu"}, 1735c7b8a37SPrzemyslaw Marczak {"GPT", "gpt"}, 1740954dd61SInha Song {"ENV", "env"}, 175e6bfe79fSPrzemyslaw Marczak {"EXIT", ""}, 1769d29a682SPrzemyslaw Marczak }; 1779d29a682SPrzemyslaw Marczak 1789d29a682SPrzemyslaw Marczak static char * 1799d29a682SPrzemyslaw Marczak mode_info[BOOT_MODE_EXIT + 1] = { 1809d29a682SPrzemyslaw Marczak "info", 1819d29a682SPrzemyslaw Marczak "downloader", 1829d29a682SPrzemyslaw Marczak "mass storage", 1839d29a682SPrzemyslaw Marczak "firmware update", 1845c7b8a37SPrzemyslaw Marczak "restore", 1850954dd61SInha Song "default", 1869d29a682SPrzemyslaw Marczak "and run normal boot" 1879d29a682SPrzemyslaw Marczak }; 1889d29a682SPrzemyslaw Marczak 1899d29a682SPrzemyslaw Marczak static char * 190e6bfe79fSPrzemyslaw Marczak mode_cmd[BOOT_MODE_EXIT + 1] = { 191e6bfe79fSPrzemyslaw Marczak "", 192e6bfe79fSPrzemyslaw Marczak "thor 0 mmc 0", 193e6bfe79fSPrzemyslaw Marczak "ums 0 mmc 0", 194e6bfe79fSPrzemyslaw Marczak "dfu 0 mmc 0", 1955c7b8a37SPrzemyslaw Marczak "gpt write mmc 0 $partitions", 1960954dd61SInha Song "env default -a; saveenv", 197e6bfe79fSPrzemyslaw Marczak "", 1989d29a682SPrzemyslaw Marczak }; 1999d29a682SPrzemyslaw Marczak 2009d29a682SPrzemyslaw Marczak static void display_board_info(void) 2019d29a682SPrzemyslaw Marczak { 2029d29a682SPrzemyslaw Marczak #ifdef CONFIG_GENERIC_MMC 2039d29a682SPrzemyslaw Marczak struct mmc *mmc = find_mmc_device(0); 2049d29a682SPrzemyslaw Marczak #endif 2059d29a682SPrzemyslaw Marczak vidinfo_t *vid = &panel_info; 2069d29a682SPrzemyslaw Marczak 2079d29a682SPrzemyslaw Marczak lcd_position_cursor(4, 4); 2089d29a682SPrzemyslaw Marczak 2099d29a682SPrzemyslaw Marczak lcd_printf("%s\n\t", U_BOOT_VERSION); 2109d29a682SPrzemyslaw Marczak lcd_puts("\n\t\tBoard Info:\n"); 2119d29a682SPrzemyslaw Marczak #ifdef CONFIG_SYS_BOARD 2129d29a682SPrzemyslaw Marczak lcd_printf("\tBoard name: %s\n", CONFIG_SYS_BOARD); 2139d29a682SPrzemyslaw Marczak #endif 2149d29a682SPrzemyslaw Marczak #ifdef CONFIG_REVISION_TAG 2159d29a682SPrzemyslaw Marczak lcd_printf("\tBoard rev: %u\n", get_board_rev()); 2169d29a682SPrzemyslaw Marczak #endif 2179d29a682SPrzemyslaw Marczak lcd_printf("\tDRAM banks: %u\n", CONFIG_NR_DRAM_BANKS); 2189d29a682SPrzemyslaw Marczak lcd_printf("\tDRAM size: %u MB\n", gd->ram_size / SZ_1M); 2199d29a682SPrzemyslaw Marczak 2209d29a682SPrzemyslaw Marczak #ifdef CONFIG_GENERIC_MMC 2219d29a682SPrzemyslaw Marczak if (mmc) { 2229d29a682SPrzemyslaw Marczak if (!mmc->capacity) 2239d29a682SPrzemyslaw Marczak mmc_init(mmc); 2249d29a682SPrzemyslaw Marczak 2259d29a682SPrzemyslaw Marczak lcd_printf("\teMMC size: %llu MB\n", mmc->capacity / SZ_1M); 2269d29a682SPrzemyslaw Marczak } 2279d29a682SPrzemyslaw Marczak #endif 2289d29a682SPrzemyslaw Marczak if (vid) 2299d29a682SPrzemyslaw Marczak lcd_printf("\tDisplay resolution: %u x % u\n", 2309d29a682SPrzemyslaw Marczak vid->vl_col, vid->vl_row); 2319d29a682SPrzemyslaw Marczak 2329d29a682SPrzemyslaw Marczak lcd_printf("\tDisplay BPP: %u\n", 1 << vid->vl_bpix); 2339d29a682SPrzemyslaw Marczak } 2349d29a682SPrzemyslaw Marczak 2359d29a682SPrzemyslaw Marczak static int mode_leave_menu(int mode) 2369d29a682SPrzemyslaw Marczak { 2379d29a682SPrzemyslaw Marczak char *exit_option; 238e6bfe79fSPrzemyslaw Marczak char *exit_reset = "reset"; 2399d29a682SPrzemyslaw Marczak char *exit_back = "back"; 2409d29a682SPrzemyslaw Marczak cmd_tbl_t *cmd; 2419d29a682SPrzemyslaw Marczak int cmd_result; 2429d29a682SPrzemyslaw Marczak int leave; 2439d29a682SPrzemyslaw Marczak 2449d29a682SPrzemyslaw Marczak lcd_clear(); 2459d29a682SPrzemyslaw Marczak 2469d29a682SPrzemyslaw Marczak switch (mode) { 2479d29a682SPrzemyslaw Marczak case BOOT_MODE_EXIT: 2489d29a682SPrzemyslaw Marczak return 1; 2499d29a682SPrzemyslaw Marczak case BOOT_MODE_INFO: 2509d29a682SPrzemyslaw Marczak display_board_info(); 2519d29a682SPrzemyslaw Marczak exit_option = exit_back; 2529d29a682SPrzemyslaw Marczak leave = 0; 2539d29a682SPrzemyslaw Marczak break; 2549d29a682SPrzemyslaw Marczak default: 255e6bfe79fSPrzemyslaw Marczak cmd = find_cmd(mode_name[mode][1]); 2569d29a682SPrzemyslaw Marczak if (cmd) { 257e6bfe79fSPrzemyslaw Marczak printf("Enter: %s %s\n", mode_name[mode][0], 2589d29a682SPrzemyslaw Marczak mode_info[mode]); 259e6bfe79fSPrzemyslaw Marczak lcd_printf("\n\n\t%s %s\n", mode_name[mode][0], 2609d29a682SPrzemyslaw Marczak mode_info[mode]); 2619d29a682SPrzemyslaw Marczak lcd_puts("\n\tDo not turn off device before finish!\n"); 2629d29a682SPrzemyslaw Marczak 263e6bfe79fSPrzemyslaw Marczak cmd_result = run_command(mode_cmd[mode], 0); 2649d29a682SPrzemyslaw Marczak 2659d29a682SPrzemyslaw Marczak if (cmd_result == CMD_RET_SUCCESS) { 2669d29a682SPrzemyslaw Marczak printf("Command finished\n"); 2679d29a682SPrzemyslaw Marczak lcd_clear(); 2689d29a682SPrzemyslaw Marczak lcd_printf("\n\n\t%s finished\n", 269e6bfe79fSPrzemyslaw Marczak mode_name[mode][0]); 2709d29a682SPrzemyslaw Marczak 271e6bfe79fSPrzemyslaw Marczak exit_option = exit_reset; 2729d29a682SPrzemyslaw Marczak leave = 1; 2739d29a682SPrzemyslaw Marczak } else { 2749d29a682SPrzemyslaw Marczak printf("Command error\n"); 2759d29a682SPrzemyslaw Marczak lcd_clear(); 2769d29a682SPrzemyslaw Marczak lcd_printf("\n\n\t%s command error\n", 277e6bfe79fSPrzemyslaw Marczak mode_name[mode][0]); 2789d29a682SPrzemyslaw Marczak 2799d29a682SPrzemyslaw Marczak exit_option = exit_back; 2809d29a682SPrzemyslaw Marczak leave = 0; 2819d29a682SPrzemyslaw Marczak } 2829d29a682SPrzemyslaw Marczak } else { 2839d29a682SPrzemyslaw Marczak lcd_puts("\n\n\tThis mode is not supported.\n"); 2849d29a682SPrzemyslaw Marczak exit_option = exit_back; 2859d29a682SPrzemyslaw Marczak leave = 0; 2869d29a682SPrzemyslaw Marczak } 2879d29a682SPrzemyslaw Marczak } 2889d29a682SPrzemyslaw Marczak 2899d29a682SPrzemyslaw Marczak lcd_printf("\n\n\tPress POWER KEY to %s\n", exit_option); 2909d29a682SPrzemyslaw Marczak 2919d29a682SPrzemyslaw Marczak /* Clear PWR button Rising edge interrupt status flag */ 2929d29a682SPrzemyslaw Marczak power_key_pressed(KEY_PWR_INTERRUPT_REG); 2939d29a682SPrzemyslaw Marczak 2949d29a682SPrzemyslaw Marczak /* Wait for PWR key */ 2959d29a682SPrzemyslaw Marczak while (!key_pressed(KEY_POWER)) 2969d29a682SPrzemyslaw Marczak mdelay(1); 2979d29a682SPrzemyslaw Marczak 2989d29a682SPrzemyslaw Marczak lcd_clear(); 2999d29a682SPrzemyslaw Marczak return leave; 3009d29a682SPrzemyslaw Marczak } 3019d29a682SPrzemyslaw Marczak 3029d29a682SPrzemyslaw Marczak static void display_download_menu(int mode) 3039d29a682SPrzemyslaw Marczak { 3049d29a682SPrzemyslaw Marczak char *selection[BOOT_MODE_EXIT + 1]; 3059d29a682SPrzemyslaw Marczak int i; 3069d29a682SPrzemyslaw Marczak 3079d29a682SPrzemyslaw Marczak for (i = 0; i <= BOOT_MODE_EXIT; i++) 3089d29a682SPrzemyslaw Marczak selection[i] = "[ ]"; 3099d29a682SPrzemyslaw Marczak 3109d29a682SPrzemyslaw Marczak selection[mode] = "[=>]"; 3119d29a682SPrzemyslaw Marczak 3129d29a682SPrzemyslaw Marczak lcd_clear(); 313605d7e2aSPrzemyslaw Marczak lcd_printf("\n\n\t\tDownload Mode Menu\n\n"); 3149d29a682SPrzemyslaw Marczak 3159d29a682SPrzemyslaw Marczak for (i = 0; i <= BOOT_MODE_EXIT; i++) 3169d29a682SPrzemyslaw Marczak lcd_printf("\t%s %s - %s\n\n", selection[i], 317e6bfe79fSPrzemyslaw Marczak mode_name[i][0], 3189d29a682SPrzemyslaw Marczak mode_info[i]); 3199d29a682SPrzemyslaw Marczak } 3209d29a682SPrzemyslaw Marczak 3219d29a682SPrzemyslaw Marczak static void download_menu(void) 3229d29a682SPrzemyslaw Marczak { 3239d29a682SPrzemyslaw Marczak int mode = 0; 3249d29a682SPrzemyslaw Marczak int last_mode = 0; 3259d29a682SPrzemyslaw Marczak int run; 326605d7e2aSPrzemyslaw Marczak int key = 0; 327605d7e2aSPrzemyslaw Marczak int timeout = 15; /* sec */ 328605d7e2aSPrzemyslaw Marczak int i; 3299d29a682SPrzemyslaw Marczak 3309d29a682SPrzemyslaw Marczak display_download_menu(mode); 3319d29a682SPrzemyslaw Marczak 332605d7e2aSPrzemyslaw Marczak lcd_puts("\n"); 333605d7e2aSPrzemyslaw Marczak 334605d7e2aSPrzemyslaw Marczak /* Start count if no key is pressed */ 335605d7e2aSPrzemyslaw Marczak while (check_keys()) 336605d7e2aSPrzemyslaw Marczak continue; 337605d7e2aSPrzemyslaw Marczak 338605d7e2aSPrzemyslaw Marczak while (timeout--) { 339605d7e2aSPrzemyslaw Marczak lcd_printf("\r\tNormal boot will start in: %2.d seconds.", 340605d7e2aSPrzemyslaw Marczak timeout); 341605d7e2aSPrzemyslaw Marczak 342605d7e2aSPrzemyslaw Marczak /* about 1000 ms in for loop */ 343605d7e2aSPrzemyslaw Marczak for (i = 0; i < 10; i++) { 344605d7e2aSPrzemyslaw Marczak mdelay(100); 345605d7e2aSPrzemyslaw Marczak key = check_keys(); 346605d7e2aSPrzemyslaw Marczak if (key) 347605d7e2aSPrzemyslaw Marczak break; 348605d7e2aSPrzemyslaw Marczak } 349605d7e2aSPrzemyslaw Marczak if (key) 350605d7e2aSPrzemyslaw Marczak break; 351605d7e2aSPrzemyslaw Marczak } 352605d7e2aSPrzemyslaw Marczak 353605d7e2aSPrzemyslaw Marczak if (!key) { 354605d7e2aSPrzemyslaw Marczak lcd_clear(); 355605d7e2aSPrzemyslaw Marczak return; 356605d7e2aSPrzemyslaw Marczak } 357605d7e2aSPrzemyslaw Marczak 3589d29a682SPrzemyslaw Marczak while (1) { 3599d29a682SPrzemyslaw Marczak run = 0; 3609d29a682SPrzemyslaw Marczak 3619d29a682SPrzemyslaw Marczak if (mode != last_mode) 3629d29a682SPrzemyslaw Marczak display_download_menu(mode); 3639d29a682SPrzemyslaw Marczak 3649d29a682SPrzemyslaw Marczak last_mode = mode; 365f418a1cfSPrzemyslaw Marczak mdelay(200); 3669d29a682SPrzemyslaw Marczak 3679d29a682SPrzemyslaw Marczak key = check_keys(); 3689d29a682SPrzemyslaw Marczak switch (key) { 3699d29a682SPrzemyslaw Marczak case KEY_POWER: 3709d29a682SPrzemyslaw Marczak run = 1; 3719d29a682SPrzemyslaw Marczak break; 3729d29a682SPrzemyslaw Marczak case KEY_VOLUMEUP: 3739d29a682SPrzemyslaw Marczak if (mode > 0) 3749d29a682SPrzemyslaw Marczak mode--; 3759d29a682SPrzemyslaw Marczak break; 3769d29a682SPrzemyslaw Marczak case KEY_VOLUMEDOWN: 3779d29a682SPrzemyslaw Marczak if (mode < BOOT_MODE_EXIT) 3789d29a682SPrzemyslaw Marczak mode++; 3799d29a682SPrzemyslaw Marczak break; 3809d29a682SPrzemyslaw Marczak default: 3819d29a682SPrzemyslaw Marczak break; 3829d29a682SPrzemyslaw Marczak } 3839d29a682SPrzemyslaw Marczak 3849d29a682SPrzemyslaw Marczak if (run) { 3859d29a682SPrzemyslaw Marczak if (mode_leave_menu(mode)) 386e6bfe79fSPrzemyslaw Marczak run_command("reset", 0); 3879d29a682SPrzemyslaw Marczak 3889d29a682SPrzemyslaw Marczak display_download_menu(mode); 3899d29a682SPrzemyslaw Marczak } 3909d29a682SPrzemyslaw Marczak } 3919d29a682SPrzemyslaw Marczak 3929d29a682SPrzemyslaw Marczak lcd_clear(); 3939d29a682SPrzemyslaw Marczak } 3949d29a682SPrzemyslaw Marczak 3959d29a682SPrzemyslaw Marczak void check_boot_mode(void) 3969d29a682SPrzemyslaw Marczak { 3979d29a682SPrzemyslaw Marczak int pwr_key; 3989d29a682SPrzemyslaw Marczak 3999d29a682SPrzemyslaw Marczak pwr_key = power_key_pressed(KEY_PWR_STATUS_REG); 4009d29a682SPrzemyslaw Marczak if (!pwr_key) 4019d29a682SPrzemyslaw Marczak return; 4029d29a682SPrzemyslaw Marczak 4039d29a682SPrzemyslaw Marczak /* Clear PWR button Rising edge interrupt status flag */ 4049d29a682SPrzemyslaw Marczak power_key_pressed(KEY_PWR_INTERRUPT_REG); 4059d29a682SPrzemyslaw Marczak 4069d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEUP)) 407605d7e2aSPrzemyslaw Marczak download_menu(); 4089d29a682SPrzemyslaw Marczak else if (key_pressed(KEY_VOLUMEDOWN)) 4099d29a682SPrzemyslaw Marczak mode_leave_menu(BOOT_MODE_THOR); 4109d29a682SPrzemyslaw Marczak } 4119d29a682SPrzemyslaw Marczak 4129d29a682SPrzemyslaw Marczak void keys_init(void) 4139d29a682SPrzemyslaw Marczak { 4149d29a682SPrzemyslaw Marczak /* Set direction to input */ 4159d29a682SPrzemyslaw Marczak gpio_direction_input(KEY_VOL_UP_GPIO); 4169d29a682SPrzemyslaw Marczak gpio_direction_input(KEY_VOL_DOWN_GPIO); 4179d29a682SPrzemyslaw Marczak } 4189d29a682SPrzemyslaw Marczak #endif /* CONFIG_LCD_MENU */ 419679549d1SPrzemyslaw Marczak 420679549d1SPrzemyslaw Marczak #ifdef CONFIG_CMD_BMP 421679549d1SPrzemyslaw Marczak void draw_logo(void) 422679549d1SPrzemyslaw Marczak { 423679549d1SPrzemyslaw Marczak int x, y; 424679549d1SPrzemyslaw Marczak ulong addr; 425679549d1SPrzemyslaw Marczak 426679549d1SPrzemyslaw Marczak addr = panel_info.logo_addr; 427679549d1SPrzemyslaw Marczak if (!addr) { 428679549d1SPrzemyslaw Marczak error("There is no logo data."); 429679549d1SPrzemyslaw Marczak return; 430679549d1SPrzemyslaw Marczak } 431679549d1SPrzemyslaw Marczak 432679549d1SPrzemyslaw Marczak if (panel_info.vl_width >= panel_info.logo_width) { 433679549d1SPrzemyslaw Marczak x = ((panel_info.vl_width - panel_info.logo_width) >> 1); 434903afe18SPrzemyslaw Marczak x += panel_info.logo_x_offset; /* For X center align */ 435679549d1SPrzemyslaw Marczak } else { 436679549d1SPrzemyslaw Marczak x = 0; 437679549d1SPrzemyslaw Marczak printf("Warning: image width is bigger than display width\n"); 438679549d1SPrzemyslaw Marczak } 439679549d1SPrzemyslaw Marczak 440679549d1SPrzemyslaw Marczak if (panel_info.vl_height >= panel_info.logo_height) { 441679549d1SPrzemyslaw Marczak y = ((panel_info.vl_height - panel_info.logo_height) >> 1); 442903afe18SPrzemyslaw Marczak y += panel_info.logo_y_offset; /* For Y center align */ 443679549d1SPrzemyslaw Marczak } else { 444679549d1SPrzemyslaw Marczak y = 0; 445679549d1SPrzemyslaw Marczak printf("Warning: image height is bigger than display height\n"); 446679549d1SPrzemyslaw Marczak } 447679549d1SPrzemyslaw Marczak 448679549d1SPrzemyslaw Marczak bmp_display(addr, x, y); 449679549d1SPrzemyslaw Marczak } 450679549d1SPrzemyslaw Marczak #endif /* CONFIG_CMD_BMP */ 451