📄 uboot-20061030-qt2410.patch
字号:
This patch adds 'board' support for the Armzone QT2410development board to u-boot.Signed-off-by: Harald Welte <laforge@openmoko.org>Index: u-boot/Makefile===================================================================--- u-boot.orig/Makefile+++ u-boot/Makefile@@ -2172,6 +2172,9 @@ sbc2410x_config: unconfig @$(MKCONFIG) $(@:_config=) arm arm920t sbc2410x NULL s3c24x0 +qt2410_config : unconfig+ @./mkconfig $(@:_config=) arm arm920t qt2410 NULL s3c24x0+ scb9328_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t scb9328 NULL imx Index: u-boot/board/qt2410/Makefile===================================================================--- /dev/null+++ u-boot/board/qt2410/Makefile@@ -0,0 +1,47 @@+#+# (C) Copyright 2000, 2001, 2002+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.+#+# See file CREDITS for list of people who contributed to this+# project.+#+# This program is free software; you can redistribute it and/or+# modify it under the terms of the GNU General Public License as+# published by the Free Software Foundation; either version 2 of+# the License, or (at your option) any later version.+#+# This program is distributed in the hope that it will be useful,+# but WITHOUT ANY WARRANTY; without even the implied warranty of+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+# GNU General Public License for more details.+#+# You should have received a copy of the GNU General Public License+# along with this program; if not, write to the Free Software+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,+# MA 02111-1307 USA+#++include $(TOPDIR)/config.mk++LIB = lib$(BOARD).a++OBJS := qt2410.o flash.o+SOBJS := lowlevel_init.o++$(LIB): $(OBJS) $(SOBJS)+ $(AR) crv $@ $(OBJS) $(SOBJS)++clean:+ rm -f $(SOBJS) $(OBJS)++distclean: clean+ rm -f $(LIB) core *.bak .depend++#########################################################################++.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)+ $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@++-include .depend++#########################################################################Index: u-boot/board/qt2410/config.mk===================================================================--- /dev/null+++ u-boot/board/qt2410/config.mk@@ -0,0 +1,29 @@+#+# (C) Copyright 2002+# Gary Jennejohn, DENX Software Engineering, <gj@denx.de>+# David Mueller, ELSOFT AG, <d.mueller@elsoft.ch>+#+# SAMSUNG SMDK2410 board with S3C2410X (ARM920T) cpu+#+# see http://www.samsung.com/ for more information on SAMSUNG+#++CONFIG_USB_DFU_VENDOR=0x1457+CONFIG_USB_DFU_PRODUCT=0x511d+CONFIG_USB_DFU_REVISION=0x0100++#+# SMDK2410 has 1 bank of 64 MB DRAM+#+# 3000'0000 to 3400'0000+#+# Linux-Kernel is expected to be at 3000'8000, entry 3000'8000+# optionally with a ramdisk at 3080'0000+#+# we load ourself to 33F8'0000+#+# download area is 3300'0000+#+++TEXT_BASE = 0x33F80000Index: u-boot/board/qt2410/flash.c===================================================================--- /dev/null+++ u-boot/board/qt2410/flash.c@@ -0,0 +1,435 @@+/*+ * (C) Copyright 2002+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>+ * Alex Zuepke <azu@sysgo.de>+ *+ * See file CREDITS for list of people who contributed to this+ * project.+ *+ * This program is free software; you can redistribute it and/or+ * modify it under the terms of the GNU General Public License as+ * published by the Free Software Foundation; either version 2 of+ * the License, or (at your option) any later version.+ *+ * This program is distributed in the hope that it will be useful,+ * but WITHOUT ANY WARRANTY; without even the implied warranty of+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ * GNU General Public License for more details.+ *+ * You should have received a copy of the GNU General Public License+ * along with this program; if not, write to the Free Software+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,+ * MA 02111-1307 USA+ */++#include <common.h>++ulong myflush (void);+++#define FLASH_BANK_SIZE PHYS_FLASH_SIZE+#define MAIN_SECT_SIZE 0x10000 /* 64 KB */++flash_info_t flash_info[CFG_MAX_FLASH_BANKS];+++#define CMD_READ_ARRAY 0x000000F0+#define CMD_UNLOCK1 0x000000AA+#define CMD_UNLOCK2 0x00000055+#define CMD_ERASE_SETUP 0x00000080+#define CMD_ERASE_CONFIRM 0x00000030+#define CMD_PROGRAM 0x000000A0+#define CMD_UNLOCK_BYPASS 0x00000020++#define MEM_FLASH_ADDR1 (*(volatile u16 *)(CFG_FLASH_BASE + (0x00000555 << 1)))+#define MEM_FLASH_ADDR2 (*(volatile u16 *)(CFG_FLASH_BASE + (0x000002AA << 1)))++#define BIT_ERASE_DONE 0x00000080+#define BIT_RDY_MASK 0x00000080+#define BIT_PROGRAM_ERROR 0x00000020+#define BIT_TIMEOUT 0x80000000 /* our flag */++#define READY 1+#define ERR 2+#define TMO 4++/*-----------------------------------------------------------------------+ */++ulong flash_init (void)+{+ int i, j;+ ulong size = 0;++ for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {+ ulong flashbase = 0;++ flash_info[i].flash_id =+#if defined(CONFIG_AMD_LV400)+ (AMD_MANUFACT & FLASH_VENDMASK) |+ (AMD_ID_LV400B & FLASH_TYPEMASK);+#elif defined(CONFIG_AMD_LV800)+ (AMD_MANUFACT & FLASH_VENDMASK) |+ (AMD_ID_LV800B & FLASH_TYPEMASK);+#else+#error "Unknown flash configured"+#endif+ flash_info[i].size = FLASH_BANK_SIZE;+ flash_info[i].sector_count = CFG_MAX_FLASH_SECT;+ memset (flash_info[i].protect, 0, CFG_MAX_FLASH_SECT);+ if (i == 0)+ flashbase = PHYS_FLASH_1;+ else+ panic ("configured too many flash banks!\n");+ for (j = 0; j < flash_info[i].sector_count; j++) {+ if (j <= 3) {+ /* 1st one is 16 KB */+ if (j == 0) {+ flash_info[i].start[j] =+ flashbase + 0;+ }++ /* 2nd and 3rd are both 8 KB */+ if ((j == 1) || (j == 2)) {+ flash_info[i].start[j] =+ flashbase + 0x4000 + (j -+ 1) *+ 0x2000;+ }++ /* 4th 32 KB */+ if (j == 3) {+ flash_info[i].start[j] =+ flashbase + 0x8000;+ }+ } else {+ flash_info[i].start[j] =+ flashbase + (j - 3) * MAIN_SECT_SIZE;+ }+ }+ size += flash_info[i].size;+ }++ flash_protect (FLAG_PROTECT_SET,+ CFG_FLASH_BASE,+ CFG_FLASH_BASE + monitor_flash_len - 1,+ &flash_info[0]);++#if 0+ flash_protect (FLAG_PROTECT_SET,+ CFG_ENV_ADDR,+ CFG_ENV_ADDR + CFG_ENV_SIZE - 1, &flash_info[0]);+#endif++ return size;+}++/*-----------------------------------------------------------------------+ */+void flash_print_info (flash_info_t * info)+{+ int i;++ switch (info->flash_id & FLASH_VENDMASK) {+ case (AMD_MANUFACT & FLASH_VENDMASK):+ printf ("AMD: ");+ break;+ default:+ printf ("Unknown Vendor ");+ break;+ }++ switch (info->flash_id & FLASH_TYPEMASK) {+ case (AMD_ID_LV400B & FLASH_TYPEMASK):+ printf ("1x Amd29LV400BB (4Mbit)\n");+ break;+ case (AMD_ID_LV800B & FLASH_TYPEMASK):+ printf ("1x Amd29LV800BB (8Mbit)\n");+ break;+ default:+ printf ("Unknown Chip Type\n");+ goto Done;+ break;+ }++ printf (" Size: %ld MB in %d Sectors\n",+ info->size >> 20, info->sector_count);++ printf (" Sector Start Addresses:");+ for (i = 0; i < info->sector_count; i++) {+ if ((i % 5) == 0) {+ printf ("\n ");+ }+ printf (" %08lX%s", info->start[i],+ info->protect[i] ? " (RO)" : " ");+ }+ printf ("\n");++ Done:;+}++/*-----------------------------------------------------------------------+ */++int flash_erase (flash_info_t * info, int s_first, int s_last)+{+ ushort result;+ int iflag, cflag, prot, sect;+ int rc = ERR_OK;+ int chip;++ /* first look for protection bits */++ if (info->flash_id == FLASH_UNKNOWN)+ return ERR_UNKNOWN_FLASH_TYPE;++ if ((s_first < 0) || (s_first > s_last)) {+ return ERR_INVAL;+ }++ if ((info->flash_id & FLASH_VENDMASK) !=+ (AMD_MANUFACT & FLASH_VENDMASK)) {+ return ERR_UNKNOWN_FLASH_VENDOR;+ }++ prot = 0;+ for (sect = s_first; sect <= s_last; ++sect) {+ if (info->protect[sect]) {+ prot++;+ }+ }+ if (prot)+ return ERR_PROTECTED;++ /*+ * Disable interrupts which might cause a timeout+ * here. Remember that our exception vectors are+ * at address 0 in the flash, and we don't want a+ * (ticker) exception to happen while the flash+ * chip is in programming mode.+ */+ cflag = icache_status ();+ icache_disable ();+ iflag = disable_interrupts ();++ /* Start erase on unprotected sectors */+ for (sect = s_first; sect <= s_last && !ctrlc (); sect++) {+ printf ("Erasing sector %2d ... ", sect);++ /* arm simple, non interrupt dependent timer */+ reset_timer_masked ();++ if (info->protect[sect] == 0) { /* not protected */+ vu_short *addr = (vu_short *) (info->start[sect]);++ MEM_FLASH_ADDR1 = CMD_UNLOCK1;+ MEM_FLASH_ADDR2 = CMD_UNLOCK2;+ MEM_FLASH_ADDR1 = CMD_ERASE_SETUP;++ MEM_FLASH_ADDR1 = CMD_UNLOCK1;+ MEM_FLASH_ADDR2 = CMD_UNLOCK2;+ *addr = CMD_ERASE_CONFIRM;++ /* wait until flash is ready */+ chip = 0;++ do {+ result = *addr;++ /* check timeout */+ if (get_timer_masked () >+ CFG_FLASH_ERASE_TOUT) {+ MEM_FLASH_ADDR1 = CMD_READ_ARRAY;+ chip = TMO;+ break;+ }++ if (!chip+ && (result & 0xFFFF) & BIT_ERASE_DONE)+ chip = READY;++ if (!chip+ && (result & 0xFFFF) & BIT_PROGRAM_ERROR)+ chip = ERR;++ } while (!chip);++ MEM_FLASH_ADDR1 = CMD_READ_ARRAY;++ if (chip == ERR) {+ rc = ERR_PROG_ERROR;+ goto outahere;+ }+ if (chip == TMO) {+ rc = ERR_TIMOUT;+ goto outahere;+ }++ printf ("ok.\n");+ } else { /* it was protected */++ printf ("protected!\n");+ }+ }++ if (ctrlc ())+ printf ("User Interrupt!\n");++ outahere:+ /* allow flash to settle - wait 10 ms */+ udelay_masked (10000);++ if (iflag)+ enable_interrupts ();++ if (cflag)+ icache_enable ();++ return rc;+}++/*-----------------------------------------------------------------------+ * Copy memory to flash+ */++volatile static int write_hword (flash_info_t * info, ulong dest, ushort data)+{+ vu_short *addr = (vu_short *) dest;+ ushort result;+ int rc = ERR_OK;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -