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

📄 sysalib.s

📁 VxWorks下 Mv2100的BSP源码
💻 S
📖 第 1 页 / 共 2 页
字号:
/* sysALib.s - Motorola MVME2100 system-dependent assembly routines *//* Copyright 1984-2000 Wind River Systems, Inc. *//* Copyright 1996-2000 Motorola, Inc. All Rights Reserved */        .data	.globl	copyright_wind_river	.long	copyright_wind_river/*modification history--------------------01i,10dec01,mil  Fixed incorrect lbz instructions that use r0 as displacement.01h,08may01,pch  Add assembler abstractions (FUNC_EXPORT, FUNC_BEGIN, etc.)01g,08feb00,rhk  Fixed the sysPciConfig(In/Out) routines for Byte and Word		 access.01f,16apr99,rhk  renamed PCI_xxx defines.01e,12mar99,rhk  removed all 'eieio' instructions, removed 'sync' 		 instructions following reads.01d,18feb99,srr  updated cache invalidation and flushing.01c,09feb99,rhk  updated most routines, added sysPciConfigXxx routines and 		 removed the L2 cache routines.01b,08feb99,rhk  removed legacy HID0 setup.01a,14dec98,srr  created (from mv2603/sysALib.s ver 01r)*//*DESCRIPTIONThis module contains system-dependent routines written in assemblylanguage.This module must be the first specified in the \f3ld\f1 command used tobuild the system.  The sysInit() routine is the system start-up code.*/#define _ASMLANGUAGE#include "vxWorks.h"#include "sysLib.h"#include "config.h"#include "regs.h"	#include "asm.h"	/* globals */	FUNC_EXPORT(_sysInit)		/* start of system code */	FUNC_EXPORT(sysInByte)	FUNC_EXPORT(sysOutByte)        FUNC_EXPORT(sysPciInByte)        FUNC_EXPORT(sysPciOutByte)        FUNC_EXPORT(sysPciConfigInByte)        FUNC_EXPORT(sysPciConfigOutByte)        FUNC_EXPORT(sysInWord)        FUNC_EXPORT(sysInWordRev)        FUNC_EXPORT(sysOutWord)        FUNC_EXPORT(sysPciInWord)        FUNC_EXPORT(sysPciOutWord)        FUNC_EXPORT(sysPciConfigInWord)        FUNC_EXPORT(sysPciConfigOutWord)        FUNC_EXPORT(sysInLong)        FUNC_EXPORT(sysOutLong)        FUNC_EXPORT(sysPciInLong)        FUNC_EXPORT(sysPciOutLong)        FUNC_EXPORT(sysPciConfigInLong)        FUNC_EXPORT(sysPciConfigOutLong)        FUNC_EXPORT(sysMemProbeSup)        FUNC_EXPORT(sysProbeExc)	FUNC_EXPORT(sysTimeBaseLGet)	FUNC_EXPORT(sysHid1Get)	FUNC_EXPORT(sysHid2Set)	FUNC_EXPORT(sysHid2Get)	/* externals */	.extern usrInit		.text/********************************************************************************* sysInit - start after boot** This is the system start-up entry point for VxWorks in RAM, the* first code executed after booting.  It disables interrupts, sets up* the stack, and jumps to the C routine usrInit() in usrConfig.c.** The initial stack is set to grow down from the address of sysInit().  This* stack is used only by usrInit() and is never used again.  Memory for the* stack must be accounted for when determining the system load address.** NOTE: This routine should not be called by the user.** RETURNS: N/A* sysInit (void)              /@ THIS IS NOT A CALLABLE ROUTINE @/*/_sysInit:	/* disable external interrupts */	xor	p0, p0, p0        mtmsr   p0                      /* clear the MSR register  */        /* return from decrementer exceptions */        addis   p1, r0, 0x4c00        addi    p1, p1, 0x0064          /* load rfi (0x4c000064) to p1      */        stw     p1, 0x900(r0)           /* store rfi at 0x00000900          */	/* initialize the stack pointer */		lis     sp, HIADJ(RAM_LOW_ADRS)	addi    sp, sp, LO(RAM_LOW_ADRS)		/* invalidate the MPU's data/instruction caches */	lis	r3, 0x0	ori	r3, r3, 0xC000		/* r3 has enable and bits set */	or	r4, r4, r3		/* set bits */	sync	isync	mtspr   HID0, r4		/* HID0 = r4 */	andc	r4, r4, r3		/* clear bits */        isync	mtspr	HID0, r4	isync	/* disable instruction and data translations in the MMU */	sync	mfmsr	r3			/* get the value in msr *					/* clear bits IR and DR */		rlwinm	r4, r3, 0, _PPC_MSR_BIT_DR+1, _PPC_MSR_BIT_IR - 1		mtmsr	r4			/* set the msr */	sync				/* SYNC */	/* initialize the BAT register */	li	p3,0	 		/* clear p0 */		isync	mtspr	IBAT0U,p3		/* SPR 528 (IBAT0U) */	isync	mtspr	IBAT0L,p3		/* SPR 529 (IBAT0L) */	isync	mtspr	IBAT1U,p3		/* SPR 530 (IBAT1U) */	isync	mtspr	IBAT1L,p3		/* SPR 531 (IBAT1L) */	isync	mtspr	IBAT2U,p3		/* SPR 532 (IBAT2U) */	isync	mtspr	IBAT2L,p3		/* SPR 533 (IBAT2L) */	isync	mtspr	IBAT3U,p3		/* SPR 534 (IBAT3U) */	isync	mtspr	IBAT3L,p3		/* SPR 535 (IBAT3L) */	isync	mtspr	DBAT0U,p3		/* SPR 536 (DBAT0U) */	isync	mtspr	DBAT0L,p3		/* SPR 537 (DBAT0L) */	isync	mtspr	DBAT1U,p3		/* SPR 538 (DBAT1U) */	isync	mtspr	DBAT1L,p3		/* SPR 539 (DBAT1L) */	isync	mtspr	DBAT2U,p3		/* SPR 540 (DBAT2U) */	isync	mtspr	DBAT2L,p3		/* SPR 541 (DBAT2L) */	isync	mtspr	DBAT3U,p3		/* SPR 542 (DBAT3U) */	isync	mtspr	DBAT3L,p3		/* SPR 543 (DBAT3L) */	isync	/* invalidate entries within both TLBs */	li	p1,128	xor	p0,p0,p0		/* p0 = 0    */	mtctr	p1			/* CTR = 32  */	isync				/* context sync req'd before tlbie */sysALoop:	tlbie	p0	addi	p0,p0,0x1000		/* increment bits 15-19 */	bdnz	sysALoop		/* decrement CTR, branch if CTR != 0 */	sync				/* sync instr req'd after tlbie      */	/* initialize Small Data Area (SDA) start address */#if	FALSE				/* XXX TPR NO SDA for now */	lis     r2, HIADJ(_SDA2_BASE_)	addi    r2, r2, LO(_SDA2_BASE_)	lis     r13, HIADJ(_SDA_BASE_)	addi    r13, r13, LO(_SDA_BASE_)#endif	addi	sp, sp, -FRAMEBASESZ	/* get frame stack */	li      r3, BOOT_WARM_AUTOBOOT	b	usrInit			/* never returns - starts up kernel *//******************************************************************************* sysInByte - reads a byte from an io address.** This function reads a byte from a specified io address or from local memory.* It operates in big-endian mode and does not perform any translation* operations on either the supplied address or the retrieved data.** RETURNS: byte from address.** UINT8 sysInByte (UINT8 * dataPtr)*/sysInByte:        /* Read byte from address */        lbzx    r3,r0,r3        /* Return to caller */        bclr    20,0/******************************************************************************** sysOutByte - writes a byte to an io address.** This function writes a byte to a specified io address or to local memory.* It operates in big-endian mode and does not perform any translation* operations on either the supplied address or data.** RETURNS: N/A** void sysOutByte (UINT8 * dataPtr, UINT8 data)*/sysOutByte:        /* Write a byte to address */        stbx    r4,r0,r3        /* Sync I/O operation */	sync        /* Return to caller */        bclr    20,0/******************************************************************************* sysPciInByte - reads a byte from PCI I/O or Memory space** This function reads a byte from a specified PCI I/O or Memory address* via the PCI bridge chip.  This function should be used for access* to the I/O or Memory mapped registers of a PCI device.  Since this routine* accesses only a single byte of data no address or data manipulation is* required.** RETURNS: byte from address.** UINT8 sysPciInByte (UINT8 * dataPtr)*/sysPciInByte:        /* Read byte from address */        lbzx    r3,r0,r3        /* Return to caller */        bclr    20,0/******************************************************************************* sysPciOutByte - writes a byte to PCI I/O or Memory space** This function writes a byte to a specified PCI I/O or Memory address* via the QSPAN bridge chip.  This function should be used for writing* to the I/O or Memory mapped registers of a PCI device.  Since this routine* writes only a single byte of data no address or data manipulation is* required.** RETURNS: N/A** void sysPciOutByte (UINT8 * dataPtr, UINT8 data)*/sysPciOutByte:        /* Write a byte to address */        stbx    r4,r0,r3        /* Sync I/O operation */	sync        /* Return to caller */        bclr    20,0/******************************************************************************* sysPciConfigInByte - reads a byte from a PCI configuration space address.** This function reads a byte from a specified PCI configuration space* address.  This function uses the indirect PCI configuration space access* method.  It writes the input configuration space address to the CAR and* then reads the data from the CDR.  All reads/writes larger than 8 bits * use byte swapping.** Register Usage* r3 - Configuration space address to read from / returned data* r4 - dummy parameter, used for holding the CAR address* r5 - dummy parameter, used for holding the CDR address** RETURNS: N/A** UINT8 sysPciConfigInByte (UINT8 * dataPtr, UINT dummy1, UINT dummy2)*/sysPciConfigInByte:	andi.   r4,r3,3                 /* save the 2 LSBs of the PCI addr */        addis   r5,r0,HIADJ(PCI_MSTR_PRIMARY_CDR)        ori     r5,r5,LO(PCI_MSTR_PRIMARY_CDR)	or	r5,r5,r4		/* add the LSBs value to the CDR */	andi.   r4,r4,0			/* the config. space address must */	ori     r4,r4,3			/* be 4-byte aligned */	andc	r3,r3,r4		/* mask off the 2 LSBs */        addis   r4,r0,HIADJ(PCI_MSTR_PRIMARY_CAR)        ori     r4,r4,LO(PCI_MSTR_PRIMARY_CAR)        stwbrx  r3,r0,r4                /* write config. space addr. to CAR */        sync                            /* ensure memory access is complete */	andi.	r3,r3,0			        lbz     r3,0(r5)                /* read data out of the CDR */        bclr    20,0                    /* return to caller *//******************************************************************************* sysPciConfigOutByte - writes a byte to a PCI configuration space address.** This function writes a byte to a specified PCI configuration space* address.  This function uses the indirect PCI configuration space access* method.  It writes the input configuration space address to the CAR and* then writes the data to the CDR.  All writes larger than 8 bits use byte* swapping.** Register Usage* r3 - Configuration space address to write to* r4 - data to be written* r5 - dummy parameter, used for holding the CAR address* r6 - dummy parameter, used for holding the CDR address** RETURNS: N/A** void sysPciConfigOutByte (UINT8 * dataPtr, UINT8 data, *			    UINT dummy1, UINT dummy2)*/sysPciConfigOutByte:        andi.   r5,r3,3                 /* save the 2 LSBs of the PCI addr */        addis   r6,r0,HIADJ(PCI_MSTR_PRIMARY_CDR)        ori     r6,r6,LO(PCI_MSTR_PRIMARY_CDR)        or      r6,r6,r5                /* add the LSBs value to the CDR */        andi.   r5,r5,0                 /* the config. space address must */        ori     r5,r5,3                 /* be 4-byte aligned */        andc    r3,r3,r5                /* mask off the 2 LSBs */        addis   r5,r0,HIADJ(PCI_MSTR_PRIMARY_CAR)        ori     r5,r5,LO(PCI_MSTR_PRIMARY_CAR)        stwbrx  r3,r0,r5                /* write config. space addr. to CAR */        sync                            /* ensure memory access is complete */	stb     r4,0(r6)                /* write data to CDR */        sync        bclr    20,0                    /* return to caller *//******************************************************************************* sysInWord - reads a word (16-bit big-endian) from an io address.** This function reads a word from a specified io address or local memory.* It operates in big-endian mode and does not perform any translation* operations on either the supplied address or the retrieved data.** RETURNS: 16-bit word from read from address** UINT16 sysInWord (UINT16 * dataPtr)*/sysInWord:        /* Read word from address */        lhzx    r3,r0,r3        /* Return to caller */        bclr    20,0/******************************************************************************* sysInWordRev - reads a word (16-bit byte reversed) from an io address.** This function reads a word from a specified io address, or memory* and reverses the bytes.** RETURNS: 16 bit word (byte swapped) read from address** UINT16 sysInWordRev (UINT16 * dataPtr)*/sysInWordRev:        /* Read word from address */        lhbrx    r3,r0,r3        /* Return to caller */        bclr    20,0/******************************************************************************** sysOutWord - writes a word (16-bit big-endian) to an io address.

⌨️ 快捷键说明

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