📄 post1.s
字号:
blr /* Return to calling function *//**************************************************** ******** 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_donegi2: 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_donegi3: addi r3, 0, 1 /* only lower bits set */ b gi_donegi4: 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 r3log_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, 0pputh_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_errpputh_skip: addic. r30, r30, -1 bne pputh_nxt xor r3, r3, r3 /* Clear error code */ b pputh_donepputh_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 + -