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> 141ace4022SAlexey Brodkin #include <linux/sizes.h> 159d29a682SPrzemyslaw Marczak #include <asm/arch/cpu.h> 169d29a682SPrzemyslaw Marczak #include <asm/arch/gpio.h> 179d29a682SPrzemyslaw Marczak #include <asm/gpio.h> 189d29a682SPrzemyslaw Marczak #include <linux/input.h> 199d29a682SPrzemyslaw Marczak #include <power/pmic.h> 209d29a682SPrzemyslaw Marczak #include <mmc.h> 219d29a682SPrzemyslaw Marczak 229d29a682SPrzemyslaw Marczak DECLARE_GLOBAL_DATA_PTR; 239d29a682SPrzemyslaw Marczak 24eee2fab0SPiotr Wilczek #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG 25eee2fab0SPiotr Wilczek void set_board_info(void) 26eee2fab0SPiotr Wilczek { 27eee2fab0SPiotr Wilczek char info[64]; 28eee2fab0SPiotr Wilczek 29eee2fab0SPiotr Wilczek snprintf(info, ARRAY_SIZE(info), "%d.%d", s5p_cpu_rev & 0x0f, 30eee2fab0SPiotr Wilczek (s5p_cpu_rev & 0xf0) >> 0x04); 31eee2fab0SPiotr Wilczek setenv("soc_rev", info); 32eee2fab0SPiotr Wilczek 33eee2fab0SPiotr Wilczek snprintf(info, ARRAY_SIZE(info), "%x", s5p_cpu_id); 34eee2fab0SPiotr Wilczek setenv("soc_id", info); 35eee2fab0SPiotr Wilczek 36eee2fab0SPiotr Wilczek #ifdef CONFIG_REVISION_TAG 37eee2fab0SPiotr Wilczek snprintf(info, ARRAY_SIZE(info), "%x", get_board_rev()); 38eee2fab0SPiotr Wilczek setenv("board_rev", info); 39eee2fab0SPiotr Wilczek #endif 40eee2fab0SPiotr Wilczek #ifdef CONFIG_OF_LIBFDT 41eee2fab0SPiotr Wilczek snprintf(info, ARRAY_SIZE(info), "%s%x-%s.dtb", 42eee2fab0SPiotr Wilczek CONFIG_SYS_SOC, s5p_cpu_id, CONFIG_SYS_BOARD); 43eee2fab0SPiotr Wilczek setenv("fdtfile", info); 44eee2fab0SPiotr Wilczek #endif 45eee2fab0SPiotr Wilczek } 46eee2fab0SPiotr Wilczek #endif /* CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG */ 47eee2fab0SPiotr Wilczek 489d29a682SPrzemyslaw Marczak #ifdef CONFIG_LCD_MENU 499d29a682SPrzemyslaw Marczak static int power_key_pressed(u32 reg) 509d29a682SPrzemyslaw Marczak { 519d29a682SPrzemyslaw Marczak struct pmic *pmic; 529d29a682SPrzemyslaw Marczak u32 status; 539d29a682SPrzemyslaw Marczak u32 mask; 549d29a682SPrzemyslaw Marczak 559d29a682SPrzemyslaw Marczak pmic = pmic_get(KEY_PWR_PMIC_NAME); 569d29a682SPrzemyslaw Marczak if (!pmic) { 579d29a682SPrzemyslaw Marczak printf("%s: Not found\n", KEY_PWR_PMIC_NAME); 589d29a682SPrzemyslaw Marczak return 0; 599d29a682SPrzemyslaw Marczak } 609d29a682SPrzemyslaw Marczak 619d29a682SPrzemyslaw Marczak if (pmic_probe(pmic)) 629d29a682SPrzemyslaw Marczak return 0; 639d29a682SPrzemyslaw Marczak 649d29a682SPrzemyslaw Marczak if (reg == KEY_PWR_STATUS_REG) 659d29a682SPrzemyslaw Marczak mask = KEY_PWR_STATUS_MASK; 669d29a682SPrzemyslaw Marczak else 679d29a682SPrzemyslaw Marczak mask = KEY_PWR_INTERRUPT_MASK; 689d29a682SPrzemyslaw Marczak 699d29a682SPrzemyslaw Marczak if (pmic_reg_read(pmic, reg, &status)) 709d29a682SPrzemyslaw Marczak return 0; 719d29a682SPrzemyslaw Marczak 729d29a682SPrzemyslaw Marczak return !!(status & mask); 739d29a682SPrzemyslaw Marczak } 749d29a682SPrzemyslaw Marczak 759d29a682SPrzemyslaw Marczak static int key_pressed(int key) 769d29a682SPrzemyslaw Marczak { 779d29a682SPrzemyslaw Marczak int value; 789d29a682SPrzemyslaw Marczak 799d29a682SPrzemyslaw Marczak switch (key) { 809d29a682SPrzemyslaw Marczak case KEY_POWER: 819d29a682SPrzemyslaw Marczak value = power_key_pressed(KEY_PWR_INTERRUPT_REG); 829d29a682SPrzemyslaw Marczak break; 839d29a682SPrzemyslaw Marczak case KEY_VOLUMEUP: 849d29a682SPrzemyslaw Marczak value = !gpio_get_value(KEY_VOL_UP_GPIO); 859d29a682SPrzemyslaw Marczak break; 869d29a682SPrzemyslaw Marczak case KEY_VOLUMEDOWN: 879d29a682SPrzemyslaw Marczak value = !gpio_get_value(KEY_VOL_DOWN_GPIO); 889d29a682SPrzemyslaw Marczak break; 899d29a682SPrzemyslaw Marczak default: 909d29a682SPrzemyslaw Marczak value = 0; 919d29a682SPrzemyslaw Marczak break; 929d29a682SPrzemyslaw Marczak } 939d29a682SPrzemyslaw Marczak 949d29a682SPrzemyslaw Marczak return value; 959d29a682SPrzemyslaw Marczak } 969d29a682SPrzemyslaw Marczak 979d29a682SPrzemyslaw Marczak static int check_keys(void) 989d29a682SPrzemyslaw Marczak { 999d29a682SPrzemyslaw Marczak int keys = 0; 1009d29a682SPrzemyslaw Marczak 1019d29a682SPrzemyslaw Marczak if (key_pressed(KEY_POWER)) 1029d29a682SPrzemyslaw Marczak keys += KEY_POWER; 1039d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEUP)) 1049d29a682SPrzemyslaw Marczak keys += KEY_VOLUMEUP; 1059d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEDOWN)) 1069d29a682SPrzemyslaw Marczak keys += KEY_VOLUMEDOWN; 1079d29a682SPrzemyslaw Marczak 1089d29a682SPrzemyslaw Marczak return keys; 1099d29a682SPrzemyslaw Marczak } 1109d29a682SPrzemyslaw Marczak 1119d29a682SPrzemyslaw Marczak /* 1129d29a682SPrzemyslaw Marczak * 0 BOOT_MODE_INFO 1139d29a682SPrzemyslaw Marczak * 1 BOOT_MODE_THOR 1149d29a682SPrzemyslaw Marczak * 2 BOOT_MODE_UMS 1159d29a682SPrzemyslaw Marczak * 3 BOOT_MODE_DFU 1169d29a682SPrzemyslaw Marczak * 4 BOOT_MODE_EXIT 1179d29a682SPrzemyslaw Marczak */ 1189d29a682SPrzemyslaw Marczak static char * 119e6bfe79fSPrzemyslaw Marczak mode_name[BOOT_MODE_EXIT + 1][2] = { 120e6bfe79fSPrzemyslaw Marczak {"DEVICE", ""}, 121e6bfe79fSPrzemyslaw Marczak {"THOR", "thor"}, 122e6bfe79fSPrzemyslaw Marczak {"UMS", "ums"}, 123e6bfe79fSPrzemyslaw Marczak {"DFU", "dfu"}, 1245c7b8a37SPrzemyslaw Marczak {"GPT", "gpt"}, 125*0954dd61SInha Song {"ENV", "env"}, 126e6bfe79fSPrzemyslaw Marczak {"EXIT", ""}, 1279d29a682SPrzemyslaw Marczak }; 1289d29a682SPrzemyslaw Marczak 1299d29a682SPrzemyslaw Marczak static char * 1309d29a682SPrzemyslaw Marczak mode_info[BOOT_MODE_EXIT + 1] = { 1319d29a682SPrzemyslaw Marczak "info", 1329d29a682SPrzemyslaw Marczak "downloader", 1339d29a682SPrzemyslaw Marczak "mass storage", 1349d29a682SPrzemyslaw Marczak "firmware update", 1355c7b8a37SPrzemyslaw Marczak "restore", 136*0954dd61SInha Song "default", 1379d29a682SPrzemyslaw Marczak "and run normal boot" 1389d29a682SPrzemyslaw Marczak }; 1399d29a682SPrzemyslaw Marczak 1409d29a682SPrzemyslaw Marczak static char * 141e6bfe79fSPrzemyslaw Marczak mode_cmd[BOOT_MODE_EXIT + 1] = { 142e6bfe79fSPrzemyslaw Marczak "", 143e6bfe79fSPrzemyslaw Marczak "thor 0 mmc 0", 144e6bfe79fSPrzemyslaw Marczak "ums 0 mmc 0", 145e6bfe79fSPrzemyslaw Marczak "dfu 0 mmc 0", 1465c7b8a37SPrzemyslaw Marczak "gpt write mmc 0 $partitions", 147*0954dd61SInha Song "env default -a; saveenv", 148e6bfe79fSPrzemyslaw Marczak "", 1499d29a682SPrzemyslaw Marczak }; 1509d29a682SPrzemyslaw Marczak 1519d29a682SPrzemyslaw Marczak static void display_board_info(void) 1529d29a682SPrzemyslaw Marczak { 1539d29a682SPrzemyslaw Marczak #ifdef CONFIG_GENERIC_MMC 1549d29a682SPrzemyslaw Marczak struct mmc *mmc = find_mmc_device(0); 1559d29a682SPrzemyslaw Marczak #endif 1569d29a682SPrzemyslaw Marczak vidinfo_t *vid = &panel_info; 1579d29a682SPrzemyslaw Marczak 1589d29a682SPrzemyslaw Marczak lcd_position_cursor(4, 4); 1599d29a682SPrzemyslaw Marczak 1609d29a682SPrzemyslaw Marczak lcd_printf("%s\n\t", U_BOOT_VERSION); 1619d29a682SPrzemyslaw Marczak lcd_puts("\n\t\tBoard Info:\n"); 1629d29a682SPrzemyslaw Marczak #ifdef CONFIG_SYS_BOARD 1639d29a682SPrzemyslaw Marczak lcd_printf("\tBoard name: %s\n", CONFIG_SYS_BOARD); 1649d29a682SPrzemyslaw Marczak #endif 1659d29a682SPrzemyslaw Marczak #ifdef CONFIG_REVISION_TAG 1669d29a682SPrzemyslaw Marczak lcd_printf("\tBoard rev: %u\n", get_board_rev()); 1679d29a682SPrzemyslaw Marczak #endif 1689d29a682SPrzemyslaw Marczak lcd_printf("\tDRAM banks: %u\n", CONFIG_NR_DRAM_BANKS); 1699d29a682SPrzemyslaw Marczak lcd_printf("\tDRAM size: %u MB\n", gd->ram_size / SZ_1M); 1709d29a682SPrzemyslaw Marczak 1719d29a682SPrzemyslaw Marczak #ifdef CONFIG_GENERIC_MMC 1729d29a682SPrzemyslaw Marczak if (mmc) { 1739d29a682SPrzemyslaw Marczak if (!mmc->capacity) 1749d29a682SPrzemyslaw Marczak mmc_init(mmc); 1759d29a682SPrzemyslaw Marczak 1769d29a682SPrzemyslaw Marczak lcd_printf("\teMMC size: %llu MB\n", mmc->capacity / SZ_1M); 1779d29a682SPrzemyslaw Marczak } 1789d29a682SPrzemyslaw Marczak #endif 1799d29a682SPrzemyslaw Marczak if (vid) 1809d29a682SPrzemyslaw Marczak lcd_printf("\tDisplay resolution: %u x % u\n", 1819d29a682SPrzemyslaw Marczak vid->vl_col, vid->vl_row); 1829d29a682SPrzemyslaw Marczak 1839d29a682SPrzemyslaw Marczak lcd_printf("\tDisplay BPP: %u\n", 1 << vid->vl_bpix); 1849d29a682SPrzemyslaw Marczak } 1859d29a682SPrzemyslaw Marczak 1869d29a682SPrzemyslaw Marczak static int mode_leave_menu(int mode) 1879d29a682SPrzemyslaw Marczak { 1889d29a682SPrzemyslaw Marczak char *exit_option; 189e6bfe79fSPrzemyslaw Marczak char *exit_reset = "reset"; 1909d29a682SPrzemyslaw Marczak char *exit_back = "back"; 1919d29a682SPrzemyslaw Marczak cmd_tbl_t *cmd; 1929d29a682SPrzemyslaw Marczak int cmd_result; 1939d29a682SPrzemyslaw Marczak int leave; 1949d29a682SPrzemyslaw Marczak 1959d29a682SPrzemyslaw Marczak lcd_clear(); 1969d29a682SPrzemyslaw Marczak 1979d29a682SPrzemyslaw Marczak switch (mode) { 1989d29a682SPrzemyslaw Marczak case BOOT_MODE_EXIT: 1999d29a682SPrzemyslaw Marczak return 1; 2009d29a682SPrzemyslaw Marczak case BOOT_MODE_INFO: 2019d29a682SPrzemyslaw Marczak display_board_info(); 2029d29a682SPrzemyslaw Marczak exit_option = exit_back; 2039d29a682SPrzemyslaw Marczak leave = 0; 2049d29a682SPrzemyslaw Marczak break; 2059d29a682SPrzemyslaw Marczak default: 206e6bfe79fSPrzemyslaw Marczak cmd = find_cmd(mode_name[mode][1]); 2079d29a682SPrzemyslaw Marczak if (cmd) { 208e6bfe79fSPrzemyslaw Marczak printf("Enter: %s %s\n", mode_name[mode][0], 2099d29a682SPrzemyslaw Marczak mode_info[mode]); 210e6bfe79fSPrzemyslaw Marczak lcd_printf("\n\n\t%s %s\n", mode_name[mode][0], 2119d29a682SPrzemyslaw Marczak mode_info[mode]); 2129d29a682SPrzemyslaw Marczak lcd_puts("\n\tDo not turn off device before finish!\n"); 2139d29a682SPrzemyslaw Marczak 214e6bfe79fSPrzemyslaw Marczak cmd_result = run_command(mode_cmd[mode], 0); 2159d29a682SPrzemyslaw Marczak 2169d29a682SPrzemyslaw Marczak if (cmd_result == CMD_RET_SUCCESS) { 2179d29a682SPrzemyslaw Marczak printf("Command finished\n"); 2189d29a682SPrzemyslaw Marczak lcd_clear(); 2199d29a682SPrzemyslaw Marczak lcd_printf("\n\n\t%s finished\n", 220e6bfe79fSPrzemyslaw Marczak mode_name[mode][0]); 2219d29a682SPrzemyslaw Marczak 222e6bfe79fSPrzemyslaw Marczak exit_option = exit_reset; 2239d29a682SPrzemyslaw Marczak leave = 1; 2249d29a682SPrzemyslaw Marczak } else { 2259d29a682SPrzemyslaw Marczak printf("Command error\n"); 2269d29a682SPrzemyslaw Marczak lcd_clear(); 2279d29a682SPrzemyslaw Marczak lcd_printf("\n\n\t%s command error\n", 228e6bfe79fSPrzemyslaw Marczak mode_name[mode][0]); 2299d29a682SPrzemyslaw Marczak 2309d29a682SPrzemyslaw Marczak exit_option = exit_back; 2319d29a682SPrzemyslaw Marczak leave = 0; 2329d29a682SPrzemyslaw Marczak } 2339d29a682SPrzemyslaw Marczak } else { 2349d29a682SPrzemyslaw Marczak lcd_puts("\n\n\tThis mode is not supported.\n"); 2359d29a682SPrzemyslaw Marczak exit_option = exit_back; 2369d29a682SPrzemyslaw Marczak leave = 0; 2379d29a682SPrzemyslaw Marczak } 2389d29a682SPrzemyslaw Marczak } 2399d29a682SPrzemyslaw Marczak 2409d29a682SPrzemyslaw Marczak lcd_printf("\n\n\tPress POWER KEY to %s\n", exit_option); 2419d29a682SPrzemyslaw Marczak 2429d29a682SPrzemyslaw Marczak /* Clear PWR button Rising edge interrupt status flag */ 2439d29a682SPrzemyslaw Marczak power_key_pressed(KEY_PWR_INTERRUPT_REG); 2449d29a682SPrzemyslaw Marczak 2459d29a682SPrzemyslaw Marczak /* Wait for PWR key */ 2469d29a682SPrzemyslaw Marczak while (!key_pressed(KEY_POWER)) 2479d29a682SPrzemyslaw Marczak mdelay(1); 2489d29a682SPrzemyslaw Marczak 2499d29a682SPrzemyslaw Marczak lcd_clear(); 2509d29a682SPrzemyslaw Marczak return leave; 2519d29a682SPrzemyslaw Marczak } 2529d29a682SPrzemyslaw Marczak 2539d29a682SPrzemyslaw Marczak static void display_download_menu(int mode) 2549d29a682SPrzemyslaw Marczak { 2559d29a682SPrzemyslaw Marczak char *selection[BOOT_MODE_EXIT + 1]; 2569d29a682SPrzemyslaw Marczak int i; 2579d29a682SPrzemyslaw Marczak 2589d29a682SPrzemyslaw Marczak for (i = 0; i <= BOOT_MODE_EXIT; i++) 2599d29a682SPrzemyslaw Marczak selection[i] = "[ ]"; 2609d29a682SPrzemyslaw Marczak 2619d29a682SPrzemyslaw Marczak selection[mode] = "[=>]"; 2629d29a682SPrzemyslaw Marczak 2639d29a682SPrzemyslaw Marczak lcd_clear(); 2649d29a682SPrzemyslaw Marczak lcd_printf("\n\t\tDownload Mode Menu\n"); 2659d29a682SPrzemyslaw Marczak 2669d29a682SPrzemyslaw Marczak for (i = 0; i <= BOOT_MODE_EXIT; i++) 2679d29a682SPrzemyslaw Marczak lcd_printf("\t%s %s - %s\n\n", selection[i], 268e6bfe79fSPrzemyslaw Marczak mode_name[i][0], 2699d29a682SPrzemyslaw Marczak mode_info[i]); 2709d29a682SPrzemyslaw Marczak } 2719d29a682SPrzemyslaw Marczak 2729d29a682SPrzemyslaw Marczak static void download_menu(void) 2739d29a682SPrzemyslaw Marczak { 2749d29a682SPrzemyslaw Marczak int mode = 0; 2759d29a682SPrzemyslaw Marczak int last_mode = 0; 2769d29a682SPrzemyslaw Marczak int run; 2779d29a682SPrzemyslaw Marczak int key; 2789d29a682SPrzemyslaw Marczak 2799d29a682SPrzemyslaw Marczak display_download_menu(mode); 2809d29a682SPrzemyslaw Marczak 2819d29a682SPrzemyslaw Marczak while (1) { 2829d29a682SPrzemyslaw Marczak run = 0; 2839d29a682SPrzemyslaw Marczak 2849d29a682SPrzemyslaw Marczak if (mode != last_mode) 2859d29a682SPrzemyslaw Marczak display_download_menu(mode); 2869d29a682SPrzemyslaw Marczak 2879d29a682SPrzemyslaw Marczak last_mode = mode; 2889d29a682SPrzemyslaw Marczak mdelay(100); 2899d29a682SPrzemyslaw Marczak 2909d29a682SPrzemyslaw Marczak key = check_keys(); 2919d29a682SPrzemyslaw Marczak switch (key) { 2929d29a682SPrzemyslaw Marczak case KEY_POWER: 2939d29a682SPrzemyslaw Marczak run = 1; 2949d29a682SPrzemyslaw Marczak break; 2959d29a682SPrzemyslaw Marczak case KEY_VOLUMEUP: 2969d29a682SPrzemyslaw Marczak if (mode > 0) 2979d29a682SPrzemyslaw Marczak mode--; 2989d29a682SPrzemyslaw Marczak break; 2999d29a682SPrzemyslaw Marczak case KEY_VOLUMEDOWN: 3009d29a682SPrzemyslaw Marczak if (mode < BOOT_MODE_EXIT) 3019d29a682SPrzemyslaw Marczak mode++; 3029d29a682SPrzemyslaw Marczak break; 3039d29a682SPrzemyslaw Marczak default: 3049d29a682SPrzemyslaw Marczak break; 3059d29a682SPrzemyslaw Marczak } 3069d29a682SPrzemyslaw Marczak 3079d29a682SPrzemyslaw Marczak if (run) { 3089d29a682SPrzemyslaw Marczak if (mode_leave_menu(mode)) 309e6bfe79fSPrzemyslaw Marczak run_command("reset", 0); 3109d29a682SPrzemyslaw Marczak 3119d29a682SPrzemyslaw Marczak display_download_menu(mode); 3129d29a682SPrzemyslaw Marczak } 3139d29a682SPrzemyslaw Marczak } 3149d29a682SPrzemyslaw Marczak 3159d29a682SPrzemyslaw Marczak lcd_clear(); 3169d29a682SPrzemyslaw Marczak } 3179d29a682SPrzemyslaw Marczak 3189d29a682SPrzemyslaw Marczak static void display_mode_info(void) 3199d29a682SPrzemyslaw Marczak { 3209d29a682SPrzemyslaw Marczak lcd_position_cursor(4, 4); 3219d29a682SPrzemyslaw Marczak lcd_printf("%s\n", U_BOOT_VERSION); 3229d29a682SPrzemyslaw Marczak lcd_puts("\nDownload Mode Menu\n"); 3239d29a682SPrzemyslaw Marczak #ifdef CONFIG_SYS_BOARD 3249d29a682SPrzemyslaw Marczak lcd_printf("Board name: %s\n", CONFIG_SYS_BOARD); 3259d29a682SPrzemyslaw Marczak #endif 3269d29a682SPrzemyslaw Marczak lcd_printf("Press POWER KEY to display MENU options."); 3279d29a682SPrzemyslaw Marczak } 3289d29a682SPrzemyslaw Marczak 3299d29a682SPrzemyslaw Marczak static int boot_menu(void) 3309d29a682SPrzemyslaw Marczak { 3319d29a682SPrzemyslaw Marczak int key = 0; 3329d29a682SPrzemyslaw Marczak int timeout = 10; 3339d29a682SPrzemyslaw Marczak 3349d29a682SPrzemyslaw Marczak display_mode_info(); 3359d29a682SPrzemyslaw Marczak 3369d29a682SPrzemyslaw Marczak while (timeout--) { 3379d29a682SPrzemyslaw Marczak lcd_printf("\rNormal boot will start in: %d seconds.", timeout); 3389d29a682SPrzemyslaw Marczak mdelay(1000); 3399d29a682SPrzemyslaw Marczak 3409d29a682SPrzemyslaw Marczak key = key_pressed(KEY_POWER); 3419d29a682SPrzemyslaw Marczak if (key) 3429d29a682SPrzemyslaw Marczak break; 3439d29a682SPrzemyslaw Marczak } 3449d29a682SPrzemyslaw Marczak 3459d29a682SPrzemyslaw Marczak lcd_clear(); 3469d29a682SPrzemyslaw Marczak 3479d29a682SPrzemyslaw Marczak /* If PWR pressed - show download menu */ 3489d29a682SPrzemyslaw Marczak if (key) { 3499d29a682SPrzemyslaw Marczak printf("Power pressed - go to download menu\n"); 3509d29a682SPrzemyslaw Marczak download_menu(); 3519d29a682SPrzemyslaw Marczak printf("Download mode exit.\n"); 3529d29a682SPrzemyslaw Marczak } 3539d29a682SPrzemyslaw Marczak 3549d29a682SPrzemyslaw Marczak return 0; 3559d29a682SPrzemyslaw Marczak } 3569d29a682SPrzemyslaw Marczak 3579d29a682SPrzemyslaw Marczak void check_boot_mode(void) 3589d29a682SPrzemyslaw Marczak { 3599d29a682SPrzemyslaw Marczak int pwr_key; 3609d29a682SPrzemyslaw Marczak 3619d29a682SPrzemyslaw Marczak pwr_key = power_key_pressed(KEY_PWR_STATUS_REG); 3629d29a682SPrzemyslaw Marczak if (!pwr_key) 3639d29a682SPrzemyslaw Marczak return; 3649d29a682SPrzemyslaw Marczak 3659d29a682SPrzemyslaw Marczak /* Clear PWR button Rising edge interrupt status flag */ 3669d29a682SPrzemyslaw Marczak power_key_pressed(KEY_PWR_INTERRUPT_REG); 3679d29a682SPrzemyslaw Marczak 3689d29a682SPrzemyslaw Marczak if (key_pressed(KEY_VOLUMEUP)) 3699d29a682SPrzemyslaw Marczak boot_menu(); 3709d29a682SPrzemyslaw Marczak else if (key_pressed(KEY_VOLUMEDOWN)) 3719d29a682SPrzemyslaw Marczak mode_leave_menu(BOOT_MODE_THOR); 3729d29a682SPrzemyslaw Marczak } 3739d29a682SPrzemyslaw Marczak 3749d29a682SPrzemyslaw Marczak void keys_init(void) 3759d29a682SPrzemyslaw Marczak { 3769d29a682SPrzemyslaw Marczak /* Set direction to input */ 3779d29a682SPrzemyslaw Marczak gpio_direction_input(KEY_VOL_UP_GPIO); 3789d29a682SPrzemyslaw Marczak gpio_direction_input(KEY_VOL_DOWN_GPIO); 3799d29a682SPrzemyslaw Marczak } 3809d29a682SPrzemyslaw Marczak #endif /* CONFIG_LCD_MENU */ 381679549d1SPrzemyslaw Marczak 382679549d1SPrzemyslaw Marczak #ifdef CONFIG_CMD_BMP 383679549d1SPrzemyslaw Marczak void draw_logo(void) 384679549d1SPrzemyslaw Marczak { 385679549d1SPrzemyslaw Marczak int x, y; 386679549d1SPrzemyslaw Marczak ulong addr; 387679549d1SPrzemyslaw Marczak 388679549d1SPrzemyslaw Marczak addr = panel_info.logo_addr; 389679549d1SPrzemyslaw Marczak if (!addr) { 390679549d1SPrzemyslaw Marczak error("There is no logo data."); 391679549d1SPrzemyslaw Marczak return; 392679549d1SPrzemyslaw Marczak } 393679549d1SPrzemyslaw Marczak 394679549d1SPrzemyslaw Marczak if (panel_info.vl_width >= panel_info.logo_width) { 395679549d1SPrzemyslaw Marczak x = ((panel_info.vl_width - panel_info.logo_width) >> 1); 396903afe18SPrzemyslaw Marczak x += panel_info.logo_x_offset; /* For X center align */ 397679549d1SPrzemyslaw Marczak } else { 398679549d1SPrzemyslaw Marczak x = 0; 399679549d1SPrzemyslaw Marczak printf("Warning: image width is bigger than display width\n"); 400679549d1SPrzemyslaw Marczak } 401679549d1SPrzemyslaw Marczak 402679549d1SPrzemyslaw Marczak if (panel_info.vl_height >= panel_info.logo_height) { 403679549d1SPrzemyslaw Marczak y = ((panel_info.vl_height - panel_info.logo_height) >> 1); 404903afe18SPrzemyslaw Marczak y += panel_info.logo_y_offset; /* For Y center align */ 405679549d1SPrzemyslaw Marczak } else { 406679549d1SPrzemyslaw Marczak y = 0; 407679549d1SPrzemyslaw Marczak printf("Warning: image height is bigger than display height\n"); 408679549d1SPrzemyslaw Marczak } 409679549d1SPrzemyslaw Marczak 410679549d1SPrzemyslaw Marczak bmp_display(addr, x, y); 411679549d1SPrzemyslaw Marczak } 412679549d1SPrzemyslaw Marczak #endif /* CONFIG_CMD_BMP */ 413