]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/samsung/common/misc.c
Merge branch 'master' of git://git.denx.de/u-boot-imx
[karo-tx-uboot.git] / board / samsung / common / misc.c
index 2fd104d0fe747d2057dd2feda7e6c9dbc01e0b41..4538ac7f2a2fc2d2a91f840944d13ec542e35e11 100644 (file)
@@ -11,9 +11,9 @@
 #include <samsung/misc.h>
 #include <errno.h>
 #include <version.h>
+#include <malloc.h>
 #include <linux/sizes.h>
 #include <asm/arch/cpu.h>
-#include <asm/arch/gpio.h>
 #include <asm/gpio.h>
 #include <linux/input.h>
 #include <power/pmic.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#ifdef CONFIG_SET_DFU_ALT_INFO
+void set_dfu_alt_info(void)
+{
+       size_t buf_size = CONFIG_SET_DFU_ALT_BUF_LEN;
+       ALLOC_CACHE_ALIGN_BUFFER(char, buf, buf_size);
+       char *alt_info = "Settings not found!";
+       char *status = "error!\n";
+       char *alt_setting;
+       char *alt_sep;
+       int offset = 0;
+
+       puts("DFU alt info setting: ");
+
+       alt_setting = get_dfu_alt_boot();
+       if (alt_setting) {
+               setenv("dfu_alt_boot", alt_setting);
+               offset = snprintf(buf, buf_size, "%s", alt_setting);
+       }
+
+       alt_setting = get_dfu_alt_system();
+       if (alt_setting) {
+               if (offset)
+                       alt_sep = ";";
+               else
+                       alt_sep = "";
+
+               offset += snprintf(buf + offset, buf_size - offset,
+                                   "%s%s", alt_sep, alt_setting);
+       }
+
+       if (offset) {
+               alt_info = buf;
+               status = "done\n";
+       }
+
+       setenv("dfu_alt_info", alt_info);
+       puts(status);
+}
+#endif
+
 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
 void set_board_info(void)
 {
        char info[64];
 
-       snprintf(info, ARRAY_SIZE(info), "%d.%d", s5p_cpu_rev & 0x0f,
-                (s5p_cpu_rev & 0xf0) >> 0x04);
+       snprintf(info, ARRAY_SIZE(info), "%u.%u", (s5p_cpu_rev & 0xf0) >> 4,
+                s5p_cpu_rev & 0xf);
        setenv("soc_rev", info);
 
        snprintf(info, ARRAY_SIZE(info), "%x", s5p_cpu_id);
@@ -38,8 +78,16 @@ void set_board_info(void)
        setenv("board_rev", info);
 #endif
 #ifdef CONFIG_OF_LIBFDT
-       snprintf(info, ARRAY_SIZE(info),  "%s%x-%s.dtb",
-                CONFIG_SYS_SOC, s5p_cpu_id, CONFIG_SYS_BOARD);
+       const char *bdtype = "";
+       const char *bdname = CONFIG_SYS_BOARD;
+
+#ifdef CONFIG_BOARD_TYPES
+       bdtype = get_board_type();
+       sprintf(info, "%s%s", bdname, bdtype);
+       setenv("boardname", info);
+#endif
+       snprintf(info, ARRAY_SIZE(info),  "%s%x-%s%s.dtb",
+                CONFIG_SYS_SOC, s5p_cpu_id, bdname, bdtype);
        setenv("fdtfile", info);
 #endif
 }
@@ -122,6 +170,7 @@ mode_name[BOOT_MODE_EXIT + 1][2] = {
        {"UMS", "ums"},
        {"DFU", "dfu"},
        {"GPT", "gpt"},
+       {"ENV", "env"},
        {"EXIT", ""},
 };
 
@@ -132,6 +181,7 @@ mode_info[BOOT_MODE_EXIT + 1] = {
        "mass storage",
        "firmware update",
        "restore",
+       "default",
        "and run normal boot"
 };
 
@@ -142,6 +192,7 @@ mode_cmd[BOOT_MODE_EXIT + 1] = {
        "ums 0 mmc 0",
        "dfu 0 mmc 0",
        "gpt write mmc 0 $partitions",
+       "env default -a; saveenv",
        "",
 };
 
@@ -258,7 +309,7 @@ static void display_download_menu(int mode)
        selection[mode] = "[=>]";
 
        lcd_clear();
-       lcd_printf("\n\t\tDownload Mode Menu\n");
+       lcd_printf("\n\n\t\tDownload Mode Menu\n\n");
 
        for (i = 0; i <= BOOT_MODE_EXIT; i++)
                lcd_printf("\t%s  %s - %s\n\n", selection[i],
@@ -271,10 +322,38 @@ static void download_menu(void)
        int mode = 0;
        int last_mode = 0;
        int run;
-       int key;
+       int key = 0;
+       int timeout = 15; /* sec */
+       int i;
 
        display_download_menu(mode);
 
+       lcd_puts("\n");
+
+       /* Start count if no key is pressed */
+       while (check_keys())
+               continue;
+
+       while (timeout--) {
+               lcd_printf("\r\tNormal boot will start in: %2.d seconds.",
+                          timeout);
+
+               /* about 1000 ms in for loop */
+               for (i = 0; i < 10; i++) {
+                       mdelay(100);
+                       key = check_keys();
+                       if (key)
+                               break;
+               }
+               if (key)
+                       break;
+       }
+
+       if (!key) {
+               lcd_clear();
+               return;
+       }
+
        while (1) {
                run = 0;
 
@@ -282,7 +361,7 @@ static void download_menu(void)
                        display_download_menu(mode);
 
                last_mode = mode;
-               mdelay(100);
+               mdelay(200);
 
                key = check_keys();
                switch (key) {
@@ -312,45 +391,6 @@ static void download_menu(void)
        lcd_clear();
 }
 
-static void display_mode_info(void)
-{
-       lcd_position_cursor(4, 4);
-       lcd_printf("%s\n", U_BOOT_VERSION);
-       lcd_puts("\nDownload Mode Menu\n");
-#ifdef CONFIG_SYS_BOARD
-       lcd_printf("Board name: %s\n", CONFIG_SYS_BOARD);
-#endif
-       lcd_printf("Press POWER KEY to display MENU options.");
-}
-
-static int boot_menu(void)
-{
-       int key = 0;
-       int timeout = 10;
-
-       display_mode_info();
-
-       while (timeout--) {
-               lcd_printf("\rNormal boot will start in: %d seconds.", timeout);
-               mdelay(1000);
-
-               key = key_pressed(KEY_POWER);
-               if (key)
-                       break;
-       }
-
-       lcd_clear();
-
-       /* If PWR pressed - show download menu */
-       if (key) {
-               printf("Power pressed - go to download menu\n");
-               download_menu();
-               printf("Download mode exit.\n");
-       }
-
-       return 0;
-}
-
 void check_boot_mode(void)
 {
        int pwr_key;
@@ -363,7 +403,7 @@ void check_boot_mode(void)
        power_key_pressed(KEY_PWR_INTERRUPT_REG);
 
        if (key_pressed(KEY_VOLUMEUP))
-               boot_menu();
+               download_menu();
        else if (key_pressed(KEY_VOLUMEDOWN))
                mode_leave_menu(BOOT_MODE_THOR);
 }
@@ -371,6 +411,8 @@ void check_boot_mode(void)
 void keys_init(void)
 {
        /* Set direction to input */
+       gpio_request(KEY_VOL_UP_GPIO, "volume-up");
+       gpio_request(KEY_VOL_DOWN_GPIO, "volume-down");
        gpio_direction_input(KEY_VOL_UP_GPIO);
        gpio_direction_input(KEY_VOL_DOWN_GPIO);
 }