diff options
Diffstat (limited to 'roms/u-boot/board/atmel/common')
-rw-r--r-- | roms/u-boot/board/atmel/common/Makefile | 9 | ||||
-rw-r--r-- | roms/u-boot/board/atmel/common/board.c | 79 | ||||
-rw-r--r-- | roms/u-boot/board/atmel/common/mac-spi-nor.c | 128 | ||||
-rw-r--r-- | roms/u-boot/board/atmel/common/mac_eeprom.c | 71 | ||||
-rw-r--r-- | roms/u-boot/board/atmel/common/video_display.c | 77 |
5 files changed, 364 insertions, 0 deletions
diff --git a/roms/u-boot/board/atmel/common/Makefile b/roms/u-boot/board/atmel/common/Makefile new file mode 100644 index 000000000..6bc8cabb8 --- /dev/null +++ b/roms/u-boot/board/atmel/common/Makefile @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright (C) 2017 Microchip +# Wenyou Yang <wenyou.yang@microchip.com> + +obj-y += board.o +obj-$(CONFIG_I2C_EEPROM) += mac_eeprom.o +obj-$(CONFIG_SPI_FLASH_SFDP_SUPPORT) += mac-spi-nor.o +obj-$(CONFIG_DM_VIDEO) += video_display.o diff --git a/roms/u-boot/board/atmel/common/board.c b/roms/u-boot/board/atmel/common/board.c new file mode 100644 index 000000000..eee5c357b --- /dev/null +++ b/roms/u-boot/board/atmel/common/board.c @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2017 Microchip + * Wenyou Yang <wenyou.yang@microchip.com> + */ + +#include <common.h> +#include <dm.h> +#include <env.h> +#include <w1.h> +#include <w1-eeprom.h> +#include <dm/device-internal.h> + +#define AT91_PDA_EEPROM_ID_OFFSET 15 +#define AT91_PDA_EEPROM_ID_LENGTH 5 +#define AT91_PDA_EEPROM_DEFAULT_BUS 0 + +char *get_cpu_name(void); + +void dummy(void) +{ +} + +#if defined CONFIG_W1 +void at91_pda_detect(void) +{ + struct udevice *bus, *dev; + u8 buf[AT91_PDA_EEPROM_ID_LENGTH + 1] = {0}; + int ret; + int pda = 0; + + ret = w1_get_bus(AT91_PDA_EEPROM_DEFAULT_BUS, &bus); + if (ret) + goto pda_detect_err; + + for (device_find_first_child(bus, &dev); + dev; + device_find_next_child(&dev)) { + ret = device_probe(dev); + if (ret) { + continue; + } else { + ret = w1_eeprom_read_buf(dev, AT91_PDA_EEPROM_ID_OFFSET, + (u8 *)buf, AT91_PDA_EEPROM_ID_LENGTH); + if (ret) + goto pda_detect_err; + break; + } + } + pda = simple_strtoul((const char *)buf, NULL, 10); + + switch (pda) { + case 7000: + if (buf[4] == 'B') + printf("PDA TM7000B detected\n"); + else + printf("PDA TM7000 detected\n"); + break; + case 4300: + printf("PDA TM4300 detected\n"); + break; + case 5000: + printf("PDA TM5000 detected\n"); + break; + } + +pda_detect_err: + env_set("pda", (const char *)buf); +} +#else +void at91_pda_detect(void) +{ +} +#endif + +void at91_prepare_cpu_var(void) +{ + env_set("cpu", get_cpu_name()); +} diff --git a/roms/u-boot/board/atmel/common/mac-spi-nor.c b/roms/u-boot/board/atmel/common/mac-spi-nor.c new file mode 100644 index 000000000..ced27b65e --- /dev/null +++ b/roms/u-boot/board/atmel/common/mac-spi-nor.c @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Microchip Technology Inc. and its subsidiaries + * + * Author: Tudor Ambarus <tudor.ambarus@microchip.com> + */ + +#include <common.h> +#include <dm.h> +#include <env.h> +#include <net.h> +#include <linux/mtd/spi-nor.h> +#include <netdev.h> + +#define ETH_ADDR_SIZE 6 + +#ifdef CONFIG_SPI_FLASH_SST +#define SFDP_MICROCHIP_MANUF_ID 0xbf +#define SFDP_MICROCHIP_MEM_TYPE 0x26 +#define SFDP_MICROCHIP_DEV_ID 0x43 + +#define SFDP_MICROCHIP_EUI_OFFSET 0x60 +#define SFDP_MICROCHIP_EUI48 0x30 + +struct sst26vf064beui { + u8 manufacturer_id; + u8 memory_type; + u8 device_id; + u8 reserved; +}; + +/** + * sst26vf064beui_check() - Check the validity of the EUI-48 information from + * the sst26vf064beui SPI NOR Microchip SFDP table. + * @manufacturer_sfdp: pointer to the Microchip manufacturer specific SFDP + * table. + * + * Return: 0 on success, -errno otherwise. + */ +static int sst26vf064beui_check(const u8 *manufacturer_sfdp) +{ + struct sst26vf064beui *sst26vf064beui = + (struct sst26vf064beui *)manufacturer_sfdp; + + if (sst26vf064beui->manufacturer_id != SFDP_MICROCHIP_MANUF_ID) + return -EINVAL; + + if (sst26vf064beui->memory_type != SFDP_MICROCHIP_MEM_TYPE) + return -EINVAL; + + if (sst26vf064beui->device_id != SFDP_MICROCHIP_DEV_ID) + return -EINVAL; + + /* + * Check if the EUI-48 MAC address is programmed in the next six address + * locations. + */ + if (manufacturer_sfdp[SFDP_MICROCHIP_EUI_OFFSET] != + SFDP_MICROCHIP_EUI48) + return -EINVAL; + + return 0; +} + +/** + * sst26vf064beui_get_ethaddr() - Get the ethernet address from the + * sst26vf064beui SPI NOR Microchip SFDP table. + * @manufacturer_sfdp: pointer to the Microchip manufacturer specific SFDP + * table. + * @ethaddr: pointer where to fill the ethernet address + * @size: size of the ethernet address. + * + * Return: 0 on success, -errno otherwise. + */ +static int sst26vf064beui_get_ethaddr(const u8 *manufacturer_sfdp, + u8 *ethaddr, size_t size) +{ + u64 eui_table[2]; + u64 *p = (u64 *)&manufacturer_sfdp[SFDP_MICROCHIP_EUI_OFFSET]; + int i, ret; + + ret = sst26vf064beui_check(manufacturer_sfdp); + if (ret) + return ret; + + for (i = 0; i < 2; i++) + eui_table[i] = le64_to_cpu(p[i]); + + /* Ethaddr starts at offset one. */ + memcpy(ethaddr, &((u8 *)eui_table)[1], size); + + return 0; +} +#endif + +/** + * at91_spi_nor_set_ethaddr() - Retrieve and set the ethernet address from the + * SPI NOR manufacturer specific SFDP table. + */ +void at91_spi_nor_set_ethaddr(void) +{ + struct udevice *dev; + struct spi_nor *nor; + const char *ethaddr_name = "ethaddr"; + u8 ethaddr[ETH_ADDR_SIZE] = {0}; + + if (env_get(ethaddr_name)) + return; + + if (uclass_first_device_err(UCLASS_SPI_FLASH, &dev)) + return; + + nor = dev_get_uclass_priv(dev); + if (!nor) + return; + + if (!nor->manufacturer_sfdp) + return; + +#ifdef CONFIG_SPI_FLASH_SST + if (sst26vf064beui_get_ethaddr(nor->manufacturer_sfdp, ethaddr, + ETH_ADDR_SIZE)) + return; +#endif + + if (is_valid_ethaddr(ethaddr)) + eth_env_set_enetaddr(ethaddr_name, ethaddr); +} diff --git a/roms/u-boot/board/atmel/common/mac_eeprom.c b/roms/u-boot/board/atmel/common/mac_eeprom.c new file mode 100644 index 000000000..a723ba723 --- /dev/null +++ b/roms/u-boot/board/atmel/common/mac_eeprom.c @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2017 Microchip + * Wenyou Yang <wenyou.yang@microchip.com> + */ + +#include <common.h> +#include <dm.h> +#include <eeprom.h> +#include <env.h> +#include <i2c_eeprom.h> +#include <net.h> +#include <netdev.h> + +int at91_set_ethaddr(int offset) +{ + const int ETH_ADDR_LEN = 6; + unsigned char ethaddr[ETH_ADDR_LEN]; + const char *ETHADDR_NAME = "ethaddr"; + struct udevice *dev; + int ret; + + if (env_get(ETHADDR_NAME)) + return 0; + + ret = uclass_first_device_err(UCLASS_I2C_EEPROM, &dev); + if (ret) + return ret; + + ret = i2c_eeprom_read(dev, offset, ethaddr, 6); + if (ret) + return ret; + + if (is_valid_ethaddr(ethaddr)) + eth_env_set_enetaddr(ETHADDR_NAME, ethaddr); + + return 0; +} + +/* this function will set eth1addr from a second eeprom, if available */ +int at91_set_eth1addr(int offset) +{ + const int ETH_ADDR_LEN = 6; + unsigned char ethaddr[ETH_ADDR_LEN]; + /* configure eth1addr for second interface */ + const char *ETHADDR_NAME = "eth1addr"; + struct udevice *dev; + int ret; + + if (env_get(ETHADDR_NAME)) + return 0; + + /* first eeprom is retrieved, this is for the first interface */ + ret = uclass_first_device_err(UCLASS_I2C_EEPROM, &dev); + if (ret) + return ret; + + /* attempt to obtain a second eeprom device */ + ret = uclass_next_device(&dev); + if (ret) + return ret; + + ret = i2c_eeprom_read(dev, offset, ethaddr, 6); + if (ret) + return ret; + + if (is_valid_ethaddr(ethaddr)) + eth_env_set_enetaddr(ETHADDR_NAME, ethaddr); + + return 0; +} diff --git a/roms/u-boot/board/atmel/common/video_display.c b/roms/u-boot/board/atmel/common/video_display.c new file mode 100644 index 000000000..a5049f4aa --- /dev/null +++ b/roms/u-boot/board/atmel/common/video_display.c @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2017 Microchip + * Wenyou Yang <wenyou.yang@microchip.com> + */ + +#include <common.h> +#include <atmel_lcd.h> +#include <dm.h> +#include <init.h> +#include <nand.h> +#include <version.h> +#include <video.h> +#include <video_console.h> +#include <vsprintf.h> +#include <asm/global_data.h> +#include <asm/io.h> +#include <asm/arch/clk.h> + +DECLARE_GLOBAL_DATA_PTR; + +int at91_video_show_board_info(void) +{ + struct vidconsole_priv *priv; + ulong dram_size, nand_size; + int i; + u32 len = 0; + char buf[255]; + char *corp = "Microchip Technology Inc.\n"; + char temp[32]; + struct udevice *dev, *con; + const char *s; + vidinfo_t logo_info; + int ret; + + len += sprintf(&buf[len], "%s\n", U_BOOT_VERSION); + memcpy(&buf[len], corp, strlen(corp)); + len += strlen(corp); + len += sprintf(&buf[len], "%s CPU at %s MHz\n", get_cpu_name(), + strmhz(temp, get_cpu_clk_rate())); + + dram_size = 0; + for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) + dram_size += gd->bd->bi_dram[i].size; + + nand_size = 0; +#ifdef CONFIG_NAND_ATMEL + for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++) + nand_size += get_nand_dev_by_index(i)->size; +#endif + + len += sprintf(&buf[len], "%ld MB SDRAM, %ld MB NAND\n", + dram_size >> 20, nand_size >> 20); + + ret = uclass_get_device(UCLASS_VIDEO, 0, &dev); + if (ret) + return ret; + + microchip_logo_info(&logo_info); + ret = video_bmp_display(dev, logo_info.logo_addr, + logo_info.logo_x_offset, + logo_info.logo_y_offset, false); + if (ret) + return ret; + + ret = uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con); + if (ret) + return ret; + + priv = dev_get_uclass_priv(con); + vidconsole_position_cursor(con, 0, (logo_info.logo_height + + priv->y_charsize - 1) / priv->y_charsize); + for (s = buf, i = 0; i < len; s++, i++) + vidconsole_put_char(con, *s); + + return 0; +} |