]> git.sur5r.net Git - u-boot/blobdiff - board/a4m072/a4m072.c
imx: ventana: disable 4k tftp/nfs packets
[u-boot] / board / a4m072 / a4m072.c
index 3756975ed7649872fade6130c9b3e869a286ee56..c5d161bca3bcc6df2fb228d380e0e2482c2e5d90 100644 (file)
@@ -8,23 +8,7 @@
  * (C) Copyright 2010
  * Sergei Poselenov, Emcraft Systems, sposelenov@emcraft.com.
  *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
@@ -34,6 +18,8 @@
 #include <asm/io.h>
 #include <libfdt.h>
 #include <netdev.h>
+#include <led-display.h>
+#include <linux/err.h>
 
 #include "mt46v32m16.h"
 
@@ -185,10 +171,11 @@ void pci_init_board(void)
 #endif
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void
-ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
        ft_cpu_setup(blob, bd);
+
+       return 0;
 }
 #endif
 
@@ -261,3 +248,228 @@ int eeprom_write_enable (unsigned dev_addr, int state)
        return state;
 }
 #endif
+
+#ifdef CONFIG_CMD_DISPLAY
+#define DISPLAY_BUF_SIZE       2
+static u8 display_buf[DISPLAY_BUF_SIZE];
+static u8 display_putc_pos;
+static u8 display_out_pos;
+
+void display_set(int cmd) {
+
+       if (cmd & DISPLAY_CLEAR) {
+               display_buf[0] = display_buf[1] = 0;
+       }
+
+       if (cmd & DISPLAY_HOME) {
+               display_putc_pos = 0;
+       }
+}
+
+#define SEG_A    (1<<0)
+#define SEG_B    (1<<1)
+#define SEG_C    (1<<2)
+#define SEG_D    (1<<3)
+#define SEG_E    (1<<4)
+#define SEG_F    (1<<5)
+#define SEG_G    (1<<6)
+#define SEG_P    (1<<7)
+#define SEG__    0
+
+/*
+ * +- A -+
+ * |     |
+ * F     B
+ * |     |
+ * +- G -+
+ * |     |
+ * E     C
+ * |     |
+ * +- D -+  P
+ *
+ * 0..9                index 0..9
+ * A..Z                index 10..35
+ * -           index 36
+ * _           index 37
+ * .           index 38
+ */
+
+#define SYMBOL_DASH            (36)
+#define SYMBOL_UNDERLINE       (37)
+#define SYMBOL_DOT             (38)
+
+static u8 display_char2seg7_tbl[]=
+{
+       SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,          /* 0 */
+       SEG_B | SEG_C,                                          /* 1 */
+       SEG_A | SEG_B | SEG_D | SEG_E | SEG_G,                  /* 2 */
+       SEG_A | SEG_B | SEG_C | SEG_D | SEG_G,                  /* 3 */
+       SEG_B | SEG_C | SEG_F | SEG_G,                          /* 4 */
+       SEG_A | SEG_C | SEG_D | SEG_F | SEG_G,                  /* 5 */
+       SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G,          /* 6 */
+       SEG_A | SEG_B | SEG_C,                                  /* 7 */
+       SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G,  /* 8 */
+       SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G,          /* 9 */
+       SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G,          /* A */
+       SEG_C | SEG_D | SEG_E | SEG_F | SEG_G,                  /* b */
+       SEG_A | SEG_D | SEG_E | SEG_F,                          /* C */
+       SEG_B | SEG_C | SEG_D | SEG_E | SEG_G,                  /* d */
+       SEG_A | SEG_D | SEG_E | SEG_F | SEG_G,                  /* E */
+       SEG_A | SEG_E | SEG_F | SEG_G,                          /* F */
+       0,                                      /* g - not displayed */
+       SEG_B | SEG_C | SEG_E | SEG_F | SEG_G,                  /* H */
+       SEG_B | SEG_C,                                          /* I */
+       0,                                      /* J - not displayed */
+       0,                                      /* K - not displayed */
+       SEG_D | SEG_E | SEG_F,                                  /* L */
+       0,                                      /* m - not displayed */
+       0,                                      /* n - not displayed */
+       SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,          /* O */
+       SEG_A | SEG_B | SEG_E | SEG_F | SEG_G,                  /* P */
+       0,                                      /* q - not displayed */
+       0,                                      /* r - not displayed */
+       SEG_A | SEG_C | SEG_D | SEG_F | SEG_G,                  /* S */
+       SEG_D | SEG_E | SEG_F | SEG_G,                          /* t */
+       SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,                  /* U */
+       0,                                      /* V - not displayed */
+       0,                                      /* w - not displayed */
+       0,                                      /* X - not displayed */
+       SEG_B | SEG_C | SEG_D | SEG_F | SEG_G,                  /* Y */
+       0,                                      /* Z - not displayed */
+       SEG_G,                                                  /* - */
+       SEG_D,                                                  /* _ */
+       SEG_P                                                   /* . */
+};
+
+/* Convert char to the LED segments representation */
+static u8 display_char2seg7(char c)
+{
+       u8 val = 0;
+
+       if (c >= '0' && c <= '9')
+               c -= '0';
+       else if (c >= 'a' && c <= 'z')
+               c -= 'a' - 10;
+       else if (c >= 'A' && c <= 'Z')
+               c -= 'A' - 10;
+       else if (c == '-')
+               c = SYMBOL_DASH;
+       else if (c == '_')
+               c = SYMBOL_UNDERLINE;
+       else if (c == '.')
+               c = SYMBOL_DOT;
+       else
+               c = ' ';        /* display unsupported symbols as space */
+
+       if (c != ' ')
+               val = display_char2seg7_tbl[(int)c];
+
+       return val;
+}
+
+int display_putc(char c)
+{
+       if (display_putc_pos >= DISPLAY_BUF_SIZE)
+               return -1;
+
+       display_buf[display_putc_pos++] = display_char2seg7(c);
+       /* one-symbol message should be steady */
+       if (display_putc_pos == 1)
+               display_buf[display_putc_pos] = display_char2seg7(c);
+
+       return c;
+}
+
+/*
+ * Flush current symbol to the LED display hardware
+ */
+static inline void display_flush(void)
+{
+       u32 val = display_buf[display_out_pos];
+
+       val |= (val << 8) | (val << 16) | (val << 24);
+       out_be32((void *)CONFIG_SYS_DISP_CHR_RAM, val);
+}
+
+/*
+ * Output contents of the software display buffer to the LED display every 0.5s
+ */
+void board_show_activity(ulong timestamp)
+{
+       static ulong last;
+       static u8 once;
+
+       if (!once || (timestamp - last >= (CONFIG_SYS_HZ / 2))) {
+               display_flush();
+               display_out_pos ^= 1;
+               last = timestamp;
+               once = 1;
+       }
+}
+
+/*
+ * Empty fake function
+ */
+void show_activity(int arg)
+{
+}
+#endif
+#if defined (CONFIG_SHOW_BOOT_PROGRESS)
+static int a4m072_status2code(int status, char *buf)
+{
+       char c = 0;
+
+       if (((status > 0) && (status <= 8)) ||
+                               ((status >= 100) && (status <= 108)) ||
+                               ((status < 0) && (status >= -9)) ||
+                               (status == -100) || (status == -101) ||
+                               ((status <= -103) && (status >= -113))) {
+               c = '5';
+       } else if (((status >= 9) && (status <= 14)) ||
+                       ((status >= 120) && (status <= 123)) ||
+                       ((status >= 125) && (status <= 129)) ||
+                       ((status >= -13) && (status <= -10)) ||
+                       (status == -120) || (status == -122) ||
+                       ((status <= -124) && (status >= -127)) ||
+                       (status == -129)) {
+               c = '8';
+       } else if (status == 15) {
+               c = '9';
+       } else if ((status <= -30) && (status >= -32)) {
+               c = 'A';
+       } else if (((status <= -35) && (status >= -40)) ||
+                       ((status <= -42) && (status >= -51)) ||
+                       ((status <= -53) && (status >= -58)) ||
+                       (status == -64) ||
+                       ((status <= -80) && (status >= -83)) ||
+                       (status == -130) || (status == -140) ||
+                       (status == -150)) {
+               c = 'B';
+       }
+
+       if (c == 0)
+               return -EINVAL;
+
+       buf[0] = (status < 0) ? '-' : c;
+       buf[1] = c;
+
+       return 0;
+}
+
+void show_boot_progress(int status)
+{
+       char buf[2];
+
+       if (a4m072_status2code(status, buf) < 0)
+               return;
+
+       display_putc(buf[0]);
+       display_putc(buf[1]);
+       display_set(DISPLAY_HOME);
+       display_out_pos = 0;    /* reset output position */
+
+       /* we want to flush status 15 now */
+       if (status == BOOTSTAGE_ID_RUN_OS)
+               display_flush();
+}
+#endif