aboutsummaryrefslogtreecommitdiff
path: root/board/lego
diff options
context:
space:
mode:
authorDavid Lechner <david@lechnology.com>2021-01-11 13:24:44 -0600
committerLokesh Vutla <lokeshvutla@ti.com>2021-02-04 20:37:56 +0530
commit68432b5d12fbf3de2ffa51577bc0d00c3138c53c (patch)
tree887a0739deb7abd115865efcff1ee66989a9c11d /board/lego
parent64fd2d26140aa72b43428d079974f7c0e7f88353 (diff)
downloadu-boot-68432b5d12fbf3de2ffa51577bc0d00c3138c53c.zip
u-boot-68432b5d12fbf3de2ffa51577bc0d00c3138c53c.tar.gz
u-boot-68432b5d12fbf3de2ffa51577bc0d00c3138c53c.tar.bz2
ARM: legoev3: set serial# env var
This sets the serial# environmet variable instead of using ATAGs on LEGO MINDSTORMS EV3. Also fix some nomenclature while we are touching this code (Bluetooth address is not the same as MAC address, EEPROM version is not the same as board version). Signed-off-by: David Lechner <david@lechnology.com>
Diffstat (limited to 'board/lego')
-rw-r--r--board/lego/ev3/legoev3.c85
1 files changed, 39 insertions, 46 deletions
diff --git a/board/lego/ev3/legoev3.c b/board/lego/ev3/legoev3.c
index 51b669a..9ef3e12 100644
--- a/board/lego/ev3/legoev3.c
+++ b/board/lego/ev3/legoev3.c
@@ -13,6 +13,7 @@
*/
#include <common.h>
+#include <env.h>
#include <i2c.h>
#include <init.h>
#include <spi.h>
@@ -28,11 +29,9 @@
DECLARE_GLOBAL_DATA_PTR;
-u8 board_rev;
-
#define EEPROM_I2C_ADDR 0x50
#define EEPROM_REV_OFFSET 0x3F00
-#define EEPROM_MAC_OFFSET 0x3F06
+#define EEPROM_BDADDR_OFFSET 0x3F06
const struct pinmux_resource pinmuxes[] = {
PINMUX_ITEM(spi0_pins_base),
@@ -52,59 +51,46 @@ const struct lpsc_resource lpsc[] = {
const int lpsc_size = ARRAY_SIZE(lpsc);
-u32 get_board_rev(void)
-{
- u8 buf[2];
-
- if (!board_rev) {
- if (i2c_read(EEPROM_I2C_ADDR, EEPROM_REV_OFFSET, 2, buf, 2)) {
- printf("\nBoard revision read failed!\n");
- } else {
- /*
- * Board rev 3 has MAC address at EEPROM_REV_OFFSET.
- * Other revisions have checksum at EEPROM_REV_OFFSET+1
- * to detect this.
- */
- if ((buf[0] ^ buf[1]) == 0xFF)
- board_rev = buf[0];
- else
- board_rev = 3;
- }
- }
-
- return board_rev;
-}
-
/*
- * The Bluetooth MAC address serves as the board serial number.
+ * The Bluetooth address serves as the board serial number.
*/
-void get_board_serial(struct tag_serialnr *serialnr)
+static void setup_serial_number(void)
{
u32 offset;
+ char serial_number[13];
u8 buf[6];
+ u8 eeprom_rev;
+
+ if (env_get("serial#"))
+ return;
+
+ if (i2c_read(EEPROM_I2C_ADDR, EEPROM_REV_OFFSET, 2, buf, 2)) {
+ printf("\nEEPROM revision read failed!\n");
+ return;
+ }
- if (!board_rev)
- board_rev = get_board_rev();
+ /*
+ * EEPROM rev 3 has Bluetooth address at EEPROM_REV_OFFSET.
+ * Other revisions have checksum at EEPROM_REV_OFFSET+1
+ * to detect this.
+ */
+ if ((buf[0] ^ buf[1]) == 0xFF)
+ eeprom_rev = buf[0];
+ else
+ eeprom_rev = 3;
- /* Board rev 3 has MAC address where rev should be */
- offset = (board_rev == 3) ? EEPROM_REV_OFFSET : EEPROM_MAC_OFFSET;
+ /* EEPROM rev 3 has Bluetooth address where rev should be */
+ offset = (eeprom_rev == 3) ? EEPROM_REV_OFFSET : EEPROM_BDADDR_OFFSET;
if (i2c_read(EEPROM_I2C_ADDR, offset, 2, buf, 6)) {
- printf("\nBoard serial read failed!\n");
- } else {
- u8 *nr;
-
- nr = (u8 *)&serialnr->low;
- nr[0] = buf[5];
- nr[1] = buf[4];
- nr[2] = buf[3];
- nr[3] = buf[2];
- nr = (u8 *)&serialnr->high;
- nr[0] = buf[1];
- nr[1] = buf[0];
- nr[2] = 0;
- nr[3] = 0;
+ printf("\nEEPROM serial read failed!\n");
+ return;
}
+
+ sprintf(serial_number, "%02X%02X%02X%02X%02X%02X",
+ buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
+
+ env_set("serial#", serial_number);
}
int board_early_init_f(void)
@@ -150,3 +136,10 @@ int board_init(void)
return 0;
}
+
+int board_late_init(void)
+{
+ setup_serial_number();
+
+ return 0;
+}