[U-Boot] [PATCH v1] ARM: omap-common: Add support for EEPROM

Nishanth Menon nm at ti.com
Thu Oct 29 18:34:22 CET 2015


On 10/28/2015 05:45 PM, Steve Kipisz wrote:
> From: Lokesh Vutla <lokeshvutla at ti.com>
> 
> Add support for EEPROM init and read. The am57xx boards have EEPROMs
> that have board name, version, serial data and other data. The init
> routine will initialize an i2c bus and then probe for the EEPROM
> device. The read routine will read data from the EEPROM and store
> it in an omap_eeprom structure. The data read will be used later in
> board detection of TI EVMs.
> 
> This code is in omap-common since it can be reused by other TI EVMs
> that have EEPROMs that use the same format. The onboard EEPROM on the
> Beaglebone Black, Bealgebone, AM335x EVM, AM34x GP EVM, DRA-74 EVM also
> follows the same format. So its better to define a common function,
> insted of redefining everywhere.
> 
> Signed-off-by: Lokesh Vutla <lokeshvutla at ti.com>
> Signed-off-by: Steve Kipisz <s-kipisz2 at ti.com>
> ---
>  arch/arm/cpu/armv7/omap-common/Makefile      |  1 +
>  arch/arm/cpu/armv7/omap-common/omap_eeprom.c | 54 +++++++++++++++++++++++++++
>  arch/arm/include/asm/omap_common.h           | 55 ++++++++++++++++++++++++++++
>  include/configs/am57xx_evm.h                 | 10 +++++
>  4 files changed, 120 insertions(+)
>  create mode 100644 arch/arm/cpu/armv7/omap-common/omap_eeprom.c
> 
> diff --git a/arch/arm/cpu/armv7/omap-common/Makefile b/arch/arm/cpu/armv7/omap-common/Makefile
> index 464a5d1..99ea897 100644
> --- a/arch/arm/cpu/armv7/omap-common/Makefile
> +++ b/arch/arm/cpu/armv7/omap-common/Makefile
> @@ -30,3 +30,4 @@ obj-y	+= boot-common.o
>  obj-y	+= lowlevel_init.o
>  
>  obj-y	+= mem-common.o
> +obj-$(CONFIG_ENV_EEPROM_IS_ON_I2C) += omap_eeprom.o
> diff --git a/arch/arm/cpu/armv7/omap-common/omap_eeprom.c b/arch/arm/cpu/armv7/omap-common/omap_eeprom.c
> new file mode 100644
> index 0000000..98de51e
> --- /dev/null
> +++ b/arch/arm/cpu/armv7/omap-common/omap_eeprom.c
> @@ -0,0 +1,54 @@
> +/*
> + * omap_eeprom.c
> + *
> + * Copyright (C) 2015 Texas Instruments Incorporated -
> + * http://www.ti.com/
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <i2c.h>
> +#include <asm/omap_common.h>
> +
> +int omap_eeprom_init(int i2c_bus, int dev_addr)
> +{
> +	int rc = 0;
> +
> +	rc = i2c_set_bus_num(i2c_bus);
> +	if (rc) {
> +		printf("I2C bus %d Initialization failed err=%d\n",
> +		       i2c_bus, rc);
> +		return -1;
> +	}
> +
> +	rc = i2c_probe(dev_addr);
> +	if (rc) {
> +		printf("I2c probe at address %d on bus %d failed err=%d\n",
> +		       dev_addr, i2c_bus, rc);
> +		return -1;
> +	}
> +
> +	return 0;
> +}
> +
> +int omap_eeprom_read(int dev_addr, int offset, struct omap_eeprom *ep)
> +{
> +	int ret = 0;
> +
> +	ret = i2c_read(dev_addr, offset, 2, (uchar *)ep,
> +		sizeof(struct omap_eeprom));
> +
> +	if (!ret) {
> +		/*
> +		 * Return error if proper header
> +		 * is not found.
> +		 */
> +		if (ep->header != OMAP_EEPROM_HEADER)
> +			ret = -1;
> +	} else {
> +		printf("i2c read error err=%d\n", ret);
> +	}
> +
> +	return ret;
> +}
> diff --git a/arch/arm/include/asm/omap_common.h b/arch/arm/include/asm/omap_common.h
> index d7b81c1..9a9b154 100644
> --- a/arch/arm/include/asm/omap_common.h
> +++ b/arch/arm/include/asm/omap_common.h
> @@ -552,6 +552,61 @@ struct vcores_data {
>  	struct volts iva;
>  };
>  
> +/*
> + * TI AM57xx EVMs define a system EEPROM that defines certain sub-fields.
> + * We use these fields to in turn see what board we are on, and what
> + * that might require us to set or not set.
> + */
> +
> +#define HDR_NO_OF_MAC_ADDR	3
> +#define HDR_ETH_ALEN		6
> +#define HDR_NAME_LEN		8
> +#define OMAP_EEPROM_HEADER	0xEE3355AA
> +
> +/**
> + * struct omap_eeprom - This structure holds data read in from the
> + *			EEPROM.
> + * @header: This holds the magic number
> + * @name: The name of the board
> + * @version: Board revision
> + * @serail: Board serial number
> + * @config: Reserved
> + * @mac_addr: Any MAC addresses written in the EEPROM
> + *
> + * The data is this struction is read from the EEPROM on the board.
> + * It is used for board detection which is based on name. It is used
> + * to configure specific TI boards. This allows booting of multible
> + * TI boards with a single MLO and u-boot.
> + */
> +struct omap_eeprom {
> +	unsigned int header;
> +	char name[HDR_NAME_LEN];
> +	char version[4];
> +	char serial[12];
> +	char config[32];
> +	char mac_addr[HDR_NO_OF_MAC_ADDR][HDR_ETH_ALEN];
> +};

This structure is not generic to all platforms -> DRA7-evm for example
uses a completely different eeprom organization.
> +
> +/**
> + * omap_eeprom_init - Initialize an i2c bus and probe for a device
> + * @i2c_bus: i2c bus number to initialize
> + * @dev_addr: Device address to probe for
> + *
> + * Return: 0 on success or -1 on failure.
> + */
> +int omap_eeprom_init(int i2c_bus, int dev_addr);
> +
> +/**
> + * omap_eeprom_read - Read data from an EEPROM
> + * @dev_addr: The device address of the EEPROM
> + * @offset: Offset to start reading in the EEPROM
> + * @ep: Pointer to the omap_eeprom structure to read into
> + *
> + * Return: 0 on success, -1 if the header is invalid, or the non-zero
> + *         return code of a failed i2c_read
> + */
> +int omap_eeprom_read(int dev_addr, int offset, struct omap_eeprom *ep);
> +
>  extern struct prcm_regs const **prcm;
>  extern struct prcm_regs const omap5_es1_prcm;
>  extern struct prcm_regs const omap5_es2_prcm;
> diff --git a/include/configs/am57xx_evm.h b/include/configs/am57xx_evm.h
> index 6308cab..1b70923 100644
> --- a/include/configs/am57xx_evm.h
> +++ b/include/configs/am57xx_evm.h
> @@ -87,5 +87,15 @@
>  #define CONFIG_SYS_SCSI_MAX_LUN		1
>  #define CONFIG_SYS_SCSI_MAX_DEVICE	(CONFIG_SYS_SCSI_MAX_SCSI_ID * \
>  						CONFIG_SYS_SCSI_MAX_LUN)
> +/* EEPROM Support */
> +#undef CONFIG_SPI
> +#define CONFIG_CMD_EEPROM
> +#define CONFIG_ENV_EEPROM_IS_ON_I2C
> +#define CONFIG_SYS_I2C_MULTI_EEPROMS
> +#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
> +#define CONFIG_EEPROM_CHIP_ADDR 0x50
> +
> +#define CONFIG_SYS_OMAP_I2C0 0
> +#define CONFIG_SYS_OMAP24_I2C_SPEED4 400000
>  
>  #endif /* __CONFIG_AM57XX_EVM_H */
> 

Introduce this as part of AM57xx eeprom detection.



-- 
Regards,
Nishanth Menon


More information about the U-Boot mailing list