Commit 042a7cb1 by Jose Miquel Sanabria

IGEP0046: igep eeprom struct + mac address management to linux

parent 5d3f554d
......@@ -11,20 +11,19 @@
#ifndef __COMMON_HEADER__
#define __COMMON_HEADER__
#define IGEP_MAGIC_ID 0x6D6A6DE4
struct __attribute__((packed)) igep_mf_setup {
u32 magic_id; /* eeprom magic id */
u32 crc32; /* eeprom crc32 */
char board_uuid [37]; /* board identifier */
char board_pid [20]; /* product identifier */
char name [20]; /* board name */
char model [10]; /* board model */
char pcb_version [10]; /* board version */
char assembly_rev[10]; /* board revision */
char board_manufacturer[30]; /* board manufacturer */
char manf_of[10]; /* manufacturer order of fabrication */
char manf_timestamp[16]; /* manufacturer timestamp */
uchar bmac0[6]; /* MAC 0 - default */
uchar bmac1[6]; /* MAC 1 */
char board_uuid [36]; /* board identifier */
char board_pid [16]; /* product identifier */
char model [8]; /* board model */
char variant [9]; /* board version */
char manf_of[6]; /* manufacturer order of fabrication */
char manf_timestamp[19]; /* manufacturer timestamp */
uchar bmac0[17]; /* MAC 0 - default */
uchar bmac1[17]; /* MAC 1 */
};
#endif
......
......@@ -181,8 +181,9 @@ static iomux_v3_cfg_t const init_pads[] =
MX6_PAD_CSI0_DAT7__GPIO5_IO25 | MUX_PAD_CTRL(NO_PAD_CTRL),
#endif
};
const uchar igep_mac0 [6] = { 0x02, 0x00, 0x00, 0x00, 0x00, 0xff };
#define STATION 0x01
const uchar igep_mac0 [6] = { 0x02, 0xBA, 0xD0, 0xBA, 0xD0, STATION };
uchar enetaddr[6];
static int igep_eeprom_valid = 0;
static struct igep_mf_setup igep0046_eeprom_config;
......@@ -375,17 +376,28 @@ int board_phy_config(struct phy_device *phydev)
return 0;
}
const uchar* get_mac_address (void)
static int get_mac_address (void)
{
if(igep_eeprom_valid)
return igep0046_eeprom_config.bmac0;
return igep_mac0;
// MAC are 17 ASCII characters so we need to work it out a bit
int i = 0;
uchar ans[6];
if(igep_eeprom_valid){
for (i = 0; i < 6; i++){
ans[i] = parse_char(igep0046_eeprom_config.bmac0[(i*3)]) * 0x10 + parse_char(igep0046_eeprom_config.bmac0[((i*3)+1)]);
}
memcpy(enetaddr, ans, 6);
//memcpy(enetaddr, igep_mac0, 6);
}else{
memcpy(enetaddr, igep_mac0, 6);
}
return eth_setenv_enetaddr("ethaddr", enetaddr);
}
int board_eth_init(bd_t *bis)
{
eth_setenv_enetaddr("ethaddr", get_mac_address());
get_mac_address();
setup_iomux_enet();
#ifdef CONFIG_FEC_MXC
cpu_eth_init(bis);
......@@ -414,8 +426,6 @@ int board_early_init_f(void)
int board_init(void)
{
u32 crc_value = 0;
u32 crc_save_value = 0;
#ifdef CONFIG_BASE0040
reset_audio();
......@@ -427,24 +437,6 @@ int board_init(void)
mdelay(1);
#endif
if(check_eeprom() != 0){
printf("EEPROM: not found\n");
}else{
/* Read configuration from eeprom */
if(eeprom46_read_setup(0, (char*) &igep0046_eeprom_config, sizeof(struct igep_mf_setup)))
printf("EEPROM: read fail\n");
/* Verify crc32 */
crc_save_value = igep0046_eeprom_config.crc32;
igep0046_eeprom_config.crc32 = 0;
crc_value = crc32(0, (const unsigned char*) &igep0046_eeprom_config, sizeof(struct igep_mf_setup));
if(crc_save_value != crc_value){
printf("EEPROM: CRC32 failed. Loading default MAC\n");
}else{
printf("EEPROM: CRC32 OK! Loading MAC from eeprom\n");
igep_eeprom_valid = 1;
}
}
#ifdef CONFIG_BASE0040
reset_usb_hub();
#endif
......@@ -488,8 +480,46 @@ static inline unsigned int pcb_version(void)
int board_late_init(void)
{
u32 crc_value = 0;
u32 crc_save_value;
if(check_eeprom() != 0){
printf("EEPROM: not found\n");
}else{
/* Read configuration from eeprom */
if(eeprom46_read_setup(0, (char*) &igep0046_eeprom_config, sizeof(struct igep_mf_setup)))
printf("EEPROM: read fail\n");
/* Verify crc32 */
printf("EEPROM: read %d bytes \n", sizeof(struct igep_mf_setup));
printf("---------------------------- |!| IGEP STRUCT |!| ----------------------------\n");
printf("magic_id: 0x%x \n", igep0046_eeprom_config.magic_id);
printf("crc32: 0x%x \n", igep0046_eeprom_config.crc32);
printf("board_uuid: %.36s \n", igep0046_eeprom_config.board_uuid);
printf("board_pid: %.16s \n", igep0046_eeprom_config.board_pid);
printf("model: %.8s \n", igep0046_eeprom_config.model);
printf("variant: %.9s \n", igep0046_eeprom_config.variant);
printf("manf_of: %.6s \n", igep0046_eeprom_config.manf_of);
printf("manf_timestamp: %.19s \n", igep0046_eeprom_config.manf_timestamp);
printf("bmac0: %.17s \n", igep0046_eeprom_config.bmac0);
printf("bmac1: %.17s \n", igep0046_eeprom_config.bmac1);
printf("-----------------------------------------------------------------------------\n");
crc_save_value = igep0046_eeprom_config.crc32;
igep0046_eeprom_config.crc32 = 0;
crc_value = crc32(0, (const unsigned char*) &igep0046_eeprom_config, sizeof(struct igep_mf_setup));
printf("crc32 calculated: 0x%x \n", crc_value);
if(crc_save_value != crc_value){
printf("EEPROM: CRC32 failed. Loading default MAC\n");
}else{
printf("EEPROM: CRC32 OK! Loading MAC from eeprom\n");
igep_eeprom_valid = 1;
}
}
checkboard();
puts("\n");
switch (pcb_version()) {
case PCB_REV_A:
puts("Board: MX6-IGEP0046 Rev A\n");
......
......@@ -60,3 +60,12 @@ int check_eeprom (void)
}
return 0;
}
unsigned int parse_char(char c)
{
if ('0' <= c && c <= '9') return c - '0';
if ('a' <= c && c <= 'f') return 10 + c - 'a';
if ('A' <= c && c <= 'F') return 10 + c - 'A';
return 0;
}
\ No newline at end of file
......@@ -14,4 +14,5 @@
int eeprom46_write_setup (uint8_t s_addr, const char* data, u32 size);
int eeprom46_read_setup (uint8_t s_addr, char* data, u32 size);
int check_eeprom (void);
unsigned int parse_char(char c);
#endif
......@@ -217,6 +217,7 @@ else
"fdt_addr=0x18000000\0" \
"boot_fdt=try\0" \
"bootdir=\0" \
"ethaddr=\0" \
"ip_dyn=no\0" \
"console=" CONSOLE_DEV "\0" \
"fdt_high=0xffffffff\0" \
......@@ -254,7 +255,7 @@ else
"setexpr fb $fb + 1; " \
"done\0" \
"mmcargs=setenv bootargs console=${console},${baudrate} " \
"root=${mmcroot} " \
"root=${mmcroot} fec.macaddr=${ethaddr} " \
VIDEO_ARGS "\0" \
"loadbootenv=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${bootdir}${bootenv}\0" \
"importbootenv=echo Importing environment from mmc ...; " \
......@@ -278,7 +279,7 @@ else
"bootz; " \
"fi;\0" \
"sataargs=setenv bootargs console=${console},${baudrate} " \
"root=${sataroot} " \
"root=${sataroot} fec.macaddr=${ethaddr} " \
VIDEO_ARGS "\0" \
"loadimagesata=fatload sata 0:1 ${loadaddr} ${bootdir}${image}\0" \
"loadfdtsata=fatload sata 0:1 ${fdt_addr} ${bootdir}${fdt_file}\0" \
......@@ -303,9 +304,9 @@ else
"bootz; " \
"fi;\0" \
"netargs=setenv bootargs console=${console},${baudrate} " \
"root=/dev/nfs " \
"ip=dhcp nfsroot=${serverip}:${rootnfs},v3,tcp " \
"root=/dev/nfs fec.macaddr=${ethaddr} " \
VIDEO_ARGS "\0" \
"ip=dhcp nfsroot=${serverip}:${rootnfs},v3,tcp " \
"netboot=echo Booting from net ...; " \
VIDEO_ARGS_SCRIPT \
"run netargs; " \
......@@ -362,6 +363,7 @@ else
#define CONFIG_EXTRA_ENV_SETTINGS \
"bootenv=uEnv.txt\0" \
"bootdir=\0" \
"ethaddr=\0" \
"image=zImage\0" \
"fdt_file=" CONFIG_DEFAULT_FDT_FILE "\0" \
"fdt_addr=0x18000000\0" \
......@@ -403,7 +405,7 @@ else
"setexpr fb $fb + 1; " \
"done\0" \
"mmcargs=setenv bootargs console=${console},${baudrate} " \
"root=${mmcroot} " \
"root=${mmcroot} fec.macaddr=${ethaddr} " \
VIDEO_ARGS "\0" \
"loadbootenv=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${bootdir}${bootenv}\0" \
"importbootenv=echo Importing environment from mmc ...; " \
......@@ -427,7 +429,7 @@ else
"bootz; " \
"fi;\0" \
"sataargs=setenv bootargs console=${console},${baudrate} " \
"root=${sataroot} " \
"root=${sataroot} fec.macaddr=${ethaddr} " \
VIDEO_ARGS "\0" \
"loadimagesata=fatload sata 0:1 ${loadaddr} ${bootdir}${image}\0" \
"loadfdtsata=fatload sata 0:1 ${fdt_addr} ${bootdir}${fdt_file}\0" \
......@@ -452,7 +454,7 @@ else
"bootz; " \
"fi;\0" \
"netargs=setenv bootargs console=${console},${baudrate} " \
"root=/dev/nfs " \
"root=/dev/nfs fec.macaddr=${ethaddr} " \
"ip=dhcp nfsroot=${serverip}:${rootnfs},v3,tcp " \
VIDEO_ARGS "\0" \
"netboot=echo Booting from net ...; " \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment