📄 sysalib.s
字号:
lis r6, HIADJ(0x00010000)
addi r6, r6, LO(0x00010000 )
LOOPA:
lis r4, HIADJ(0xffc00002)
addi r4, r4, LO(0xffc00002)
/*****light LED*****/
lis r5,HIADJ(0xbf)/*任意值*/
addi r5,r5,LO(0xbf)
stwbrx r5,0,r4
xor r5,r5,r5
addi r6,r6,-1
cmpwi r6,0
bne LOOPA
/**************循环1************/
/**************循环2************/
lis r6, HIADJ(0x00010000)
addi r6, r6, LO(0x00010000 )
LOOPB:
lis r4, HIADJ(0xffc00002)
addi r4, r4, LO(0xffc00002)
/*****Out LED*****/
lis r5,HIADJ(0xff)/*任意值*/
addi r5,r5,LO(0xff)
stwbrx r5,0,r4
xor r5,r5,r5
addi r6,r6,-1
cmpwi r6,0
bne LOOPB
/**************循环2************/
bl LOOP
#endif
addi sp, sp, -FRAMEBASESZ /* get frame stack */
li r3, BOOT_WARM_AUTOBOOT
b usrInit /* never returns - starts up kernel */
FUNC_END(_sysInit)
/*****************************************************************************
*
* sysInByte - reads a byte from an io address.
*
* This function reads a byte from a specified io address.
*
* RETURNS: byte from address.
* UCHAR sysInByte
* (
* UCHAR * pAddr /@ Virtual I/O addr to read from @/
* )
*/
FUNC_BEGIN(sysInByte)
eieio /* Sync I/O operation */
sync
lbzx p0,r0,p0 /* Read byte from I/O space */
bclr 20,0 /* Return to caller */
FUNC_END(sysInByte)
/******************************************************************************
*
* sysOutByte - writes a byte to an io address.
*
* This function writes a byte to a specified io address.
*
* RETURNS: N/A
* VOID sysOutByte
* (
* UCHAR * pAddr, /@ Virtual I/O addr to write to @/
* UCHAR data /@ data to be written @/
* )
*/
FUNC_BEGIN(sysOutByte)
stbx p1,r0,p0 /* Write a byte to PCI space */
eieio /* Sync I/O operation */
sync
bclr 20,0 /* Return to caller */
FUNC_END(sysOutByte)
/*****************************************************************************
*
* sysInWord - reads a word from an address, swapping the bytes.
*
* This function reads a swapped word from a specified
* address.
*
* RETURNS:
* Returns swapped 16 bit data from the specified address.
* USHORT sysInWord
* (
* ULONG address, /@ addr to read from @/
* )
*/
FUNC_BEGIN(sysInWord)
eieio /* Sync I/O operation */
sync
lhbrx p0,r0,p0 /* Read and swap */
bclr 20,0 /* Return to caller */
FUNC_END(sysInWord)
/*****************************************************************************
*
* sysOutWord - writes a word to an address swapping the bytes.
*
* This function writes a swapped word to a specified
* address.
*
* RETURNS: N/A
* VOID sysOutWord
* (
* ULONG address, /@ Virtual addr to write to @/
* UINT16 data /@ Data to be written @/
* )
*/
FUNC_BEGIN(sysOutWord)
sthbrx p1,r0,p0 /* Write with swap to address */
eieio /* Sync I/O operation */
sync
bclr 20,0 /* Return to caller */
FUNC_END(sysOutWord)
/*****************************************************************************
*
* sysInLong - reads a long from an address.
*
* This function reads a long from a specified PCI Config Space (little-endian)
* address.
*
* RETURNS:
* Returns 32 bit data from the specified register. Note that for PCI systems
* if no target responds, the data returned to the CPU will be 0xffffffff.
* ULONG sysInLong
* (
* ULONG address, /@ Virtual addr to read from @/
* )
*/
FUNC_BEGIN(sysInLong)
eieio /* Sync I/O operation */
sync
lwbrx p0,r0,p0 /* Read and swap from address */
bclr 20,0 /* Return to caller */
FUNC_END(sysInLong)
/******************************************************************************
*
* sysOutLong - write a swapped long to address.
*
* This routine will store a 32-bit data item (input as big-endian)
* into an address in little-endian mode.
*
* RETURNS: N/A
* VOID sysOutLong
* (
* ULONG address, /@ Virtual addr to write to @/
* ULONG data /@ Data to be written @/
* )
*/
FUNC_BEGIN(sysOutLong)
stwbrx p1,r0,p0 /* store data as little-endian */
eieio /* Sync I/O operation */
sync
bclr 20,0
FUNC_END(sysOutLong)
/******************************************************************************
*
* sysPciRead32 - read 32 bit PCI data
*
* This routine will read a 32-bit data item from PCI (I/O or
* memory) space.
*
* RETURNS: N/A
* VOID sysPciRead32
* (
* ULONG * pAddr, /@ Virtual addr to read from @/
* ULONG * pResult /@ location to receive data @/
* )
*/
FUNC_BEGIN(sysPciRead32)
eieio /* Sync I/O operation */
lwbrx p0,r0,p0 /* get the data and swap the bytes */
stw p0,0(p1) /* store into address ptd. to by p1 */
bclr 20,0
FUNC_END(sysPciRead32)
/******************************************************************************
*
* sysPciWrite32 - write a 32 bit data item to PCI space
*
* This routine will store a 32-bit data item (input as big-endian)
* into PCI (I/O or memory) space in little-endian mode.
*
* RETURNS: N/A
* VOID sysPciWrite32
* (
* ULONG * pAddr, /@ Virtual addr to write to @/
* ULONG data /@ Data to be written @/
* )
*/
FUNC_BEGIN(sysPciWrite32)
stwbrx p1,r0,p0 /* store data as little-endian */
bclr 20,0
FUNC_END(sysPciWrite32)
/*****************************************************************************
*
* sysPciInByte - reads a byte from PCI Config Space.
*
* This function reads a byte from a specified PCI Config Space address.
*
* RETURNS:
* Returns 8 bit data from the specified register. Note that for PCI systems
* if no target responds, the data returned to the CPU will be 0xff.
* UINT8 sysPciInByte
* (
* UINT8 * pAddr, /@ Virtual addr to read from @/
* )
*/
FUNC_BEGIN(sysPciInByte)
eieio /* Sync I/O operation */
lbzx p0,r0,p0 /* Read byte from PCI space */
bclr 20,0 /* Return to caller */
FUNC_END(sysPciInByte)
/*****************************************************************************
*
* sysPciInWord - reads a word (16-bit big-endian) from PCI Config Space.
*
* This function reads a word from a specified PCI Config Space (little-endian)
* address.
*
* RETURNS:
* Returns 16 bit data from the specified register. Note that for PCI systems
* if no target responds, the data returned to the CPU will be 0xffff.
* USHORT sysPciInWord
* (
* USHORT * pAddr, /@ Virtual addr to read from @/
* )
*/
FUNC_BEGIN(sysPciInWord)
eieio /* Sync I/O operation */
lhbrx p0,r0,p0 /* Read and swap from PCI space */
bclr 20,0 /* Return to caller */
FUNC_END(sysPciInWord)
/*****************************************************************************
*
* sysPciInLong - reads a long (32-bit big-endian) from PCI Config Space.
*
* This function reads a long from a specified PCI Config Space (little-endian)
* address.
*
* RETURNS:
* Returns 32 bit data from the specified register. Note that for PCI systems
* if no target responds, the data returned to the CPU will be 0xffffffff.
* ULONG sysPciInLong
* (
* ULONG * pAddr, /@ Virtual addr to read from @/
* )
*/
FUNC_BEGIN(sysPciInLong)
eieio /* Sync I/O operation */
lwbrx p0,r0,p0 /* Read and swap from PCI space */
bclr 20,0 /* Return to caller */
FUNC_END(sysPciInLong)
/******************************************************************************
*
* sysPciOutByte - writes a byte to PCI Config Space.
*
* This function writes a byte to a specified PCI Config Space address.
*
* RETURNS: N/A
* VOID sysPciOutByte
* (
* UINT8 * pAddr, /@ Virtual addr to write to @/
* UINT8 data /@ Data to be written @/
* )
*/
FUNC_BEGIN(sysPciOutByte)
stbx p1,r0,p0 /* Write a byte to PCI space */
bclr 20,0 /* Return to caller */
FUNC_END(sysPciOutByte)
/******************************************************************************
*
* sysPciOutWord - writes a word (16-bit big-endian) to PCI Config Space.
*
* This function writes a word to a specified PCI Config Space (little-endian)
* address.
*
* RETURNS: N/A
* VOID sysPciOutWord
* (
* USHORT * pAddr, /@ Virtual addr to write to @/
* USHORT data /@ Data to be written @/
* )
*/
FUNC_BEGIN(sysPciOutWord)
sthbrx p1,r0,p0 /* Write with swap to PCI space */
bclr 20,0 /* Return to caller */
FUNC_END(sysPciOutWord)
/******************************************************************************
*
* sysPciOutLong - writes a long (32-bit big-endian) to PCI Config Space.
*
* This function writes a long to a specified PCI Config Space (little-endian)
* address.
*
* RETURNS: N/A
* VOID sysPciOutLong
* (
* ULONG * pAddr, /@ Virtual addr to write to @/
* ULONG data /@ Data to be written @/
* )
*/
FUNC_BEGIN(sysPciOutLong)
stwbrx p1,r0,p0 /* Write big-endian long to little-endian */
mr p0,p1 /* PCI space */
bclr 20,0 /* Return to caller */
FUNC_END(sysPciOutLong)
/*******************************************************************************
*
* sysMemProbeSup - sysBusProbe support routine
*
* This routine is called to try to read byte, word, or long, as specified
* by length, from the specified source to the specified destination.
*
* RETURNS: OK if successful probe, else ERROR
* STATUS sysMemProbeSup
* (
* int length, /@ length of cell to test (1, 2, 4) @/
* char * src, /@ address to read @/
* char * dest /@ address to write @/
* )
*/
FUNC_BEGIN(sysMemProbeSup)
addi p7, p0, 0 /* save length to p7 */
xor p0, p0, p0 /* set return status */
cmpwi p7, 1 /* check for byte access */
bne sbpShort /* no, go check for short word access */
lbz p6, 0(p1) /* load byte from source */
stb p6, 0(p2) /* store byte to destination */
isync /* enforce for immediate exception handling */
blr
sbpShort:
cmpwi p7, 2 /* check for short word access */
bne sbpWord /* no, check for word access */
lhz p6, 0(p1) /* load half word from source */
sth p6, 0(p2) /* store half word to destination */
isync /* enforce for immediate exception handling */
blr
sbpWord:
cmpwi p7, 4 /* check for short word access */
bne sysProbeExc /* no, check for double word access */
lwz p6, 0(p1) /* load half word from source */
stw p6, 0(p2) /* store half word to destination */
isync /* enforce for immediate exception handling */
blr
sysProbeExc:
li p0, -1 /* shouldn't ever get here, but... */
blr
FUNC_END(sysMemProbeSup)
/**********************************************************************
* sysPVRReadSys - Read the content of the PVR register
* Once the PVR is read, the 16 least significant bits are shifted
* off.
* Input - None
* Return - upper 16 bits of PVR stored in r3
*/
FUNC_BEGIN(sysPVRReadSys)
/* mfspr r4, PVR_REG*/ /* read PVR */
/* srwi r3, r4, 16*/ /* shift off the least 16 bits */
mfspr r3, PVR /* read PVR */
blr
FUNC_END(sysPVRReadSys)
/*******************************************************************************
*
* sysSioRead - this function reads a register from the UIO chip
*
* In order to read data from the desired Super IO register, the index register
* must be written to with the offset of the of the register to be read. The
* desired byte of data is then read from the data register.
*
* RETURNS: byte read from data register
*
* From a C point of view, the routine is defined as follows:
UINT8 sysSioRead
(
UINT8 * pSioIndexReg, /@ pointer to SIO index register base addr @/
UINT8 sioRegOffset /@ offset of register to read from @/
)
*/
FUNC_BEGIN(sysSioRead)
stb r4,0(r3) /* write index register with register offset */
eieio
sync
lbz r3,1(r3) /* retrieve specified reg offset contents */
eieio
sync
bclr 20,0 /* return to caller */
FUNC_END(sysSioRead)
/*******************************************************************************
*
* sysSioWrite - this function writes a register to the UIO chip
*
* In order to write data to the desired Super IO register, the index
* register must be written to with the offset of the of the register to be
* modified. The desired byte of data can then be written via the data
* register.
*
* RETURNS: N/A
*
* From a C point of view, the routine is defined as follows:
void sysSioWrite
(
UINT8 * pSioIndexReg, /@ pointer to SIO index register base addr @/
UINT8 sioRegOffset, /@ offset of register to write to @/
UINT8 data /@ 8-bit data to be written @/
)
*/
FUNC_BEGIN(sysSioWrite)
stb r4,0(r3) /* write index register with register offset */
eieio
sync
stb r5,1(r3) /* 1st write */
eieio
sync
stb r5,1(r3) /* 2nd write */
eieio
sync
bclr 20,0 /* return to caller */
FUNC_END(sysSioWrite)
#if defined(INCLUDE_CACHE_L2)
#include "sysL2BackCache.s"
#endif
#if !defined(SP8240)
#include "sysCacheLockALib.s"
#endif
#if defined(INCLUDE_CACHE_L3)
#include "sysL3Cache.s"
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -