From mboxrd@z Thu Jan 1 00:00:00 1970 From: Przemyslaw Marczak Date: Fri, 10 Jan 2014 10:48:56 +0100 Subject: [U-Boot] [PATCH v4 09/12] samsung: misc: Add LCD download menu. In-Reply-To: <52CFC0BF.20000@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> <52CFC0BF.20000@samsung.com> Message-ID: <52CFC208.5010405@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 01/10/2014 10:43 AM, Minkyu Kang wrote: > 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. > Yes, these will apply too. >>>> + 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. > Thank you, -- Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com