[PATCH v4] arm: socfpga: add board support for ic-automation Moritz III

Tan, Ley Foon ley.foon.tan at intel.com
Mon Sep 7 11:11:17 CEST 2020



> -----Original Message-----
> From: Nico Becker <n.becker at ic-automation.de>
> Sent: Friday, July 17, 2020 6:23 PM
> To: u-boot at lists.denx.de; marex at denx.de;
> simon.k.r.goldschmidt at gmail.com; Tan, Ley Foon <ley.foon.tan at intel.com>
> Cc: Nico Becker <n.becker at 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.becker at 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



More information about the U-Boot mailing list