📄 rawio.s
字号:
#define _ASMLANGUAGE
#include "vxWorks.h"
#include "arch/arm/arm.h"
#include "config.h"
#include "Ixp425.h"
.globl FUNC(rawio_init)
.globl FUNC(rawio_init_c)
.globl FUNC(rawprint)
_ARM_FUNCTION(rawio_init)
LDR r4, =IXP425_UART2_BASE /* base address of uart 0x8000c840*/
LDR r3, =0x80808080
STR r3, [r4, #0x0c]
LDR r3, =0x45454545
STR r3, [r4, #0x00]
LDR r3, =0x01010101
STR r3, [r4, #0x04]
LDR r3, =0x03030303
STR r3, [r4, #0x0c]
LDR r3, =0x40404040
STR r3, [r4, #0x04]
LDR r3, =0x01010101
STR r3, [r4, #0x08]
LDR r3, =0x07070707
STR r3, [r4, #0x08]
LDR r3, =0x00000000
STR r3, [r4, #0x14]
MOV pc, lr /* return to caller*/
/************************************************************************
# rawio_putc: Debug printing from assembly code. *
# *
# SYNTAX: void rawio_putc(NULL, char); *
# INPUT: r24 - character to be printed *
# RETURNS: none *
# OUTPUTS: none *
# NOTE: r24 contains the ascii representation of the character *
# to display. THIS CAN ONLY BE CALLED FROM ASSEMBLY CODE *
# rawcio_init must be called prior to calling this routine*
# *
# Example use: *
# addi r4,r0,0x41 # A *
# bl rawio_putc *
# *
#************************************************************************/
_ARM_FUNCTION(rawio_putc)
/* .text
.align 4
.globl rawio_putc
rawio_putc:*/
LDR r5, =IXP425_UART2_BASE /* base address of uart*/
rawio_putc_loop:
LDR r6, [r5, #0x14] /* read line status register*/
tst r6, #0x20 /*AND r6, r6, #0x20*/ /* transmit holding register empty bit*/
/*CMP r6, #0*/
BEQ rawio_putc_loop /* if zero, branch and try again*/
STR r4, [r5, #00] /* transmit the character*/
MOV pc, lr /* return to caller*/
_ARM_FUNCTION_CALLED_FROM_C(rawio_init_c)
stmfd sp!,{r5-r6} /* save r5-r6 to stack */
LDR r6, =IXP425_UART2_BASE /* base address of uart 0x8000c840*/
LDR r5, =0x80808080
STR r5, [r6, #0x0c]
LDR r5, =0x45454545
STR r5, [r6, #0x00]
LDR r5, =0x01010101
STR r5, [r6, #0x04]
LDR r5, =0x03030303
STR r5, [r6, #0x0c]
LDR r5, =0x40404040
STR r5, [r6, #0x04]
LDR r5, =0x01010101
STR r5, [r6, #0x08]
LDR r5, =0x07070707
STR r5, [r6, #0x08]
LDR r5, =0x00000000
STR r5, [r6, #0x14]
ldmfd sp!,{r5-r6}
MOV pc, lr /* return to caller*/
/************************************************************************
# rawprint: Debug printing from C code. *
# *
# SYNTAX: void rawprint(0, character); *
# INPUTS: character = character to be printed *
# RETURNS: none *
# OUTPUTS: none *
# NOTE: THIS CAN ONLY BE CALLED FROM C CODE *
# *
# Example use: *
# rawprint(0, 'A'); *
# *
#************************************************************************/
_ARM_FUNCTION_CALLED_FROM_C(rawprint)
stmfd sp!,{r5-r6} /* save r5-r6 to stack */
LDR r5, =IXP425_UART2_BASE /* base address of uart*/
rawprint_loop:
LDR r6, [r5, #0x14] /* read line status register*/
tst r6, #0x20 /* transmit holding register empty bit*/
BEQ rawprint_loop /* if zero, branch and try again*/
STR r1, [r5, #00] /* transmit the character*/
/* restore registers and return */
ldmfd sp!,{r5-r6}
MOV pc, lr /* return to caller*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -