📄 post1.s
字号:
/****************************************************
******** fill test ********
***************************************************/
/* tests memory by filling with value, and reading back */
/* r5 = Size of memory in bytes */
/* r4 = Value to write */
/* r3 = Error code */
fill_test:
mflr r0 /* Get link register */
stwu r1, -32(r1) /* Save back chain and move SP */
stw r0, +36(r1) /* Save link register */
stmw r27, 8(r1) /* save r27 - r31 on stack */
/* r31 - scratch register */
/* r30 - memory address */
mr r27, r3
mr r28, r4
mr r29, r5
WATCHDOG_RESET /* Reset the watchdog */
/* first fill memory with Value */
srawi r31, r29, 2 /* convert bytes to longs */
mtctr r31 /* setup counter */
addi r30, 0, 0 /* Make r30 = addr 0 */
ft_0: stw r28, 0(r30) /* Store value */
addi r30, r30, 4 /* Increment to next word */
andi. r31, r30, 0xffff /* check for 2^16 loops */
bne ft_0a /* if not there, then skip */
WATCHDOG_RESET /* kick the dog every now and then */
ft_0a: bdnz ft_0 /* Round and round... */
WATCHDOG_RESET /* Reset the watchdog */
/* Now confirm Value is in memory */
srawi r31, r29, 2 /* convert bytes to longs */
mtctr r31 /* setup counter */
addi r30, 0, 0 /* Make r30 = addr 0 */
ft_1: lwz r31, 0(r30) /* get value from memory */
xor. r31, r31, r28 /* Writen = Read ? */
bne ft_err /* If bad, than halt */
addi r30, r30, 4 /* Increment to next word */
andi. r31, r30, 0xffff /* check for 2^16 loops*/
bne ft_1a /* if not there, then skip */
WATCHDOG_RESET /* kick the dog every now and then */
ft_1a: bdnz ft_1 /* Round and round... */
WATCHDOG_RESET /* Reset the watchdog */
b fill_done /* restore and return */
ft_err: addi r29, r27, 0 /* save current led code */
addi r27, r31, 0 /* get pattern in r27 */
bl get_idx /* get index from r27 */
add r27, r27, r29 /* add index to old led code */
bl log_err /* output led err code, halt CPU */
fill_done:
lmw r27, 8(r1) /* restore r27 - r31 from stack */
lwz r0, +36(r1) /* Get saved link register */
addi r1, r1, +32 /* Remove frame from stack */
mtlr r0 /* Restore link register */
blr /* Return to calling function */
/****************************************************
******* get error index from r3 pattern ********
***************************************************/
get_idx: /* r3 = (MSW(r3) !=0)*2 +
(LSW(r3) !=0) */
/* save the return info on stack */
mflr r0 /* Get link register */
stwu r1, -12(r1) /* Save back chain and move SP */
stw r0, +16(r1) /* Save link register */
stw r4, +8(r1) /* save R4 */
andi. r4, r3, 0xffff /* check for lower bits */
beq gi2 /* skip if no bits set */
andis. r4, r3, 0xffff /* check for upper bits */
beq gi3 /* skip if no bits set */
addi r3, 0, 3 /* both upper and lower bits set */
b gi_done
gi2: andis. r4, r3, 0xffff /* check for upper bits*/
beq gi4 /* skip if no bits set */
addi r3, 0, 2 /* only upper bits set */
b gi_done
gi3: addi r3, 0, 1 /* only lower bits set */
b gi_done
gi4: addi r3, 0, 0 /* no bits set */
gi_done:
/* restore stack and return */
lwz r0, +16(r1) /* Get saved link register */
mtlr r0 /* Restore link register */
lwz r4, +8(r1) /* restore r4 */
addi r1, r1, +12 /* Remove frame from stack */
blr /* Return to calling function */
/****************************************************
******** set LED to R5 and hang ********
***************************************************/
log_stat: /* output a led code and continue */
set_led:
/* save the return info on stack */
mflr r0 /* Get link register */
stwu r1, -12(r1) /* Save back chain and move SP */
stw r0, +16(r1) /* Save link register */
stw r4, +8(r1) /* save R4 */
addis r4, 0, 0xfe00 /* LED buffer is at 0xfe000000 */
#if defined(CONFIG_W7OLMG) /* only on gateway, invert outputs */
xori r3,r3, 0xffff /* complement led code, active low */
sth r3, 0(r4) /* store first test value */
xori r3,r3, 0xffff /* complement led code, active low */
#else /* if not gateway, then don't invert */
sth r3, 0(r4) /* store first test value */
#endif
/* restore stack and return */
lwz r0, +16(r1) /* Get saved link register */
mtlr r0 /* Restore link register */
lwz r4, +8(r1) /* restore r4 */
addi r1, r1, +12 /* Remove frame from stack */
blr /* Return to calling function */
get_led:
/* save the return info on stack */
mflr r0 /* Get link register */
stwu r1, -12(r1) /* Save back chain and move SP */
stw r0, +16(r1) /* Save link register */
stw r4, +8(r1) /* save R4 */
addis r4, 0, 0xfe00 /* LED buffer is at 0xfe000000 */
lhz r3, 0(r4) /* store first test value */
#if defined(CONFIG_W7OLMG) /* only on gateway, invert inputs */
xori r3,r3, 0xffff /* complement led code, active low */
#endif
/* restore stack and return */
lwz r0, +16(r1) /* Get saved link register */
mtlr r0 /* Restore link register */
lwz r4, +8(r1) /* restore r4 */
addi r1, r1, +12 /* Remove frame from stack */
blr /* Return to calling function */
log_err: /* output the error and hang the board ( for now ) */
/* save the return info on stack */
mflr r0 /* Get link register */
stwu r1, -12(r1) /* Save back chain and move SP */
stw r0, +16(r1) /* Save link register */
stw r3, +8(r1) /* save a copy of error code */
bl set_led /* set the led pattern */
GET_GOT /* get GOT address in r14 */
lwz r3,GOT(err_str) /* get address of string */
bl post_puts /* output the warning string */
lwz r3, +8(r1) /* get error code */
addi r4, 0, 2 /* set disp length to 2 nibbles */
bl disp_hex /* output the error code */
lwz r3,GOT(end_str) /* get address of string */
bl post_puts /* output the warning string */
halt:
b halt /* hang */
/* restore stack and return */
lwz r0, +16(r1) /* Get saved link register */
mtlr r0 /* Restore link register */
addi r1, r1, +12 /* Remove frame from stack */
blr /* Return to calling function */
log_warn: /* output a warning, then continue with operations */
/* save the return info on stack */
mflr r0 /* Get link register */
stwu r1, -16(r1) /* Save back chain and move SP */
stw r0, +20(r1) /* Save link register */
stw r3, +8(r1) /* save a copy of error code */
stw r14, +12(r1) /* save a copy of r14 (used by GOT) */
bl set_led /* set the led pattern */
GET_GOT /* get GOT address in r14 */
lwz r3,GOT(warn_str) /* get address of string */
bl post_puts /* output the warning string */
lwz r3, +8(r1) /* get error code */
addi r4, 0, 2 /* set disp length to 2 nibbles */
bl disp_hex /* output the error code */
lwz r3,GOT(end_str) /* get address of string */
bl post_puts /* output the warning string */
addis r3, 0, 64 /* has a long delay */
mtctr r3
log_2:
WATCHDOG_RESET /* this keeps dog from barking, */
/* and takes time */
bdnz log_2 /* loop till time expires */
/* restore stack and return */
lwz r0, +20(r1) /* Get saved link register */
lwz r14, +12(r1) /* restore r14 */
mtlr r0 /* Restore link register */
addi r1, r1, +16 /* Remove frame from stack */
blr /* Return to calling function */
/*******************************************************************
* temp_uart_init
* Temporary UART initialization routine
* Sets up UART0 to run at 9600N81 off of the internal clock.
* R3-R4 are used.
******************************************************************/
temp_uart_init:
/* save the return info on stack */
mflr r0 /* Get link register */
stwu r1, -8(r1) /* Save back chain and move SP */
stw r0, +12(r1) /* Save link register */
addis r3, 0, 0xef60
ori r3, r3, 0x0303 /* r3 = UART0_LCR */
addi r4, 0, 0x83 /* n81 format, divisor regs enabled */
stb r4, 0(r3)
/* set baud rate to use internal clock,
baud = (200e6/16)/31/42 = 9600 */
addis r3, 0, 0xef60 /* Address of baud divisor reg */
ori r3, r3, 0x0300 /* UART0_DLM */
addi r4, 0, +42 /* uart baud divisor LSB = 93 */
stb r4, 0(r3) /* baud = (200 /16)/14/93 */
addi r3, r3, 0x0001 /* uart baud divisor addr */
addi r4, 0, 0
stb r4, 0(r3) /* Divisor Latch MSB = 0 */
addis r3, 0, 0xef60
ori r3, r3, 0x0303 /* r3 = UART0_LCR */
addi r4, 0, 0x03 /* n81 format, tx/rx regs enabled */
stb r4, 0(r3)
/* output a few line feeds */
addi r3, 0, '\n' /* load line feed */
bl post_putc /* output the char */
addi r3, 0, '\n' /* load line feed */
bl post_putc /* output the char */
/* restore stack and return */
lwz r0, +12(r1) /* Get saved link register */
mtlr r0 /* Restore link register */
addi r1, r1, +8 /* Remove frame from stack */
blr /* Return to calling function */
/**********************************************************************
** post_putc
** outputs charactor in R3
** r3 returns the error code ( -1 if there is an error )
*********************************************************************/
post_putc:
/* save the return info on stack */
mflr r0 /* Get link register */
stwu r1, -20(r1) /* Save back chain and move SP */
stw r0, +24(r1) /* Save link register */
stmw r29, 8(r1) /* save r29 - r31 on stack
r31 - uart base address
r30 - delay counter
r29 - scratch reg */
addis r31, 0, 0xef60 /* Point to uart base */
ori r31, r31, 0x0300
addis r30, 0, 152 /* Load about 10,000,000 ticks. */
pputc_lp:
lbz r29, 5(r31) /* Read Line Status Register */
andi. r29, r29, 0x20 /* Check THRE status */
bne thre_set /* Branch if FIFO empty */
addic. r30, r30, -1 /* Decrement and check if empty. */
bne pputc_lp /* Try, try again */
addi r3, 0, -1 /* Load error code for timeout */
b pputc_done /* Bail out with error code set */
thre_set:
stb r3, 0(r31) /* Store character to UART */
addi r3, 0, 0 /* clear error code */
pputc_done:
lmw r29, 8(r1) /*restore r29 - r31 from stack */
lwz r0, +24(r1) /* Get saved link register */
addi r1, r1, +20 /* Remove frame from stack */
mtlr r0 /* Restore link register */
blr /* Return to calling function */
/****************************************************************
post_puts
Accepts a null-terminated string pointed to by R3
Outputs to the serial port until 0x00 is found.
r3 returns the error code ( -1 if there is an error )
*****************************************************************/
post_puts:
/* save the return info on stack */
mflr r0 /* Get link register */
stwu r1, -12(r1) /* Save back chain and move SP */
stw r0, +16(r1) /* Save link register */
stw r31, 8(r1) /* save r31 - char pointer */
addi r31, r3, 0 /* move pointer to R31 */
pputs_nxt:
lbz r3, 0(r31) /* Get next character */
addic. r3, r3, 0 /* Check for zero */
beq pputs_term /* bail out if zero */
bl post_putc /* output the char */
addic. r3, r3, 0 /* check for error */
bne pputs_err
addi r31, r31, 1 /* point to next char */
b pputs_nxt /* loop till term */
pputs_err:
addi r3, 0, -1 /* set error code */
b pputs_end /* were outa here */
pputs_term:
addi r3, 0, 1 /* set success code */
/* restore stack and return */
pputs_end:
lwz r31, 8(r1) /* restore r27 - r31 from stack */
lwz r0, +16(r1) /* Get saved link register */
addi r1, r1, +12 /* Remove frame from stack */
mtlr r0 /* Restore link register */
blr /* Return to calling function */
/********************************************************************
***** disp_hex
***** Routine to display a hex value from a register.
***** R3 is value to display
***** R4 is number of nibbles to display ie 2 for byte 8 for (long)word
***** Returns -1 in R3 if there is an error ( ie serial port hangs )
***** Returns 0 in R3 if no error
*******************************************************************/
disp_hex:
/* save the return info on stack */
mflr r0 /* Get link register */
stwu r1, -16(r1) /* Save back chain and move SP */
stw r0, +20(r1) /* Save link register */
stmw r30, 8(r1) /* save r30 - r31 on stack */
/* r31 output char */
/* r30 uart base address */
addi r30, 0, 8 /* Go through 8 nibbles. */
addi r31, r3, 0
pputh_nxt:
rlwinm r31, r31, 4, 0, 31 /* Rotate next nibble into position */
andi. r3, r31, 0x0f /* Get nibble. */
addi r3, r3, 0x30 /* Add zero's ASCII code. */
cmpwi r3, 0x03a
blt pputh_out
addi r3, r3, 0x07 /* 0x27 for lower case. */
pputh_out:
cmpw r30, r4
bgt pputh_skip
bl post_putc
addic. r3, r3, 0 /* check for error */
bne pputh_err
pputh_skip:
addic. r30, r30, -1
bne pputh_nxt
xor r3, r3, r3 /* Clear error code */
b pputh_done
pputh_err:
addi r3, 0, -1 /* set error code */
pputh_done:
/* restore stack and return */
lmw r30, 8(r1) /* restore r30 - r31 from stack */
lwz r0, +20(r1) /* Get saved link register */
addi r1, r1, +16 /* Remove frame from stack */
mtlr r0 /* Restore link register */
blr /* Return to calling function */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -