diff options
| author | fishsoupisgood <github@madingley.org> | 2019-04-29 01:17:54 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 03:43:43 +0100 | 
| commit | 3f2546b2ef55b661fd8dd69682b38992225e86f6 (patch) | |
| tree | 65ca85f13617aee1dce474596800950f266a456c /roms/u-boot/board/earthlcd | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip  | |
Diffstat (limited to 'roms/u-boot/board/earthlcd')
| -rw-r--r-- | roms/u-boot/board/earthlcd/favr-32-ezkit/Makefile | 9 | ||||
| -rw-r--r-- | roms/u-boot/board/earthlcd/favr-32-ezkit/favr-32-ezkit.c | 96 | ||||
| -rw-r--r-- | roms/u-boot/board/earthlcd/favr-32-ezkit/flash.c | 216 | 
3 files changed, 321 insertions, 0 deletions
diff --git a/roms/u-boot/board/earthlcd/favr-32-ezkit/Makefile b/roms/u-boot/board/earthlcd/favr-32-ezkit/Makefile new file mode 100644 index 00000000..f712ab9c --- /dev/null +++ b/roms/u-boot/board/earthlcd/favr-32-ezkit/Makefile @@ -0,0 +1,9 @@ +# +# (C) Copyright 2001-2006 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# Copyright (C) 2008 Atmel Corporation +# +# SPDX-License-Identifier:	GPL-2.0+ + +obj-y	:= favr-32-ezkit.o flash.o diff --git a/roms/u-boot/board/earthlcd/favr-32-ezkit/favr-32-ezkit.c b/roms/u-boot/board/earthlcd/favr-32-ezkit/favr-32-ezkit.c new file mode 100644 index 00000000..a74547bf --- /dev/null +++ b/roms/u-boot/board/earthlcd/favr-32-ezkit/favr-32-ezkit.c @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2008 Atmel Corporation + * + * SPDX-License-Identifier:	GPL-2.0+ + */ +#include <common.h> +#include <netdev.h> + +#include <asm/io.h> +#include <asm/sdram.h> +#include <asm/arch/clk.h> +#include <asm/arch/hmatrix.h> +#include <asm/arch/mmu.h> +#include <asm/arch/portmux.h> + +DECLARE_GLOBAL_DATA_PTR; + +struct mmu_vm_range mmu_vmr_table[CONFIG_SYS_NR_VM_REGIONS] = { +	{ +		.virt_pgno	= CONFIG_SYS_FLASH_BASE >> PAGE_SHIFT, +		.nr_pages	= CONFIG_SYS_FLASH_SIZE >> PAGE_SHIFT, +		.phys		= (CONFIG_SYS_FLASH_BASE >> PAGE_SHIFT) +					| MMU_VMR_CACHE_NONE, +	}, { +		.virt_pgno	= CONFIG_SYS_SDRAM_BASE >> PAGE_SHIFT, +		.nr_pages	= EBI_SDRAM_SIZE >> PAGE_SHIFT, +		.phys		= (CONFIG_SYS_SDRAM_BASE >> PAGE_SHIFT) +					| MMU_VMR_CACHE_WRBACK, +	}, +}; + +static const struct sdram_config sdram_config = { +	/* MT48LC4M32B2P-6 (16 MB) */ +	.data_bits	= SDRAM_DATA_32BIT, +	.row_bits	= 12, +	.col_bits	= 8, +	.bank_bits	= 2, +	.cas		= 3, +	.twr		= 2, +	.trc		= 7, +	.trp		= 2, +	.trcd		= 2, +	.tras		= 5, +	.txsr		= 5, +	/* 15.6 us */ +	.refresh_period	= (156 * (SDRAMC_BUS_HZ / 1000)) / 10000, +}; + +int board_early_init_f(void) +{ +	/* Enable SDRAM in the EBI mux */ +	hmatrix_slave_write(EBI, SFR, HMATRIX_BIT(EBI_SDRAM_ENABLE)); + +	portmux_enable_ebi(32, 23, 0, PORTMUX_DRIVE_HIGH); +	portmux_enable_usart3(PORTMUX_DRIVE_MIN); +#if defined(CONFIG_MACB) +	portmux_enable_macb0(PORTMUX_MACB_MII, PORTMUX_DRIVE_HIGH); +#endif +#if defined(CONFIG_MMC) +	portmux_enable_mmci(0, PORTMUX_MMCI_4BIT, PORTMUX_DRIVE_LOW); +#endif + +	return 0; +} + +phys_size_t initdram(int board_type) +{ +	unsigned long expected_size; +	unsigned long actual_size; +	void *sdram_base; + +	sdram_base = uncached(EBI_SDRAM_BASE); + +	expected_size = sdram_init(sdram_base, &sdram_config); +	actual_size = get_ram_size(sdram_base, expected_size); + +	if (expected_size != actual_size) +		printf("Warning: Only %lu of %lu MiB SDRAM is working\n", +				actual_size >> 20, expected_size >> 20); + +	return actual_size; +} + +int board_early_init_r(void) +{ +	gd->bd->bi_phy_id[0] = 0x01; +	return 0; +} + +#if defined(CONFIG_MACB) && defined(CONFIG_CMD_NET) +int board_eth_init(bd_t *bi) +{ +	return macb_eth_initialize(0, (void *)ATMEL_BASE_MACB0, +		bi->bi_phy_id[0]); +} +#endif diff --git a/roms/u-boot/board/earthlcd/favr-32-ezkit/flash.c b/roms/u-boot/board/earthlcd/favr-32-ezkit/flash.c new file mode 100644 index 00000000..e45c6f4d --- /dev/null +++ b/roms/u-boot/board/earthlcd/favr-32-ezkit/flash.c @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2008 Atmel Corporation + * + * SPDX-License-Identifier:	GPL-2.0+ + */ +#include <common.h> + +#ifdef CONFIG_FAVR32_EZKIT_EXT_FLASH +#include <asm/arch/cacheflush.h> +#include <asm/io.h> +#include <asm/sections.h> + +DECLARE_GLOBAL_DATA_PTR; + +flash_info_t flash_info[1]; + +static void flash_identify(uint16_t *flash, flash_info_t *info) +{ +	unsigned long flags; + +	flags = disable_interrupts(); + +	dcache_flush_unlocked(); + +	writew(0xaa, flash + 0x555); +	writew(0x55, flash + 0xaaa); +	writew(0x90, flash + 0x555); +	info->flash_id = readl(flash); +	writew(0xff, flash); + +	readw(flash); + +	if (flags) +		enable_interrupts(); +} + +unsigned long flash_init(void) +{ +	unsigned long addr; +	unsigned int i; + +	flash_info[0].size = CONFIG_SYS_FLASH_SIZE; +	flash_info[0].sector_count = 135; + +	flash_identify(uncached((void *)CONFIG_SYS_FLASH_BASE), &flash_info[0]); + +	for (i = 0, addr = 0; i < 8; i++, addr += 0x2000) +		flash_info[0].start[i] = addr; +	for (; i < flash_info[0].sector_count; i++, addr += 0x10000) +		flash_info[0].start[i] = addr; + +	return CONFIG_SYS_FLASH_SIZE; +} + +void flash_print_info(flash_info_t *info) +{ +	printf("Flash: Vendor ID: 0x%02lx, Product ID: 0x%02lx\n", +	       info->flash_id >> 16, info->flash_id & 0xffff); +	printf("Size: %ld MB in %d sectors\n", +	       info->size >> 10, info->sector_count); +} + +int flash_erase(flash_info_t *info, int s_first, int s_last) +{ +	unsigned long flags; +	unsigned long start_time; +	uint16_t *fb, *sb; +	unsigned int i; +	int ret; +	uint16_t status; + +	if ((s_first < 0) || (s_first > s_last) +	    || (s_last >= info->sector_count)) { +		puts("Error: first and/or last sector out of range\n"); +		return ERR_INVAL; +	} + +	for (i = s_first; i < s_last; i++) +		if (info->protect[i]) { +			printf("Error: sector %d is protected\n", i); +			return ERR_PROTECTED; +		} + +	fb = (uint16_t *)uncached(info->start[0]); + +	dcache_flush_unlocked(); + +	for (i = s_first; (i <= s_last) && !ctrlc(); i++) { +		printf("Erasing sector %3d...", i); + +		sb = (uint16_t *)uncached(info->start[i]); + +		flags = disable_interrupts(); + +		start_time = get_timer(0); + +		/* Unlock sector */ +		writew(0xaa, fb + 0x555); +		writew(0x70, sb); + +		/* Erase sector */ +		writew(0xaa, fb + 0x555); +		writew(0x55, fb + 0xaaa); +		writew(0x80, fb + 0x555); +		writew(0xaa, fb + 0x555); +		writew(0x55, fb + 0xaaa); +		writew(0x30, sb); + +		/* Wait for completion */ +		ret = ERR_OK; +		do { +			/* TODO: Timeout */ +			status = readw(sb); +		} while ((status != 0xffff) && !(status & 0x28)); + +		writew(0xf0, fb); + +		/* +		 * Make sure the command actually makes it to the bus +		 * before we re-enable interrupts. +		 */ +		readw(fb); + +		if (flags) +			enable_interrupts(); + +		if (status != 0xffff) { +			printf("Flash erase error at address 0x%p: 0x%02x\n", +			       sb, status); +			ret = ERR_PROG_ERROR; +			break; +		} +	} + +	if (ctrlc()) +		printf("User interrupt!\n"); + +	return ERR_OK; +} + +int write_buff(flash_info_t *info, uchar *src, +			   ulong addr, ulong count) +{ +	unsigned long flags; +	uint16_t *base, *p, *s, *end; +	uint16_t word, status, status1; +	int ret = ERR_OK; + +	if (addr < info->start[0] +	    || (addr + count) > (info->start[0] + info->size) +	    || (addr + count) < addr) { +		puts("Error: invalid address range\n"); +		return ERR_INVAL; +	} + +	if (addr & 1 || count & 1 || (unsigned int)src & 1) { +		puts("Error: misaligned source, destination or count\n"); +		return ERR_ALIGN; +	} + +	base = (uint16_t *)uncached(info->start[0]); +	end = (uint16_t *)uncached(addr + count); + +	flags = disable_interrupts(); + +	dcache_flush_unlocked(); +	sync_write_buffer(); + +	for (p = (uint16_t *)uncached(addr), s = (uint16_t *)src; +	     p < end && !ctrlc(); p++, s++) { +		word = *s; + +		writew(0xaa, base + 0x555); +		writew(0x55, base + 0xaaa); +		writew(0xa0, base + 0x555); +		writew(word, p); + +		sync_write_buffer(); + +		/* Wait for completion */ +		status1 = readw(p); +		do { +			/* TODO: Timeout */ +			status = status1; +			status1 = readw(p); +		} while (((status ^ status1) & 0x40)	/* toggled */ +			 && !(status1 & 0x28));		/* error bits */ + +		/* +		 * We'll need to check once again for toggle bit +		 * because the toggle bit may stop toggling as I/O5 +		 * changes to "1" (ref at49bv642.pdf p9) +		 */ +		status1 = readw(p); +		status = readw(p); +		if ((status ^ status1) & 0x40) { +			printf("Flash write error at address 0x%p: " +			       "0x%02x != 0x%02x\n", +			       p, status,word); +			ret = ERR_PROG_ERROR; +			writew(0xf0, base); +			readw(base); +			break; +		} + +		writew(0xf0, base); +		readw(base); +	} + +	if (flags) +		enable_interrupts(); + +	return ret; +} + +#endif /* CONFIG_FAVR32_EZKIT_EXT_FLASH */  | 
