⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init.s

📁 uboot详细解读可用启动引导LINUX2.6内核
💻 S
字号:
/*------------------------------------------------------------------------------+ * *	 This souce code has been made available to you by EuroDesign *	 (www.eurodsn.de). It's based on the original IBM source code, so *	 this follows: * *	 This source code has been made available to you by IBM on an AS-IS *	 basis.  Anyone receiving this source is licensed under IBM *	 copyrights to use it in any way he or she deems fit, including *	 copying it, modifying it, compiling it, and redistributing it either *	 with or without modifications.  No license under IBM patents or *	 patent applications is to be implied by the copyright license. * *	 Any user of this software should understand that IBM cannot provide *	 technical support for this software and will not be responsible for *	 any consequences resulting from the use of this software. * *	 Any person who transfers this source code or any derivative work *	 must include the IBM copyright notice, this paragraph, and the *	 preceding two paragraphs in the transferred software. * *	 COPYRIGHT   I B M   CORPORATION 1995 *	 LICENSED MATERIAL  -  PROGRAM PROPERTY OF I B M *------------------------------------------------------------------------------- */#include <config.h>#include <ppc4xx.h>#define _LINUX_CONFIG_H 1	/* avoid reading Linux autoconf.h file	*/#include <ppc_asm.tmpl>#include <ppc_defs.h>#include <asm/cache.h>#include <asm/mmu.h>/** * ext_bus_cntlr_init - Initializes the External Bus Controller for the external peripherals * * IMPORTANT: For pass1 this code must run from cache since you can not * reliably change a peripheral banks timing register (pbxap) while running * code from that bank. For ex., since we are running from ROM on bank 0, we * can NOT execute the code that modifies bank 0 timings from ROM, so * we run it from cache. * * Bank 0 - Boot-Flash * Bank 1 - NAND-Flash * Bank 2 - ISA bus * Bank 3 - Second Flash * Bank 4 - USB controller */	.globl ext_bus_cntlr_initext_bus_cntlr_init:/* * We need the current boot up configuration to set correct * timings into internal flash and external flash */		mfdcr r24,strap			/* xxxx xxxx xxxx xxx? ?xxx xxxx xxxx xxxx						   0 0 -> 8 bit external ROM						   0 1 -> 16 bit internal ROM */		addi r4,0,2		srw r24,r24,r4				/* shift right r24 two positions */		andi. r24,r24,0x06000/* * All calculations are based on 33MHz EBC clock. * * First, create a "very slow" timing (~250ns) with burst mode enabled * This is need for the external flash access */		lis r25,0x0800		ori r25,r25,0x0280			/* 0000 1000 0xxx 0000 0000 0010 100x xxxx = 0x03800280/* * Second, create a fast timing: * 90ns first cycle - 3 clock access * and 90ns burst cycle, plus 1 clock after the last access * This is used for the internal access */		lis r26,0x8900		ori r26,r26,0x0280			/* 1000 1001 0xxx 0000 0000 0010 100x xxxx/* * We can't change settings on CS# if we currently use them. * -> load a few instructions into cache and run this code from cache */		mflr r4					/* save link register */		bl ..getAddr..getAddr:		mflr r3					/* get address of ..getAddr */		mtlr r4					/* restore link register */		addi r4,0,14				/* set ctr to 10; used to prefetch */		mtctr r4				/* 10 cache lines to fit this function							in cache (gives us 8x10=80 instructions) */..ebcloop:		icbt r0,r3				/* prefetch cache line for addr in r3 */		addi r3,r3,32				/* move to next cache line */		bdnz ..ebcloop				/* continue for 10 cache lines *//* * Delay to ensure all accesses to ROM are complete before changing * bank 0 timings. 200usec should be enough. * 200,000,000 (cycles/sec) X .000200 (sec) = 0x9C40 cycles */		lis r3,0x0		ori r3,r3,0xA000			/* ensure 200usec have passed since reset */		mtctr r3..spinlp:		bdnz ..spinlp				/* spin loop *//*----------------------------------------------------------------------- * Memory Bank 0 (BOOT-ROM) initialization * 0xFFEF00000....0xFFFFFFF * We only have to change the timing. Mapping is ok by boot-strapping *----------------------------------------------------------------------- */		li r4,pb0ap				/* PB0AP=Peripheral Bank 0 Access Parameters */		mtdcr ebccfga,r4		mr r4,r26				/* assume internal fast flash is boot flash */		cmpwi r24,0x2000			/* assumption true? ... */		beq 1f					/* ...yes! */		mr r4,r25				/* ...no, use the slow variant */		mr r25,r26				/* use this for the other flash */1:		mtdcr ebccfgd,r4			/* change timing now */		li r4,pb0cr				/* PB0CR=Peripheral Bank 0 Control Register */		mtdcr ebccfga,r4		mfdcr r4,ebccfgd		lis r3,0x0001		ori r3,r3,0x8000			/* allow reads and writes */		or r4,r4,r3		mtdcr ebccfgd,r4/*----------------------------------------------------------------------- * Memory Bank 3 (Second-Flash) initialization * 0xF0000000...0xF01FFFFF -> 2MB *----------------------------------------------------------------------- */		li r4,pb3ap				/* Peripheral Bank 1 Access Parameter */		mtdcr ebccfga,r4		mtdcr ebccfgd,r2			/* change timing */		li r4,pb3cr				/* Peripheral Bank 1 Configuration Registers */		mtdcr ebccfga,r4		lis r4,0xF003		ori r4,r4,0x8000/* * Consider boot configuration */		xori r24,r24,0x2000			/* invert current bus width */		or r4,r4,r24		mtdcr ebccfgd,r4/*----------------------------------------------------------------------- * Memory Bank 1 (NAND-Flash) initialization * 0x77D00000...0x77DFFFFF -> 1MB * - the write/read pulse to the NAND can be as short as 25ns, bus the cycle time is always 50ns * - the setup time is 0ns * - the hold time is 15ns * -> *   - TWT = 0 *   - CSN = 0 *   - OEN = 0 *   - WBN = 0 *   - WBF = 0 *   - TH  = 1 * ----> 2 clocks per cycle = 60ns cycle (30ns active, 30ns hold) *----------------------------------------------------------------------- */		li r4,pb1ap				/* Peripheral Bank 1 Access Parameter */		mtdcr ebccfga,r4		lis r4,0x0000		ori r4,r4,0x0200		mtdcr ebccfgd,r4		li r4,pb1cr				/* Peripheral Bank 1 Configuration Registers */		mtdcr ebccfga,r4		lis r4,0x77D1		ori r4,r4,0x8000		mtdcr ebccfgd,r4/* USB init (without acceleration) */#ifndef CONFIG_ISP1161_PRESENT		li r4,pb4ap				/* PB4AP=Peripheral Bank 4 Access Parameters */		mtdcr ebccfga,r4		lis r4,0x0180		ori r4,r4,0x5940		mtdcr ebccfgd,r4#endif/*----------------------------------------------------------------------- * Memory Bank 2 (ISA Access) initialization (plus memory bank 6 and 7) * 0x78000000...0x7BFFFFFF -> 64 MB * Wir arbeiten bei 33 MHz -> 30ns *----------------------------------------------------------------------- A7 (ppc notation) or A24 (standard notation) decides about the type of access: A7/A24=0 -> memory cycle A7/ /A24=1 -> I/O cycle*/		li r4,pb2ap				/* PB2AP=Peripheral Bank 2 Access Parameters */		mtdcr ebccfga,r4/* We emulate an ISA access 1. Address active 2. wait 0 EBC clocks -> CSN=0 3. set CS# 4. wait 0 EBC clock -> OEN/WBN=0 5. set OE#/WE# 6. wait 4 clocks (ca. 90ns) and for Ready signal 7. hold for 4 clocks -> TH=4*/#if 1/* faster access to isa-bus */		lis r4,0x0180		ori r4,r4,0x5940#else		lis r4,0x0100		ori r4,r4,0x0340#endif		mtdcr ebccfgd,r4#ifdef IDE_USES_ISA_EMULATION		li r25,pb5ap				/* PB5AP=Peripheral Bank 5 Access Parameters */		mtdcr ebccfga,r25		mtdcr ebccfgd,r4#endif		li r25,pb6ap				/* PB6AP=Peripheral Bank 6 Access Parameters */		mtdcr ebccfga,r25		mtdcr ebccfgd,r4		li r25,pb7ap				/* PB7AP=Peripheral Bank 7 Access Parameters */		mtdcr ebccfga,r25		mtdcr ebccfgd,r4		li r25,pb2cr				/* PB2CR=Peripheral Bank 2 Configuration Register */		mtdcr ebccfga,r25		lis r4,0x780B		ori r4,r4,0xA000		mtdcr ebccfgd,r4/* * the other areas are only 1MiB in size */		lis r4,0x7401		ori r4,r4,0xA000		li r25,pb6cr				/* PB6CR=Peripheral Bank 6 Configuration Register */		mtdcr ebccfga,r25		lis r4,0x7401		ori r4,r4,0xA000		mtdcr ebccfgd,r4		li r25,pb7cr				/* PB7CR=Peripheral Bank 7 Configuration Register */		mtdcr ebccfga,r25		lis r4,0x7411		ori r4,r4,0xA000		mtdcr ebccfgd,r4#ifndef CONFIG_ISP1161_PRESENT		li r25,pb4cr				/* PB4CR=Peripheral Bank 4 Configuration Register */		mtdcr ebccfga,r25		lis r4,0x7421		ori r4,r4,0xA000		mtdcr ebccfgd,r4#endif#ifdef IDE_USES_ISA_EMULATION		li r25,pb5cr				/* PB5CR=Peripheral Bank 5 Configuration Register */		mtdcr ebccfga,r25		lis r4,0x0000		ori r4,r4,0x0000		mtdcr ebccfgd,r4#endif/*----------------------------------------------------------------------- * Memory bank 4: USB controller Philips ISP6111 * 0x77C00000 ... 0x77CFFFFF * * The chip is connected to: * - CPU CS#4 * - CPU IRQ#2 * - CPU DMA 3 * * Timing: * - command to first data: 300ns. Software must ensure this timing! * - Write pulse: 26ns * - Read pulse: 33ns * - read cycle time: 150ns * - write cycle time: 140ns * * Note: All calculations are based on 33MHz EBC clock. One '#' or '_' is 30ns * *			  |- 300ns --| *		  |---- 420ns ---|---- 420ns ---| cycle * CS ############:###____#######:###____####### * OE ############:####___#######:####___####### * WE ############:####__########:####__######## * * ----> 2 clocks RD/WR pulses: 60ns * ----> CSN: 3 clock, 90ns * ----> OEN: 1 clocks (read cycle) * ----> WBN: 1 clocks (write cycle) * ----> WBE: 2 clocks * ----> TH: 7 clock, 210ns * ----> TWT: 7 clocks *----------------------------------------------------------------------- */#ifdef CONFIG_ISP1161_PRESENT		li r4,pb4ap				/* PB4AP=Peripheral Bank 4 Access Parameters */		mtdcr ebccfga,r4		lis r4,0x030D		ori r4,r4,0x5E80		mtdcr ebccfgd,r4		li r4,pb4cr				/* PB2CR=Peripheral Bank 4 Configuration Register */		mtdcr ebccfga,r4		lis r4,0x77C1		ori r4,r4,0xA000		mtdcr ebccfgd,r4#endif#ifndef IDE_USES_ISA_EMULATION/*----------------------------------------------------------------------- * Memory Bank 5 used for IDE access * * Timings for IDE Interface * * SETUP / LENGTH / HOLD - cycles valid for 33.3 MHz clk -> 30ns cycle time *  70		165		30		PIO-Mode 0, [ns] *   3		  6		 1		[Cycles] ----> AP=0x040C0200 *  50		125		20	   PIO-Mode 1, [ns] *   2		  5		 1		[Cycles] ----> AP=0x03080200 *  30		100		15	   PIO-Mode 2, [ns] *   1		  4		 1		[Cycles] ----> AP=0x02040200 *  30		 80		10	   PIO-Mode 3, [ns] *   1		  3		 1		[Cycles] ----> AP=0x01840200 *  25		 70		10	   PIO-Mode 4, [ns] *   1		  3		 1		[Cycles] ----> AP=0x01840200 * *----------------------------------------------------------------------- */		li r4,pb5ap		mtdcr ebccfga,r4		lis r4,0x040C		ori r4,r4,0x0200		mtdcr ebccfgd,r4		li r4,pb5cr			/* PB2CR=Peripheral Bank 2 Configuration Register */		mtdcr ebccfga,r4		lis r4,0x7A01		ori r4,r4,0xA000		mtdcr ebccfgd,r4#endif/* * External Peripheral Control Register */		li r4,epcr		mtdcr ebccfga,r4		lis r4,0xB84E		ori r4,r4,0xF000		mtdcr ebccfgd,r4/* * drive POST code */		lis r4,0x7900		ori r4,r4,0x0080		li r3,0x0001		stb r3,0(r4)			/* 01 -> external bus controller is initialized */		nop				/* pass2 DCR errata #8 */		blr

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -