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

📄 post1.s

📁 U BOOT源码
💻 S
📖 第 1 页 / 共 2 页
字号:
	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 + -