[U-Boot] [PATCH v4 09/12] samsung: misc: Add LCD download menu.
Minkyu Kang
mk7.kang at samsung.com
Fri Jan 10 10:43:27 CET 2014
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.
>>> + 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.
More information about the U-Boot
mailing list