> -----Original Message-----
> From: Nico Becker <n.bec...@ic-automation.de>
> Sent: Friday, July 17, 2020 6:23 PM
> To: u-boot@lists.denx.de; ma...@denx.de;
> simon.k.r.goldschm...@gmail.com; Tan, Ley Foon <ley.foon....@intel.com>
> Cc: Nico Becker <n.bec...@ic-automation.de>
> Subject: [PATCH v4] arm: socfpga: add board support for ic-automation
> Moritz III
> 
> add board support for the moritz III from ic-automation
> 
> Changes for v4:
>       - re-sort list alphabetically
>       - c style comments
> 
> Changes for v3:
>        - Resend via git send-email
> 
> Changes for v2:
>       - Coding Style cleanup
> 
> Signed-off-by: Nico Becker <n.bec...@ic-automation.de>
> +
> +#include <common.h>
> +#include <net.h>
> +#include <dm/uclass.h>
> +#include <i2c.h>
> +#include <env_flags.h>
> +#include <u-boot/crc.h>
> +
> +#define I2C_BUS_NUM                                          1
> +#define EEPROM_ADDR                                          0x50
> +#define GPIO_ADDR                                                    0x20
> +
> +#define SERIALNUMBER_LENGTH          8
> +#define MAC_LENGTH                                           6
> +#define CRC32_LENGTH                                 4
> +#define OVERALL_LENGTH
>       (SERIALNUMBER_LENGTH + MAC_LENGTH + CRC32_LENGTH)
> +
> +int board_late_init(void)
> +{
> +     u8 mac[MAC_LENGTH];
> +     char serial[SERIALNUMBER_LENGTH + 1];
> +     u8 eeprom_data[OVERALL_LENGTH];
> +     u32 calc_crc32;
> +     u32 *read_crc32;
> +     u8 w_data;
> +     int error;
> +     u8 registers[] = {0x02, 0x03, 0x06, 0x07};
> +
> +     for (int i = 0; i < OVERALL_LENGTH; i++)
> +             eeprom_data[i] = 0x00;
> +
> +     printf(" _                       _                        _   _\n");
> +     printf("(_) ___       __ _ _   _| |_ ___  _ __ ___   __ _| |_(_) ___  _
> __\n");
> +     printf("| |/ __|____ / _` | | | | __/ _ \\| '_ ` _ \\ / _` | __| |/ _ 
> \\| '_
> \\\n");
> +     printf("| | (_|_____| (_| | |_| | || (_) | | | | | | (_| | |_| | (_) | 
> | |
> |\n");
> +     printf("|_|\\___|     \\__,_|\\__,_|\\__\\___/|_| |_|
> |_|\\__,_|\\__|_|\\___/|_| |_|\n");
> +     printf("\n");
> +
> +     /* delete environment var first. Otherwise we are unable to set it's
> value... */
> +     env_set("ethaddr", "");
> +
> +     struct udevice *bus;
> +     struct udevice *dev;
> +
> +     error = uclass_get_device_by_seq(UCLASS_I2C, I2C_BUS_NUM,
> &bus);
> +     if (error) {
> +             printf("cannot get I2C bus 1: uclass_get_device_by_seq
> failed: %i\n", error);
> +             return 0;
> +     }
> +
> +     error = i2c_get_chip(bus, EEPROM_ADDR, 1, &dev);
> +     if (error) {
> +             printf("Cannot get I2C chip: i2c_get_chip failed: %i\n", error);
> +             return 0;
> +     }
> +
> +     /* i2c EEPROM available? */
> +     error = dm_i2c_probe(bus, EEPROM_ADDR, 0, &dev);
> +     if (error) {
> +             printf("Couldn't find i2c eeprom\n");
> +             return 0;
> +     }
> +
> +     error = dm_i2c_read(dev, 0, eeprom_data, OVERALL_LENGTH);
> +     if (error) {
> +             printf("i2c_read failed %d\n", error);
> +             return 0;
> +     }
> +
> +     /* check crc32 */
> +     calc_crc32 = crc32(0, eeprom_data, OVERALL_LENGTH -
> CRC32_LENGTH);
> +     read_crc32 = (u32 *)&eeprom_data[SERIALNUMBER_LENGTH +
> MAC_LENGTH];
> +     if (*read_crc32 != calc_crc32) {
> +             /* print read data is crc32 not valid */
> +             printf("read data:");
> +             for (int i = 0; i < OVERALL_LENGTH; i++)
> +                     printf("%02X", eeprom_data[i]);
> +             printf("\n");
> +             /* print crc32 */
> +             printf("read crc32 %08X calc crc32 %08X\n", *read_crc32,
> calc_crc32);
> +
> +             strncpy(serial, "00000000", 8);
> +             memset((void *)mac, 0x00, 8);
> +     } else {
> +             /* copy and print serial */
Comment should be "copy".
> +             memcpy((void *)serial, (void *)eeprom_data,
> SERIALNUMBER_LENGTH);
> +
> +             /* print MAC address */
Comment should be "copy".
> +             memcpy((void *)mac, (void
> *)&eeprom_data[SERIALNUMBER_LENGTH], MAC_LENGTH);
> +     }
> +
> +     serial[SERIALNUMBER_LENGTH] = 0x00;
> +     printf("Serialnumber = %s\n", serial);
> +
> +     if (!is_valid_ethaddr(mac)) {
> +             printf("MAC address is invalid, set random MAC\n");
How it set random MAC address here? Need call to net_random_ethaddr() here?
> +     } else {
> +             printf("MAC = %02X:%02X:%02X:%02X:%02X:%02X\n",
> +                     mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
> +             error = eth_env_set_enetaddr("ethaddr", mac);
> +             if (error)
> +                     printf("MAC address NOT set. Error: %d\n", error);
> +             else
> +                     printf("MAC address successfully set\n");
> +     }
> +
> +     /* set GPIOs */
> +     error = i2c_get_chip(bus, GPIO_ADDR, 1, &dev);
> +     w_data = 0x00;
> +     for (int i = 0 ; i < sizeof(registers) / sizeof(u8); i++) {
> +             /* set all values 0 at GPIO-Bank 0 */
> +             error = dm_i2c_write(dev, registers[i], &w_data, 1);
> +             if (error) {
> +                     printf("i2c_write GPIO register %X failed.
> Error: %d\n",
> +                             registers[i], error);
> +                     return 0;
> +             }
> +     }
> +     return 0;
> +}


Thanks.

Regards
Ley Foon

Reply via email to