xref: /rk3399_rockchip-uboot/board/samsung/common/misc.c (revision e6bfe79f31a042cfbd2dd9ee159cdd1209535727)
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 *
119*e6bfe79fSPrzemyslaw Marczak mode_name[BOOT_MODE_EXIT + 1][2] = {
120*e6bfe79fSPrzemyslaw Marczak 	{"DEVICE", ""},
121*e6bfe79fSPrzemyslaw Marczak 	{"THOR", "thor"},
122*e6bfe79fSPrzemyslaw Marczak 	{"UMS", "ums"},
123*e6bfe79fSPrzemyslaw Marczak 	{"DFU", "dfu"},
124*e6bfe79fSPrzemyslaw Marczak 	{"EXIT", ""},
1259d29a682SPrzemyslaw Marczak };
1269d29a682SPrzemyslaw Marczak 
1279d29a682SPrzemyslaw Marczak static char *
1289d29a682SPrzemyslaw Marczak mode_info[BOOT_MODE_EXIT + 1] = {
1299d29a682SPrzemyslaw Marczak 	"info",
1309d29a682SPrzemyslaw Marczak 	"downloader",
1319d29a682SPrzemyslaw Marczak 	"mass storage",
1329d29a682SPrzemyslaw Marczak 	"firmware update",
1339d29a682SPrzemyslaw Marczak 	"and run normal boot"
1349d29a682SPrzemyslaw Marczak };
1359d29a682SPrzemyslaw Marczak 
1369d29a682SPrzemyslaw Marczak static char *
137*e6bfe79fSPrzemyslaw Marczak mode_cmd[BOOT_MODE_EXIT + 1] = {
138*e6bfe79fSPrzemyslaw Marczak 	"",
139*e6bfe79fSPrzemyslaw Marczak 	"thor 0 mmc 0",
140*e6bfe79fSPrzemyslaw Marczak 	"ums 0 mmc 0",
141*e6bfe79fSPrzemyslaw Marczak 	"dfu 0 mmc 0",
142*e6bfe79fSPrzemyslaw Marczak 	"",
1439d29a682SPrzemyslaw Marczak };
1449d29a682SPrzemyslaw Marczak 
1459d29a682SPrzemyslaw Marczak static void display_board_info(void)
1469d29a682SPrzemyslaw Marczak {
1479d29a682SPrzemyslaw Marczak #ifdef CONFIG_GENERIC_MMC
1489d29a682SPrzemyslaw Marczak 	struct mmc *mmc = find_mmc_device(0);
1499d29a682SPrzemyslaw Marczak #endif
1509d29a682SPrzemyslaw Marczak 	vidinfo_t *vid = &panel_info;
1519d29a682SPrzemyslaw Marczak 
1529d29a682SPrzemyslaw Marczak 	lcd_position_cursor(4, 4);
1539d29a682SPrzemyslaw Marczak 
1549d29a682SPrzemyslaw Marczak 	lcd_printf("%s\n\t", U_BOOT_VERSION);
1559d29a682SPrzemyslaw Marczak 	lcd_puts("\n\t\tBoard Info:\n");
1569d29a682SPrzemyslaw Marczak #ifdef CONFIG_SYS_BOARD
1579d29a682SPrzemyslaw Marczak 	lcd_printf("\tBoard name: %s\n", CONFIG_SYS_BOARD);
1589d29a682SPrzemyslaw Marczak #endif
1599d29a682SPrzemyslaw Marczak #ifdef CONFIG_REVISION_TAG
1609d29a682SPrzemyslaw Marczak 	lcd_printf("\tBoard rev: %u\n", get_board_rev());
1619d29a682SPrzemyslaw Marczak #endif
1629d29a682SPrzemyslaw Marczak 	lcd_printf("\tDRAM banks: %u\n", CONFIG_NR_DRAM_BANKS);
1639d29a682SPrzemyslaw Marczak 	lcd_printf("\tDRAM size: %u MB\n", gd->ram_size / SZ_1M);
1649d29a682SPrzemyslaw Marczak 
1659d29a682SPrzemyslaw Marczak #ifdef CONFIG_GENERIC_MMC
1669d29a682SPrzemyslaw Marczak 	if (mmc) {
1679d29a682SPrzemyslaw Marczak 		if (!mmc->capacity)
1689d29a682SPrzemyslaw Marczak 			mmc_init(mmc);
1699d29a682SPrzemyslaw Marczak 
1709d29a682SPrzemyslaw Marczak 		lcd_printf("\teMMC size: %llu MB\n", mmc->capacity / SZ_1M);
1719d29a682SPrzemyslaw Marczak 	}
1729d29a682SPrzemyslaw Marczak #endif
1739d29a682SPrzemyslaw Marczak 	if (vid)
1749d29a682SPrzemyslaw Marczak 		lcd_printf("\tDisplay resolution: %u x % u\n",
1759d29a682SPrzemyslaw Marczak 			   vid->vl_col, vid->vl_row);
1769d29a682SPrzemyslaw Marczak 
1779d29a682SPrzemyslaw Marczak 	lcd_printf("\tDisplay BPP: %u\n", 1 << vid->vl_bpix);
1789d29a682SPrzemyslaw Marczak }
1799d29a682SPrzemyslaw Marczak 
1809d29a682SPrzemyslaw Marczak static int mode_leave_menu(int mode)
1819d29a682SPrzemyslaw Marczak {
1829d29a682SPrzemyslaw Marczak 	char *exit_option;
183*e6bfe79fSPrzemyslaw Marczak 	char *exit_reset = "reset";
1849d29a682SPrzemyslaw Marczak 	char *exit_back = "back";
1859d29a682SPrzemyslaw Marczak 	cmd_tbl_t *cmd;
1869d29a682SPrzemyslaw Marczak 	int cmd_result;
1879d29a682SPrzemyslaw Marczak 	int leave;
1889d29a682SPrzemyslaw Marczak 
1899d29a682SPrzemyslaw Marczak 	lcd_clear();
1909d29a682SPrzemyslaw Marczak 
1919d29a682SPrzemyslaw Marczak 	switch (mode) {
1929d29a682SPrzemyslaw Marczak 	case BOOT_MODE_EXIT:
1939d29a682SPrzemyslaw Marczak 		return 1;
1949d29a682SPrzemyslaw Marczak 	case BOOT_MODE_INFO:
1959d29a682SPrzemyslaw Marczak 		display_board_info();
1969d29a682SPrzemyslaw Marczak 		exit_option = exit_back;
1979d29a682SPrzemyslaw Marczak 		leave = 0;
1989d29a682SPrzemyslaw Marczak 		break;
1999d29a682SPrzemyslaw Marczak 	default:
200*e6bfe79fSPrzemyslaw Marczak 		cmd = find_cmd(mode_name[mode][1]);
2019d29a682SPrzemyslaw Marczak 		if (cmd) {
202*e6bfe79fSPrzemyslaw Marczak 			printf("Enter: %s %s\n", mode_name[mode][0],
2039d29a682SPrzemyslaw Marczak 						 mode_info[mode]);
204*e6bfe79fSPrzemyslaw Marczak 			lcd_printf("\n\n\t%s %s\n", mode_name[mode][0],
2059d29a682SPrzemyslaw Marczak 						    mode_info[mode]);
2069d29a682SPrzemyslaw Marczak 			lcd_puts("\n\tDo not turn off device before finish!\n");
2079d29a682SPrzemyslaw Marczak 
208*e6bfe79fSPrzemyslaw Marczak 			cmd_result = run_command(mode_cmd[mode], 0);
2099d29a682SPrzemyslaw Marczak 
2109d29a682SPrzemyslaw Marczak 			if (cmd_result == CMD_RET_SUCCESS) {
2119d29a682SPrzemyslaw Marczak 				printf("Command finished\n");
2129d29a682SPrzemyslaw Marczak 				lcd_clear();
2139d29a682SPrzemyslaw Marczak 				lcd_printf("\n\n\t%s finished\n",
214*e6bfe79fSPrzemyslaw Marczak 					   mode_name[mode][0]);
2159d29a682SPrzemyslaw Marczak 
216*e6bfe79fSPrzemyslaw Marczak 				exit_option = exit_reset;
2179d29a682SPrzemyslaw Marczak 				leave = 1;
2189d29a682SPrzemyslaw Marczak 			} else {
2199d29a682SPrzemyslaw Marczak 				printf("Command error\n");
2209d29a682SPrzemyslaw Marczak 				lcd_clear();
2219d29a682SPrzemyslaw Marczak 				lcd_printf("\n\n\t%s command error\n",
222*e6bfe79fSPrzemyslaw Marczak 					   mode_name[mode][0]);
2239d29a682SPrzemyslaw Marczak 
2249d29a682SPrzemyslaw Marczak 				exit_option = exit_back;
2259d29a682SPrzemyslaw Marczak 				leave = 0;
2269d29a682SPrzemyslaw Marczak 			}
2279d29a682SPrzemyslaw Marczak 		} else {
2289d29a682SPrzemyslaw Marczak 			lcd_puts("\n\n\tThis mode is not supported.\n");
2299d29a682SPrzemyslaw Marczak 			exit_option = exit_back;
2309d29a682SPrzemyslaw Marczak 			leave = 0;
2319d29a682SPrzemyslaw Marczak 		}
2329d29a682SPrzemyslaw Marczak 	}
2339d29a682SPrzemyslaw Marczak 
2349d29a682SPrzemyslaw Marczak 	lcd_printf("\n\n\tPress POWER KEY to %s\n", exit_option);
2359d29a682SPrzemyslaw Marczak 
2369d29a682SPrzemyslaw Marczak 	/* Clear PWR button Rising edge interrupt status flag */
2379d29a682SPrzemyslaw Marczak 	power_key_pressed(KEY_PWR_INTERRUPT_REG);
2389d29a682SPrzemyslaw Marczak 
2399d29a682SPrzemyslaw Marczak 	/* Wait for PWR key */
2409d29a682SPrzemyslaw Marczak 	while (!key_pressed(KEY_POWER))
2419d29a682SPrzemyslaw Marczak 		mdelay(1);
2429d29a682SPrzemyslaw Marczak 
2439d29a682SPrzemyslaw Marczak 	lcd_clear();
2449d29a682SPrzemyslaw Marczak 	return leave;
2459d29a682SPrzemyslaw Marczak }
2469d29a682SPrzemyslaw Marczak 
2479d29a682SPrzemyslaw Marczak static void display_download_menu(int mode)
2489d29a682SPrzemyslaw Marczak {
2499d29a682SPrzemyslaw Marczak 	char *selection[BOOT_MODE_EXIT + 1];
2509d29a682SPrzemyslaw Marczak 	int i;
2519d29a682SPrzemyslaw Marczak 
2529d29a682SPrzemyslaw Marczak 	for (i = 0; i <= BOOT_MODE_EXIT; i++)
2539d29a682SPrzemyslaw Marczak 		selection[i] = "[  ]";
2549d29a682SPrzemyslaw Marczak 
2559d29a682SPrzemyslaw Marczak 	selection[mode] = "[=>]";
2569d29a682SPrzemyslaw Marczak 
2579d29a682SPrzemyslaw Marczak 	lcd_clear();
2589d29a682SPrzemyslaw Marczak 	lcd_printf("\n\t\tDownload Mode Menu\n");
2599d29a682SPrzemyslaw Marczak 
2609d29a682SPrzemyslaw Marczak 	for (i = 0; i <= BOOT_MODE_EXIT; i++)
2619d29a682SPrzemyslaw Marczak 		lcd_printf("\t%s  %s - %s\n\n", selection[i],
262*e6bfe79fSPrzemyslaw Marczak 						mode_name[i][0],
2639d29a682SPrzemyslaw Marczak 						mode_info[i]);
2649d29a682SPrzemyslaw Marczak }
2659d29a682SPrzemyslaw Marczak 
2669d29a682SPrzemyslaw Marczak static void download_menu(void)
2679d29a682SPrzemyslaw Marczak {
2689d29a682SPrzemyslaw Marczak 	int mode = 0;
2699d29a682SPrzemyslaw Marczak 	int last_mode = 0;
2709d29a682SPrzemyslaw Marczak 	int run;
2719d29a682SPrzemyslaw Marczak 	int key;
2729d29a682SPrzemyslaw Marczak 
2739d29a682SPrzemyslaw Marczak 	display_download_menu(mode);
2749d29a682SPrzemyslaw Marczak 
2759d29a682SPrzemyslaw Marczak 	while (1) {
2769d29a682SPrzemyslaw Marczak 		run = 0;
2779d29a682SPrzemyslaw Marczak 
2789d29a682SPrzemyslaw Marczak 		if (mode != last_mode)
2799d29a682SPrzemyslaw Marczak 			display_download_menu(mode);
2809d29a682SPrzemyslaw Marczak 
2819d29a682SPrzemyslaw Marczak 		last_mode = mode;
2829d29a682SPrzemyslaw Marczak 		mdelay(100);
2839d29a682SPrzemyslaw Marczak 
2849d29a682SPrzemyslaw Marczak 		key = check_keys();
2859d29a682SPrzemyslaw Marczak 		switch (key) {
2869d29a682SPrzemyslaw Marczak 		case KEY_POWER:
2879d29a682SPrzemyslaw Marczak 			run = 1;
2889d29a682SPrzemyslaw Marczak 			break;
2899d29a682SPrzemyslaw Marczak 		case KEY_VOLUMEUP:
2909d29a682SPrzemyslaw Marczak 			if (mode > 0)
2919d29a682SPrzemyslaw Marczak 				mode--;
2929d29a682SPrzemyslaw Marczak 			break;
2939d29a682SPrzemyslaw Marczak 		case KEY_VOLUMEDOWN:
2949d29a682SPrzemyslaw Marczak 			if (mode < BOOT_MODE_EXIT)
2959d29a682SPrzemyslaw Marczak 				mode++;
2969d29a682SPrzemyslaw Marczak 			break;
2979d29a682SPrzemyslaw Marczak 		default:
2989d29a682SPrzemyslaw Marczak 			break;
2999d29a682SPrzemyslaw Marczak 		}
3009d29a682SPrzemyslaw Marczak 
3019d29a682SPrzemyslaw Marczak 		if (run) {
3029d29a682SPrzemyslaw Marczak 			if (mode_leave_menu(mode))
303*e6bfe79fSPrzemyslaw Marczak 				run_command("reset", 0);
3049d29a682SPrzemyslaw Marczak 
3059d29a682SPrzemyslaw Marczak 			display_download_menu(mode);
3069d29a682SPrzemyslaw Marczak 		}
3079d29a682SPrzemyslaw Marczak 	}
3089d29a682SPrzemyslaw Marczak 
3099d29a682SPrzemyslaw Marczak 	lcd_clear();
3109d29a682SPrzemyslaw Marczak }
3119d29a682SPrzemyslaw Marczak 
3129d29a682SPrzemyslaw Marczak static void display_mode_info(void)
3139d29a682SPrzemyslaw Marczak {
3149d29a682SPrzemyslaw Marczak 	lcd_position_cursor(4, 4);
3159d29a682SPrzemyslaw Marczak 	lcd_printf("%s\n", U_BOOT_VERSION);
3169d29a682SPrzemyslaw Marczak 	lcd_puts("\nDownload Mode Menu\n");
3179d29a682SPrzemyslaw Marczak #ifdef CONFIG_SYS_BOARD
3189d29a682SPrzemyslaw Marczak 	lcd_printf("Board name: %s\n", CONFIG_SYS_BOARD);
3199d29a682SPrzemyslaw Marczak #endif
3209d29a682SPrzemyslaw Marczak 	lcd_printf("Press POWER KEY to display MENU options.");
3219d29a682SPrzemyslaw Marczak }
3229d29a682SPrzemyslaw Marczak 
3239d29a682SPrzemyslaw Marczak static int boot_menu(void)
3249d29a682SPrzemyslaw Marczak {
3259d29a682SPrzemyslaw Marczak 	int key = 0;
3269d29a682SPrzemyslaw Marczak 	int timeout = 10;
3279d29a682SPrzemyslaw Marczak 
3289d29a682SPrzemyslaw Marczak 	display_mode_info();
3299d29a682SPrzemyslaw Marczak 
3309d29a682SPrzemyslaw Marczak 	while (timeout--) {
3319d29a682SPrzemyslaw Marczak 		lcd_printf("\rNormal boot will start in: %d seconds.", timeout);
3329d29a682SPrzemyslaw Marczak 		mdelay(1000);
3339d29a682SPrzemyslaw Marczak 
3349d29a682SPrzemyslaw Marczak 		key = key_pressed(KEY_POWER);
3359d29a682SPrzemyslaw Marczak 		if (key)
3369d29a682SPrzemyslaw Marczak 			break;
3379d29a682SPrzemyslaw Marczak 	}
3389d29a682SPrzemyslaw Marczak 
3399d29a682SPrzemyslaw Marczak 	lcd_clear();
3409d29a682SPrzemyslaw Marczak 
3419d29a682SPrzemyslaw Marczak 	/* If PWR pressed - show download menu */
3429d29a682SPrzemyslaw Marczak 	if (key) {
3439d29a682SPrzemyslaw Marczak 		printf("Power pressed - go to download menu\n");
3449d29a682SPrzemyslaw Marczak 		download_menu();
3459d29a682SPrzemyslaw Marczak 		printf("Download mode exit.\n");
3469d29a682SPrzemyslaw Marczak 	}
3479d29a682SPrzemyslaw Marczak 
3489d29a682SPrzemyslaw Marczak 	return 0;
3499d29a682SPrzemyslaw Marczak }
3509d29a682SPrzemyslaw Marczak 
3519d29a682SPrzemyslaw Marczak void check_boot_mode(void)
3529d29a682SPrzemyslaw Marczak {
3539d29a682SPrzemyslaw Marczak 	int pwr_key;
3549d29a682SPrzemyslaw Marczak 
3559d29a682SPrzemyslaw Marczak 	pwr_key = power_key_pressed(KEY_PWR_STATUS_REG);
3569d29a682SPrzemyslaw Marczak 	if (!pwr_key)
3579d29a682SPrzemyslaw Marczak 		return;
3589d29a682SPrzemyslaw Marczak 
3599d29a682SPrzemyslaw Marczak 	/* Clear PWR button Rising edge interrupt status flag */
3609d29a682SPrzemyslaw Marczak 	power_key_pressed(KEY_PWR_INTERRUPT_REG);
3619d29a682SPrzemyslaw Marczak 
3629d29a682SPrzemyslaw Marczak 	if (key_pressed(KEY_VOLUMEUP))
3639d29a682SPrzemyslaw Marczak 		boot_menu();
3649d29a682SPrzemyslaw Marczak 	else if (key_pressed(KEY_VOLUMEDOWN))
3659d29a682SPrzemyslaw Marczak 		mode_leave_menu(BOOT_MODE_THOR);
3669d29a682SPrzemyslaw Marczak }
3679d29a682SPrzemyslaw Marczak 
3689d29a682SPrzemyslaw Marczak void keys_init(void)
3699d29a682SPrzemyslaw Marczak {
3709d29a682SPrzemyslaw Marczak 	/* Set direction to input */
3719d29a682SPrzemyslaw Marczak 	gpio_direction_input(KEY_VOL_UP_GPIO);
3729d29a682SPrzemyslaw Marczak 	gpio_direction_input(KEY_VOL_DOWN_GPIO);
3739d29a682SPrzemyslaw Marczak }
3749d29a682SPrzemyslaw Marczak #endif /* CONFIG_LCD_MENU */
375679549d1SPrzemyslaw Marczak 
376679549d1SPrzemyslaw Marczak #ifdef CONFIG_CMD_BMP
377679549d1SPrzemyslaw Marczak void draw_logo(void)
378679549d1SPrzemyslaw Marczak {
379679549d1SPrzemyslaw Marczak 	int x, y;
380679549d1SPrzemyslaw Marczak 	ulong addr;
381679549d1SPrzemyslaw Marczak 
382679549d1SPrzemyslaw Marczak 	addr = panel_info.logo_addr;
383679549d1SPrzemyslaw Marczak 	if (!addr) {
384679549d1SPrzemyslaw Marczak 		error("There is no logo data.");
385679549d1SPrzemyslaw Marczak 		return;
386679549d1SPrzemyslaw Marczak 	}
387679549d1SPrzemyslaw Marczak 
388679549d1SPrzemyslaw Marczak 	if (panel_info.vl_width >= panel_info.logo_width) {
389679549d1SPrzemyslaw Marczak 		x = ((panel_info.vl_width - panel_info.logo_width) >> 1);
390903afe18SPrzemyslaw Marczak 		x += panel_info.logo_x_offset; /* For X center align */
391679549d1SPrzemyslaw Marczak 	} else {
392679549d1SPrzemyslaw Marczak 		x = 0;
393679549d1SPrzemyslaw Marczak 		printf("Warning: image width is bigger than display width\n");
394679549d1SPrzemyslaw Marczak 	}
395679549d1SPrzemyslaw Marczak 
396679549d1SPrzemyslaw Marczak 	if (panel_info.vl_height >= panel_info.logo_height) {
397679549d1SPrzemyslaw Marczak 		y = ((panel_info.vl_height - panel_info.logo_height) >> 1);
398903afe18SPrzemyslaw Marczak 		y += panel_info.logo_y_offset; /* For Y center align */
399679549d1SPrzemyslaw Marczak 	} else {
400679549d1SPrzemyslaw Marczak 		y = 0;
401679549d1SPrzemyslaw Marczak 		printf("Warning: image height is bigger than display height\n");
402679549d1SPrzemyslaw Marczak 	}
403679549d1SPrzemyslaw Marczak 
404679549d1SPrzemyslaw Marczak 	bmp_display(addr, x, y);
405679549d1SPrzemyslaw Marczak }
406679549d1SPrzemyslaw Marczak #endif /* CONFIG_CMD_BMP */
407