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

📄 integratorap.c

📁 UBOOT 源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	*(volatile unsigned short *) (V3_BASE + V3_PCI_CFG) |=		V3_PCI_CFG_M_RETRY_EN;	/* Set up any V3 PCI Configuration Registers that we absolutely have to */	/* LB_CFG controls Local Bus protocol. */	/* Enable LocalBus byte strobes for READ accesses too. */	/* set bit 7 BE_IMODE and bit 6 BE_OMODE */	*(volatile unsigned short *) (V3_BASE + V3_LB_CFG) |= 0x0C0;	/* PCI_CMD controls overall PCI operation. */	/* Enable PCI bus master. */	*(volatile unsigned short *) (V3_BASE + V3_PCI_CMD) |= 0x04;	/* PCI_MAP0 controls where the PCI to CPU memory window is on Local Bus */	*(volatile unsigned int *) (V3_BASE + V3_PCI_MAP0) =		(INTEGRATOR_BOOT_ROM_BASE) | (V3_PCI_MAP_M_ADR_SIZE_512M |					      V3_PCI_MAP_M_REG_EN |					      V3_PCI_MAP_M_ENABLE);	/* PCI_BASE0 is the PCI address of the start of the window */	*(volatile unsigned int *) (V3_BASE + V3_PCI_BASE0) =		INTEGRATOR_BOOT_ROM_BASE;	/* PCI_MAP1 is LOCAL address of the start of the window */	*(volatile unsigned int *) (V3_BASE + V3_PCI_MAP1) =		(INTEGRATOR_HDR0_SDRAM_BASE) | (V3_PCI_MAP_M_ADR_SIZE_1024M |						V3_PCI_MAP_M_REG_EN |						V3_PCI_MAP_M_ENABLE);	/* PCI_BASE1 is the PCI address of the start of the window */	*(volatile unsigned int *) (V3_BASE + V3_PCI_BASE1) =		INTEGRATOR_HDR0_SDRAM_BASE;	/* Set up the windows from local bus memory into PCI configuration, */	/* I/O and Memory. */	/* PCI I/O, LB_BASE2 and LB_MAP2 are used exclusively for this. */	*(volatile unsigned short *) (V3_BASE + V3_LB_BASE2) =		((CPU_PCI_IO_ADRS >> 24) << 8) | V3_LB_BASE_M_ENABLE;	*(volatile unsigned short *) (V3_BASE + V3_LB_MAP2) = 0;	/* PCI Configuration, use LB_BASE1/LB_MAP1. */	/* PCI Memory use LB_BASE0/LB_MAP0 and LB_BASE1/LB_MAP1 */	/* Map first 256Mbytes as non-prefetchable via BASE0/MAP0 */	/* (INTEGRATOR_PCI_BASE == PCI_MEM_BASE) */	*(volatile unsigned int *) (V3_BASE + V3_LB_BASE0) =		INTEGRATOR_PCI_BASE | (0x80 | V3_LB_BASE_M_ENABLE);	*(volatile unsigned short *) (V3_BASE + V3_LB_MAP0) =		((INTEGRATOR_PCI_BASE >> 20) << 0x4) | 0x0006;	/* Map second 256 Mbytes as prefetchable via BASE1/MAP1 */	*(volatile unsigned int *) (V3_BASE + V3_LB_BASE1) =		INTEGRATOR_PCI_BASE | (0x84 | V3_LB_BASE_M_ENABLE);	*(volatile unsigned short *) (V3_BASE + V3_LB_MAP1) =		(((INTEGRATOR_PCI_BASE + 0x10000000) >> 20) << 4) | 0x0006;	/* Allow accesses to PCI Configuration space */	/* and set up A1, A0 for type 1 config cycles */	*(volatile unsigned short *) (V3_BASE + V3_PCI_CFG) =		((*(volatile unsigned short *) (V3_BASE + V3_PCI_CFG)) &		 ~(V3_PCI_CFG_M_RETRY_EN | V3_PCI_CFG_M_AD_LOW1)) |		V3_PCI_CFG_M_AD_LOW0;	/* now we can allow in PCI MEMORY accesses */	*(volatile unsigned short *) (V3_BASE + V3_PCI_CMD) =		(*(volatile unsigned short *) (V3_BASE + V3_PCI_CMD)) |		V3_COMMAND_M_MEM_EN;	/* Set RST_OUT to take the PCI bus is out of reset, PCI devices can */	/* initialise and lock the V3 system register so that no one else */	/* can play with it */	*(volatile unsigned short *) (V3_BASE + V3_SYSTEM) =		(*(volatile unsigned short *) (V3_BASE + V3_SYSTEM)) |		V3_SYSTEM_M_RST_OUT;	*(volatile unsigned short *) (V3_BASE + V3_SYSTEM) =		(*(volatile unsigned short *) (V3_BASE + V3_SYSTEM)) |		V3_SYSTEM_M_LOCK;	/*	 * Register the hose	 */	hose->first_busno = 0;	hose->last_busno = 0xff;	/* System memory space */	pci_set_region (hose->regions + 0,			0x00000000, 0x40000000, 0x01000000,			PCI_REGION_MEM | PCI_REGION_MEMORY);	/* PCI Memory - config space */	pci_set_region (hose->regions + 1,			0x00000000, 0x62000000, 0x01000000, PCI_REGION_MEM);	/* PCI V3 regs */	pci_set_region (hose->regions + 2,			0x00000000, 0x61000000, 0x00080000, PCI_REGION_MEM);	/* PCI I/O space */	pci_set_region (hose->regions + 3,			0x00000000, 0x60000000, 0x00010000, PCI_REGION_IO);	pci_set_ops (hose,		     pci_integrator_read_byte,		     pci_integrator_read__word,		     pci_integrator_read_dword,		     pci_integrator_write_byte,		     pci_integrator_write_word, pci_integrator_write_dword);	hose->region_count = 4;	pci_register_hose (hose);	pciauto_config_init (hose);	pciauto_config_device (hose, 0);	hose->last_busno = pci_hose_scan (hose);}#endif/****************************** Routine: Description:******************************/void flash__init (void){}/************************************************************* Routine:ether__init Description: take the Ethernet controller out of reset and wait			   for the EEPROM load to complete.*************************************************************/void ether__init (void){}/****************************** Routine: Description:******************************/int dram_init (void){	gd->bd->bi_dram[0].start = PHYS_SDRAM_1;	gd->bd->bi_dram[0].size	 = PHYS_SDRAM_1_SIZE;#ifdef CONFIG_CM_SPD_DETECT	{extern void dram_query(void);	unsigned long cm_reg_sdram;	unsigned long sdram_shift;	dram_query();	/* Assembler accesses to CM registers */			/* Queries the SPD values	      */	/* Obtain the SDRAM size from the CM SDRAM register */	cm_reg_sdram = *(volatile ulong *)(CM_BASE + OS_SDRAM);	/*   Register	      SDRAM size	 *	 *   0xXXXXXXbbb000bb	 16 MB	 *   0xXXXXXXbbb001bb	 32 MB	 *   0xXXXXXXbbb010bb	 64 MB	 *   0xXXXXXXbbb011bb	128 MB	 *   0xXXXXXXbbb100bb	256 MB	 *	 */	sdram_shift		 = ((cm_reg_sdram & 0x0000001C)/4)%4;	gd->bd->bi_dram[0].size	 = 0x01000000 << sdram_shift;	}#endif /* CM_SPD_DETECT */	return 0;}/* The Integrator/AP timer1 is clocked at 24MHz * can be divided by 16 or 256 * and is a 16-bit counter *//* U-Boot expects a 32 bit timer running at CFG_HZ*/static ulong timestamp;		/* U-Boot ticks since startup	      */static ulong total_count = 0;	/* Total timer count		      */static ulong lastdec;		/* Timer reading at last call	      */static ulong div_clock	 = 256; /* Divisor applied to the timer clock */static ulong div_timer	 = 1;	/* Divisor to convert timer reading				 * change to U-Boot ticks				 *//* CFG_HZ = CFG_HZ_CLOCK/(div_clock * div_timer) */#define TIMER_LOAD_VAL 0x0000FFFFL#define READ_TIMER ((*(volatile ulong *)(CFG_TIMERBASE+4)) & 0x0000FFFFL)/* all function return values in U-Boot ticks i.e. (1/CFG_HZ) sec *  - unless otherwise stated *//* starts a counter * - the Integrator/AP timer issues an interrupt *   each time it reaches zero */int interrupt_init (void){	/* Load timer with initial value */	*(volatile ulong *)(CFG_TIMERBASE + 0) = TIMER_LOAD_VAL;	/* Set timer to be	 *	enabled		  1	 *	free-running	  0	 *	XX		 00	 *	divider 256	 10	 *	XX		 00	 */	*(volatile ulong *)(CFG_TIMERBASE + 8) = 0x00000088;	total_count = 0;	/* init the timestamp and lastdec value */	reset_timer_masked();	div_timer  = CFG_HZ_CLOCK / CFG_HZ;	div_timer /= div_clock;	return (0);}/* * timer without interrupts */void reset_timer (void){	reset_timer_masked ();}ulong get_timer (ulong base_ticks){	return get_timer_masked () - base_ticks;}void set_timer (ulong ticks){	timestamp = ticks;	total_count = ticks * div_timer;	reset_timer_masked();}/* delay x useconds */void udelay (unsigned long usec){	ulong tmo, tmp;	/* Convert to U-Boot ticks */	tmo  = usec * CFG_HZ;	tmo /= (1000000L);	tmp  = get_timer_masked();	/* get current timestamp */	tmo += tmp;			/* wake up timestamp	 */	while (get_timer_masked () < tmo) { /* loop till event */		/*NOP*/;	}}void reset_timer_masked (void){	/* reset time */	lastdec	  = READ_TIMER; /* capture current decrementer value   */	timestamp = 0;		/* start "advancing" time stamp from 0 */}/* converts the timer reading to U-Boot ticks	       *//* the timestamp is the number of ticks since reset    *//* This routine does not detect wraps unless called regularly   ASSUMES a call at least every 16 seconds to detect every reload */ulong get_timer_masked (void){	ulong now = READ_TIMER;		/* current count */	if (now > lastdec) {		/* Must have wrapped */		total_count += lastdec + TIMER_LOAD_VAL + 1 - now;	} else {		total_count += lastdec - now;	}	lastdec	  = now;	timestamp = total_count/div_timer;	return timestamp;}/* waits specified delay value and resets timestamp */void udelay_masked (unsigned long usec){	udelay(usec);}/* * This function is derived from PowerPC code (read timebase as long long). * On ARM it just returns the timer value. */unsigned long long get_ticks(void){	return get_timer(0);}/* * Return the timebase clock frequency * i.e. how often the timer decrements */ulong get_tbclk (void){	return CFG_HZ_CLOCK/div_clock;}

⌨️ 快捷键说明

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