xref: /rk3399_rockchip-uboot/board/samsung/common/misc.c (revision eee2fab0bddb2c460a96a943d7ed6b0f3718f0fd)
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>
149d29a682SPrzemyslaw Marczak #include <asm/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 
24*eee2fab0SPiotr Wilczek #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
25*eee2fab0SPiotr Wilczek void set_board_info(void)
26*eee2fab0SPiotr Wilczek {
27*eee2fab0SPiotr Wilczek 	char info[64];
28*eee2fab0SPiotr Wilczek 
29*eee2fab0SPiotr Wilczek 	snprintf(info, ARRAY_SIZE(info), "%d.%d", s5p_cpu_rev & 0x0f,
30*eee2fab0SPiotr Wilczek 		 (s5p_cpu_rev & 0xf0) >> 0x04);
31*eee2fab0SPiotr Wilczek 	setenv("soc_rev", info);
32*eee2fab0SPiotr Wilczek 
33*eee2fab0SPiotr Wilczek 	snprintf(info, ARRAY_SIZE(info), "%x", s5p_cpu_id);
34*eee2fab0SPiotr Wilczek 	setenv("soc_id", info);
35*eee2fab0SPiotr Wilczek 
36*eee2fab0SPiotr Wilczek #ifdef CONFIG_REVISION_TAG
37*eee2fab0SPiotr Wilczek 	snprintf(info, ARRAY_SIZE(info), "%x", get_board_rev());
38*eee2fab0SPiotr Wilczek 	setenv("board_rev", info);
39*eee2fab0SPiotr Wilczek #endif
40*eee2fab0SPiotr Wilczek #ifdef CONFIG_OF_LIBFDT
41*eee2fab0SPiotr Wilczek 	snprintf(info, ARRAY_SIZE(info),  "%s%x-%s.dtb",
42*eee2fab0SPiotr Wilczek 		 CONFIG_SYS_SOC, s5p_cpu_id, CONFIG_SYS_BOARD);
43*eee2fab0SPiotr Wilczek 	setenv("fdtfile", info);
44*eee2fab0SPiotr Wilczek #endif
45*eee2fab0SPiotr Wilczek }
46*eee2fab0SPiotr Wilczek #endif /* CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG */
47*eee2fab0SPiotr 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 *
1199d29a682SPrzemyslaw Marczak mode_name[BOOT_MODE_EXIT + 1] = {
1209d29a682SPrzemyslaw Marczak 	"DEVICE",
1219d29a682SPrzemyslaw Marczak 	"THOR",
1229d29a682SPrzemyslaw Marczak 	"UMS",
1239d29a682SPrzemyslaw Marczak 	"DFU",
1249d29a682SPrzemyslaw 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 #define MODE_CMD_ARGC	4
1379d29a682SPrzemyslaw Marczak 
1389d29a682SPrzemyslaw Marczak static char *
1399d29a682SPrzemyslaw Marczak mode_cmd[BOOT_MODE_EXIT + 1][MODE_CMD_ARGC] = {
1409d29a682SPrzemyslaw Marczak 	{"", "", "", ""},
1419d29a682SPrzemyslaw Marczak 	{"thor", "0", "mmc", "0"},
1429d29a682SPrzemyslaw Marczak 	{"ums", "0", "mmc", "0"},
1439d29a682SPrzemyslaw Marczak 	{"dfu", "0", "mmc", "0"},
1449d29a682SPrzemyslaw Marczak 	{"", "", "", ""},
1459d29a682SPrzemyslaw Marczak };
1469d29a682SPrzemyslaw Marczak 
1479d29a682SPrzemyslaw Marczak static void display_board_info(void)
1489d29a682SPrzemyslaw Marczak {
1499d29a682SPrzemyslaw Marczak #ifdef CONFIG_GENERIC_MMC
1509d29a682SPrzemyslaw Marczak 	struct mmc *mmc = find_mmc_device(0);
1519d29a682SPrzemyslaw Marczak #endif
1529d29a682SPrzemyslaw Marczak 	vidinfo_t *vid = &panel_info;
1539d29a682SPrzemyslaw Marczak 
1549d29a682SPrzemyslaw Marczak 	lcd_position_cursor(4, 4);
1559d29a682SPrzemyslaw Marczak 
1569d29a682SPrzemyslaw Marczak 	lcd_printf("%s\n\t", U_BOOT_VERSION);
1579d29a682SPrzemyslaw Marczak 	lcd_puts("\n\t\tBoard Info:\n");
1589d29a682SPrzemyslaw Marczak #ifdef CONFIG_SYS_BOARD
1599d29a682SPrzemyslaw Marczak 	lcd_printf("\tBoard name: %s\n", CONFIG_SYS_BOARD);
1609d29a682SPrzemyslaw Marczak #endif
1619d29a682SPrzemyslaw Marczak #ifdef CONFIG_REVISION_TAG
1629d29a682SPrzemyslaw Marczak 	lcd_printf("\tBoard rev: %u\n", get_board_rev());
1639d29a682SPrzemyslaw Marczak #endif
1649d29a682SPrzemyslaw Marczak 	lcd_printf("\tDRAM banks: %u\n", CONFIG_NR_DRAM_BANKS);
1659d29a682SPrzemyslaw Marczak 	lcd_printf("\tDRAM size: %u MB\n", gd->ram_size / SZ_1M);
1669d29a682SPrzemyslaw Marczak 
1679d29a682SPrzemyslaw Marczak #ifdef CONFIG_GENERIC_MMC
1689d29a682SPrzemyslaw Marczak 	if (mmc) {
1699d29a682SPrzemyslaw Marczak 		if (!mmc->capacity)
1709d29a682SPrzemyslaw Marczak 			mmc_init(mmc);
1719d29a682SPrzemyslaw Marczak 
1729d29a682SPrzemyslaw Marczak 		lcd_printf("\teMMC size: %llu MB\n", mmc->capacity / SZ_1M);
1739d29a682SPrzemyslaw Marczak 	}
1749d29a682SPrzemyslaw Marczak #endif
1759d29a682SPrzemyslaw Marczak 	if (vid)
1769d29a682SPrzemyslaw Marczak 		lcd_printf("\tDisplay resolution: %u x % u\n",
1779d29a682SPrzemyslaw Marczak 			   vid->vl_col, vid->vl_row);
1789d29a682SPrzemyslaw Marczak 
1799d29a682SPrzemyslaw Marczak 	lcd_printf("\tDisplay BPP: %u\n", 1 << vid->vl_bpix);
1809d29a682SPrzemyslaw Marczak }
1819d29a682SPrzemyslaw Marczak 
1829d29a682SPrzemyslaw Marczak static int mode_leave_menu(int mode)
1839d29a682SPrzemyslaw Marczak {
1849d29a682SPrzemyslaw Marczak 	char *exit_option;
1859d29a682SPrzemyslaw Marczak 	char *exit_boot = "boot";
1869d29a682SPrzemyslaw Marczak 	char *exit_back = "back";
1879d29a682SPrzemyslaw Marczak 	cmd_tbl_t *cmd;
1889d29a682SPrzemyslaw Marczak 	int cmd_result;
1899d29a682SPrzemyslaw Marczak 	int cmd_repeatable;
1909d29a682SPrzemyslaw Marczak 	int leave;
1919d29a682SPrzemyslaw Marczak 
1929d29a682SPrzemyslaw Marczak 	lcd_clear();
1939d29a682SPrzemyslaw Marczak 
1949d29a682SPrzemyslaw Marczak 	switch (mode) {
1959d29a682SPrzemyslaw Marczak 	case BOOT_MODE_EXIT:
1969d29a682SPrzemyslaw Marczak 		return 1;
1979d29a682SPrzemyslaw Marczak 	case BOOT_MODE_INFO:
1989d29a682SPrzemyslaw Marczak 		display_board_info();
1999d29a682SPrzemyslaw Marczak 		exit_option = exit_back;
2009d29a682SPrzemyslaw Marczak 		leave = 0;
2019d29a682SPrzemyslaw Marczak 		break;
2029d29a682SPrzemyslaw Marczak 	default:
2039d29a682SPrzemyslaw Marczak 		cmd = find_cmd(mode_cmd[mode][0]);
2049d29a682SPrzemyslaw Marczak 		if (cmd) {
2059d29a682SPrzemyslaw Marczak 			printf("Enter: %s %s\n", mode_name[mode],
2069d29a682SPrzemyslaw Marczak 						 mode_info[mode]);
2079d29a682SPrzemyslaw Marczak 			lcd_printf("\n\n\t%s %s\n", mode_name[mode],
2089d29a682SPrzemyslaw Marczak 						    mode_info[mode]);
2099d29a682SPrzemyslaw Marczak 			lcd_puts("\n\tDo not turn off device before finish!\n");
2109d29a682SPrzemyslaw Marczak 
2119d29a682SPrzemyslaw Marczak 			cmd_result = cmd_process(0, MODE_CMD_ARGC,
2129d29a682SPrzemyslaw Marczak 						 *(mode_cmd + mode),
2139d29a682SPrzemyslaw Marczak 						 &cmd_repeatable, NULL);
2149d29a682SPrzemyslaw Marczak 
2159d29a682SPrzemyslaw Marczak 			if (cmd_result == CMD_RET_SUCCESS) {
2169d29a682SPrzemyslaw Marczak 				printf("Command finished\n");
2179d29a682SPrzemyslaw Marczak 				lcd_clear();
2189d29a682SPrzemyslaw Marczak 				lcd_printf("\n\n\t%s finished\n",
2199d29a682SPrzemyslaw Marczak 					   mode_name[mode]);
2209d29a682SPrzemyslaw Marczak 
2219d29a682SPrzemyslaw Marczak 				exit_option = exit_boot;
2229d29a682SPrzemyslaw Marczak 				leave = 1;
2239d29a682SPrzemyslaw Marczak 			} else {
2249d29a682SPrzemyslaw Marczak 				printf("Command error\n");
2259d29a682SPrzemyslaw Marczak 				lcd_clear();
2269d29a682SPrzemyslaw Marczak 				lcd_printf("\n\n\t%s command error\n",
2279d29a682SPrzemyslaw Marczak 					   mode_name[mode]);
2289d29a682SPrzemyslaw Marczak 
2299d29a682SPrzemyslaw Marczak 				exit_option = exit_back;
2309d29a682SPrzemyslaw Marczak 				leave = 0;
2319d29a682SPrzemyslaw Marczak 			}
2329d29a682SPrzemyslaw Marczak 		} else {
2339d29a682SPrzemyslaw Marczak 			lcd_puts("\n\n\tThis mode is not supported.\n");
2349d29a682SPrzemyslaw Marczak 			exit_option = exit_back;
2359d29a682SPrzemyslaw Marczak 			leave = 0;
2369d29a682SPrzemyslaw Marczak 		}
2379d29a682SPrzemyslaw Marczak 	}
2389d29a682SPrzemyslaw Marczak 
2399d29a682SPrzemyslaw Marczak 	lcd_printf("\n\n\tPress POWER KEY to %s\n", exit_option);
2409d29a682SPrzemyslaw Marczak 
2419d29a682SPrzemyslaw Marczak 	/* Clear PWR button Rising edge interrupt status flag */
2429d29a682SPrzemyslaw Marczak 	power_key_pressed(KEY_PWR_INTERRUPT_REG);
2439d29a682SPrzemyslaw Marczak 
2449d29a682SPrzemyslaw Marczak 	/* Wait for PWR key */
2459d29a682SPrzemyslaw Marczak 	while (!key_pressed(KEY_POWER))
2469d29a682SPrzemyslaw Marczak 		mdelay(1);
2479d29a682SPrzemyslaw Marczak 
2489d29a682SPrzemyslaw Marczak 	lcd_clear();
2499d29a682SPrzemyslaw Marczak 	return leave;
2509d29a682SPrzemyslaw Marczak }
2519d29a682SPrzemyslaw Marczak 
2529d29a682SPrzemyslaw Marczak static void display_download_menu(int mode)
2539d29a682SPrzemyslaw Marczak {
2549d29a682SPrzemyslaw Marczak 	char *selection[BOOT_MODE_EXIT + 1];
2559d29a682SPrzemyslaw Marczak 	int i;
2569d29a682SPrzemyslaw Marczak 
2579d29a682SPrzemyslaw Marczak 	for (i = 0; i <= BOOT_MODE_EXIT; i++)
2589d29a682SPrzemyslaw Marczak 		selection[i] = "[  ]";
2599d29a682SPrzemyslaw Marczak 
2609d29a682SPrzemyslaw Marczak 	selection[mode] = "[=>]";
2619d29a682SPrzemyslaw Marczak 
2629d29a682SPrzemyslaw Marczak 	lcd_clear();
2639d29a682SPrzemyslaw Marczak 	lcd_printf("\n\t\tDownload Mode Menu\n");
2649d29a682SPrzemyslaw Marczak 
2659d29a682SPrzemyslaw Marczak 	for (i = 0; i <= BOOT_MODE_EXIT; i++)
2669d29a682SPrzemyslaw Marczak 		lcd_printf("\t%s  %s - %s\n\n", selection[i],
2679d29a682SPrzemyslaw Marczak 						mode_name[i],
2689d29a682SPrzemyslaw Marczak 						mode_info[i]);
2699d29a682SPrzemyslaw Marczak }
2709d29a682SPrzemyslaw Marczak 
2719d29a682SPrzemyslaw Marczak static void download_menu(void)
2729d29a682SPrzemyslaw Marczak {
2739d29a682SPrzemyslaw Marczak 	int mode = 0;
2749d29a682SPrzemyslaw Marczak 	int last_mode = 0;
2759d29a682SPrzemyslaw Marczak 	int run;
2769d29a682SPrzemyslaw Marczak 	int key;
2779d29a682SPrzemyslaw Marczak 
2789d29a682SPrzemyslaw Marczak 	display_download_menu(mode);
2799d29a682SPrzemyslaw Marczak 
2809d29a682SPrzemyslaw Marczak 	while (1) {
2819d29a682SPrzemyslaw Marczak 		run = 0;
2829d29a682SPrzemyslaw Marczak 
2839d29a682SPrzemyslaw Marczak 		if (mode != last_mode)
2849d29a682SPrzemyslaw Marczak 			display_download_menu(mode);
2859d29a682SPrzemyslaw Marczak 
2869d29a682SPrzemyslaw Marczak 		last_mode = mode;
2879d29a682SPrzemyslaw Marczak 		mdelay(100);
2889d29a682SPrzemyslaw Marczak 
2899d29a682SPrzemyslaw Marczak 		key = check_keys();
2909d29a682SPrzemyslaw Marczak 		switch (key) {
2919d29a682SPrzemyslaw Marczak 		case KEY_POWER:
2929d29a682SPrzemyslaw Marczak 			run = 1;
2939d29a682SPrzemyslaw Marczak 			break;
2949d29a682SPrzemyslaw Marczak 		case KEY_VOLUMEUP:
2959d29a682SPrzemyslaw Marczak 			if (mode > 0)
2969d29a682SPrzemyslaw Marczak 				mode--;
2979d29a682SPrzemyslaw Marczak 			break;
2989d29a682SPrzemyslaw Marczak 		case KEY_VOLUMEDOWN:
2999d29a682SPrzemyslaw Marczak 			if (mode < BOOT_MODE_EXIT)
3009d29a682SPrzemyslaw Marczak 				mode++;
3019d29a682SPrzemyslaw Marczak 			break;
3029d29a682SPrzemyslaw Marczak 		default:
3039d29a682SPrzemyslaw Marczak 			break;
3049d29a682SPrzemyslaw Marczak 		}
3059d29a682SPrzemyslaw Marczak 
3069d29a682SPrzemyslaw Marczak 		if (run) {
3079d29a682SPrzemyslaw Marczak 			if (mode_leave_menu(mode))
3089d29a682SPrzemyslaw Marczak 				break;
3099d29a682SPrzemyslaw Marczak 
3109d29a682SPrzemyslaw Marczak 			display_download_menu(mode);
3119d29a682SPrzemyslaw Marczak 		}
3129d29a682SPrzemyslaw Marczak 	}
3139d29a682SPrzemyslaw Marczak 
3149d29a682SPrzemyslaw Marczak 	lcd_clear();
3159d29a682SPrzemyslaw Marczak }
3169d29a682SPrzemyslaw Marczak 
3179d29a682SPrzemyslaw Marczak static void display_mode_info(void)
3189d29a682SPrzemyslaw Marczak {
3199d29a682SPrzemyslaw Marczak 	lcd_position_cursor(4, 4);
3209d29a682SPrzemyslaw Marczak 	lcd_printf("%s\n", U_BOOT_VERSION);
3219d29a682SPrzemyslaw Marczak 	lcd_puts("\nDownload Mode Menu\n");
3229d29a682SPrzemyslaw Marczak #ifdef CONFIG_SYS_BOARD
3239d29a682SPrzemyslaw Marczak 	lcd_printf("Board name: %s\n", CONFIG_SYS_BOARD);
3249d29a682SPrzemyslaw Marczak #endif
3259d29a682SPrzemyslaw Marczak 	lcd_printf("Press POWER KEY to display MENU options.");
3269d29a682SPrzemyslaw Marczak }
3279d29a682SPrzemyslaw Marczak 
3289d29a682SPrzemyslaw Marczak static int boot_menu(void)
3299d29a682SPrzemyslaw Marczak {
3309d29a682SPrzemyslaw Marczak 	int key = 0;
3319d29a682SPrzemyslaw Marczak 	int timeout = 10;
3329d29a682SPrzemyslaw Marczak 
3339d29a682SPrzemyslaw Marczak 	display_mode_info();
3349d29a682SPrzemyslaw Marczak 
3359d29a682SPrzemyslaw Marczak 	while (timeout--) {
3369d29a682SPrzemyslaw Marczak 		lcd_printf("\rNormal boot will start in: %d seconds.", timeout);
3379d29a682SPrzemyslaw Marczak 		mdelay(1000);
3389d29a682SPrzemyslaw Marczak 
3399d29a682SPrzemyslaw Marczak 		key = key_pressed(KEY_POWER);
3409d29a682SPrzemyslaw Marczak 		if (key)
3419d29a682SPrzemyslaw Marczak 			break;
3429d29a682SPrzemyslaw Marczak 	}
3439d29a682SPrzemyslaw Marczak 
3449d29a682SPrzemyslaw Marczak 	lcd_clear();
3459d29a682SPrzemyslaw Marczak 
3469d29a682SPrzemyslaw Marczak 	/* If PWR pressed - show download menu */
3479d29a682SPrzemyslaw Marczak 	if (key) {
3489d29a682SPrzemyslaw Marczak 		printf("Power pressed - go to download menu\n");
3499d29a682SPrzemyslaw Marczak 		download_menu();
3509d29a682SPrzemyslaw Marczak 		printf("Download mode exit.\n");
3519d29a682SPrzemyslaw Marczak 	}
3529d29a682SPrzemyslaw Marczak 
3539d29a682SPrzemyslaw Marczak 	return 0;
3549d29a682SPrzemyslaw Marczak }
3559d29a682SPrzemyslaw Marczak 
3569d29a682SPrzemyslaw Marczak void check_boot_mode(void)
3579d29a682SPrzemyslaw Marczak {
3589d29a682SPrzemyslaw Marczak 	int pwr_key;
3599d29a682SPrzemyslaw Marczak 
3609d29a682SPrzemyslaw Marczak 	pwr_key = power_key_pressed(KEY_PWR_STATUS_REG);
3619d29a682SPrzemyslaw Marczak 	if (!pwr_key)
3629d29a682SPrzemyslaw Marczak 		return;
3639d29a682SPrzemyslaw Marczak 
3649d29a682SPrzemyslaw Marczak 	/* Clear PWR button Rising edge interrupt status flag */
3659d29a682SPrzemyslaw Marczak 	power_key_pressed(KEY_PWR_INTERRUPT_REG);
3669d29a682SPrzemyslaw Marczak 
3679d29a682SPrzemyslaw Marczak 	if (key_pressed(KEY_VOLUMEUP))
3689d29a682SPrzemyslaw Marczak 		boot_menu();
3699d29a682SPrzemyslaw Marczak 	else if (key_pressed(KEY_VOLUMEDOWN))
3709d29a682SPrzemyslaw Marczak 		mode_leave_menu(BOOT_MODE_THOR);
3719d29a682SPrzemyslaw Marczak }
3729d29a682SPrzemyslaw Marczak 
3739d29a682SPrzemyslaw Marczak void keys_init(void)
3749d29a682SPrzemyslaw Marczak {
3759d29a682SPrzemyslaw Marczak 	/* Set direction to input */
3769d29a682SPrzemyslaw Marczak 	gpio_direction_input(KEY_VOL_UP_GPIO);
3779d29a682SPrzemyslaw Marczak 	gpio_direction_input(KEY_VOL_DOWN_GPIO);
3789d29a682SPrzemyslaw Marczak }
3799d29a682SPrzemyslaw Marczak #endif /* CONFIG_LCD_MENU */
380679549d1SPrzemyslaw Marczak 
381679549d1SPrzemyslaw Marczak #ifdef CONFIG_CMD_BMP
382679549d1SPrzemyslaw Marczak void draw_logo(void)
383679549d1SPrzemyslaw Marczak {
384679549d1SPrzemyslaw Marczak 	int x, y;
385679549d1SPrzemyslaw Marczak 	ulong addr;
386679549d1SPrzemyslaw Marczak 
387679549d1SPrzemyslaw Marczak 	addr = panel_info.logo_addr;
388679549d1SPrzemyslaw Marczak 	if (!addr) {
389679549d1SPrzemyslaw Marczak 		error("There is no logo data.");
390679549d1SPrzemyslaw Marczak 		return;
391679549d1SPrzemyslaw Marczak 	}
392679549d1SPrzemyslaw Marczak 
393679549d1SPrzemyslaw Marczak 	if (panel_info.vl_width >= panel_info.logo_width) {
394679549d1SPrzemyslaw Marczak 		x = ((panel_info.vl_width - panel_info.logo_width) >> 1);
395903afe18SPrzemyslaw Marczak 		x += panel_info.logo_x_offset; /* For X center align */
396679549d1SPrzemyslaw Marczak 	} else {
397679549d1SPrzemyslaw Marczak 		x = 0;
398679549d1SPrzemyslaw Marczak 		printf("Warning: image width is bigger than display width\n");
399679549d1SPrzemyslaw Marczak 	}
400679549d1SPrzemyslaw Marczak 
401679549d1SPrzemyslaw Marczak 	if (panel_info.vl_height >= panel_info.logo_height) {
402679549d1SPrzemyslaw Marczak 		y = ((panel_info.vl_height - panel_info.logo_height) >> 1);
403903afe18SPrzemyslaw Marczak 		y += panel_info.logo_y_offset; /* For Y center align */
404679549d1SPrzemyslaw Marczak 	} else {
405679549d1SPrzemyslaw Marczak 		y = 0;
406679549d1SPrzemyslaw Marczak 		printf("Warning: image height is bigger than display height\n");
407679549d1SPrzemyslaw Marczak 	}
408679549d1SPrzemyslaw Marczak 
409679549d1SPrzemyslaw Marczak 	bmp_display(addr, x, y);
410679549d1SPrzemyslaw Marczak }
411679549d1SPrzemyslaw Marczak #endif /* CONFIG_CMD_BMP */
412