[U-Boot] [PATCH v4 09/12] samsung: misc: Add LCD download menu.

Przemyslaw Marczak p.marczak at samsung.com
Fri Jan 10 10:48:56 CET 2014


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 <p.marczak at samsung.com>
>>>>
>>>> ---
>>>> 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 <common.h>
>>>>    #include <lcd.h>
>>>>    #include <libtizen.h>
>>>> +#include <errno.h>
>>>> +#include <version.h>
>>>> +#include <asm/sizes.h>
>>>> +#include <asm/arch/cpu.h>
>>>> +#include <asm/arch/gpio.h>
>>>> +#include <asm/gpio.h>
>>>> +#include <linux/input.h>
>>>> +#include <lcd.h>
>>>> +#include <libtizen.h>
>>>
>>> lcd.h, libtizen.h are duplicated.
>>>
>>
>> Thanks, will be removed.
>>
>>>> +#include <power/pmic.h>
>>>> +#include <mmc.h>
>>>> +#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


More information about the U-Boot mailing list