xref: /rk3399_rockchip-uboot/board/samsung/common/misc.c (revision 0954dd61baebcd2de627803ed8e00cc70d9e8b0c)
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