From mboxrd@z Thu Jan 1 00:00:00 1970 From: Minkyu Kang Date: Fri, 10 Jan 2014 18:43:27 +0900 Subject: [U-Boot] [PATCH v4 09/12] samsung: misc: Add LCD download menu. In-Reply-To: <52CFBF70.3060904@samsung.com> References: <1389266596-14581-1-git-send-email-p.marczak@samsung.com> <1389266596-14581-10-git-send-email-p.marczak@samsung.com> <52CF4EE0.2020906@samsung.com> <52CFBF70.3060904@samsung.com> Message-ID: <52CFC0BF.20000@samsung.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 10/01/14 18:37, Przemyslaw Marczak wrote: > Hello Minkyu, > > On 01/10/2014 02:37 AM, Minkyu Kang wrote: >> On 09/01/14 20:23, Przemyslaw Marczak wrote: >>> This simple LCD menu allows run one of download mode on device >>> without writing on console or for fast and easy upgrade. >>> This feature check user keys combination at boot: >>> - power key + volume up - download menu >>> - power key + volume down - thor mode (without menu) >>> >>> New configs: >>> - CONFIG_LCD_MENU >>> - CONFIG_LCD_MENU_BOARD >>> which depends on: CONFIG_MISC_INIT_R >>> >>> For proper effect this feature needs following definitions: >>> >>> Power key: >>> - KEY_PWR_PMIC_NAME - (string) pmic which supports power key check >>> >>> Register address: >>> - KEY_PWR_STATUS_REG >>> - KEY_PWR_INTERRUPT_REG >>> >>> Register power key mask: >>> - KEY_PWR_STATUS_MASK >>> - KEY_PWR_INTERRUPT_MASK >>> >>> Gpio numbers: >>> - KEY_PWR_INTERRUPT_MASK >>> - KEY_VOL_DOWN_GPIO >>> >>> Signed-off-by: Przemyslaw Marczak >>> >>> --- >>> Changes v2: >>> - remove keys.h - definitions should be in boards headers >>> - add misc.h >>> - code cleanup >>> - extend commit msg by more informations >>> >>> Changes v3: >>> - none >>> >>> Changes v4: >>> - code cleanup in board/samsung/common/misc.c >>> - add command result check >>> - clear PWR button interrupt flag after command finish to prevent immediately >>> mode exit in mode_leave_menu() function. >>> - introduce MODE_CMD_ARGC - max number of command arguments >>> - split array mode_cmd[] to mode_cmd[][] with separated arguments >>> - command support checking is now achieved without preprocessor ifdefs >>> >>> board/samsung/common/misc.c | 349 +++++++++++++++++++++++++++++++++++++++++++ >>> board/samsung/common/misc.h | 18 +++ >>> 2 files changed, 367 insertions(+) >>> create mode 100644 board/samsung/common/misc.h >>> >>> diff --git a/board/samsung/common/misc.c b/board/samsung/common/misc.c >>> index 3a91d62..f29fca4 100644 >>> --- a/board/samsung/common/misc.c >>> +++ b/board/samsung/common/misc.c >>> @@ -8,6 +8,350 @@ >>> #include >>> #include >>> #include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >> >> lcd.h, libtizen.h are duplicated. >> > > Thanks, will be removed. > >>> +#include >>> +#include >>> +#include "misc.h" >>> + >>> +DECLARE_GLOBAL_DATA_PTR; >>> + >>> +#ifdef CONFIG_LCD_MENU >>> +static int power_key_pressed(u32 reg) >>> +{ >>> + struct pmic *pmic; >>> + u32 status; >>> + u32 mask; >>> + >>> + pmic = pmic_get(KEY_PWR_PMIC_NAME); >>> + if (!pmic) { >>> + printf("%s: Not found\n", KEY_PWR_PMIC_NAME); >>> + return 0; >>> + } >>> + >>> + if (pmic_probe(pmic)) >>> + return 0; >>> + >>> + if (reg == KEY_PWR_STATUS_REG) >>> + mask = KEY_PWR_STATUS_MASK; >>> + else >>> + mask = KEY_PWR_INTERRUPT_MASK; >>> + >>> + if (pmic_reg_read(pmic, reg, &status)) >>> + return 0; >>> + >>> + return !!(status & mask); >>> +} >>> + >>> +static int key_pressed(int key) >>> +{ >>> + int value; >>> + >>> + switch (key) { >>> + case KEY_POWER: >>> + value = power_key_pressed(KEY_PWR_INTERRUPT_REG); >>> + break; >>> + case KEY_VOLUMEUP: >>> + value = !gpio_get_value(KEY_VOL_UP_GPIO); >>> + break; >>> + case KEY_VOLUMEDOWN: >>> + value = !gpio_get_value(KEY_VOL_DOWN_GPIO); >>> + break; >>> + default: >>> + value = 0; >>> + break; >>> + } >>> + >>> + return value; >>> +} >>> + >>> +static int check_keys(void) >>> +{ >>> + int keys = 0; >>> + >>> + if (key_pressed(KEY_POWER)) >>> + keys += KEY_POWER; >>> + if (key_pressed(KEY_VOLUMEUP)) >>> + keys += KEY_VOLUMEUP; >>> + if (key_pressed(KEY_VOLUMEDOWN)) >>> + keys += KEY_VOLUMEDOWN; >>> + >>> + return keys; >>> +} >>> + >>> +/* >>> + * 0 BOOT_MODE_INFO >>> + * 1 BOOT_MODE_THOR >>> + * 2 BOOT_MODE_UMS >>> + * 3 BOOT_MODE_DFU >>> + * 4 BOOT_MODE_EXIT >>> + */ >>> +static char * >>> +mode_name[BOOT_MODE_EXIT + 1] = { >>> + "DEVICE", >>> + "THOR", >>> + "UMS", >>> + "DFU", >>> + "EXIT" >>> +}; >>> + >>> +static char * >>> +mode_info[BOOT_MODE_EXIT + 1] = { >>> + "info", >>> + "downloader", >>> + "mass storage", >>> + "firmware update", >>> + "and run normal boot" >>> +}; >>> + >>> +#define MODE_CMD_ARGC 4 >>> + >>> +static char * >>> +mode_cmd[BOOT_MODE_EXIT + 1][MODE_CMD_ARGC] = { >>> + {"", "", "", ""}, >>> + {"thor", "0", "mmc", "0"}, >>> + {"ums", "0", "mmc", "0"}, >>> + {"dfu", "0", "mmc", "0"}, >>> + {"", "", "", ""}, >>> +}; >>> + >>> +static void display_board_info(void) >>> +{ >> >> #ifdef CONFIG_GENERIC_MMC Did you check this comment also? >>> + struct mmc *mmc = find_mmc_device(0); >> #endif >> >>> + vidinfo_t *vid = &panel_info; >>> + >>> + lcd_position_cursor(4, 4); >>> + >>> + lcd_printf("%s\n\t", U_BOOT_VERSION); >>> + lcd_puts("\n\t\tBoard Info:\n"); >>> +#ifdef CONFIG_SYS_BOARD >>> + lcd_printf("\tBoard name: %s\n", CONFIG_SYS_BOARD); >>> +#endif >>> +#ifdef CONFIG_REVISION_TAG >>> + lcd_printf("\tBoard rev: %u\n", get_board_rev()); >>> +#endif >>> + lcd_printf("\tDRAM banks: %u\n", CONFIG_NR_DRAM_BANKS); >>> + lcd_printf("\tDRAM size: %u MB\n", gd->ram_size / SZ_1M); >>> + >> >> #ifdef CONFIG_GENERIC_MMC ditto. >>> + if (mmc) { >>> + if (!mmc->capacity) >>> + mmc_init(mmc); >>> + >>> + lcd_printf("\teMMC size: %llu MB\n", mmc->capacity / SZ_1M); >>> + } >> #endif >> >>> + >>> + if (vid) >>> + lcd_printf("\tDisplay resolution: %u x % u\n", >>> + vid->vl_col, vid->vl_row); >>> + >>> + lcd_printf("\tDisplay BPP: %u\n", 1 << vid->vl_bpix); >>> +} >>> + Thanks, Minkyu Kang.