s3c_pm_dbg("12345\n");
uart_rev_a_char();
void s3c_pm_dbg(const char *fmt, ...)
{
va_list va;
char buff[256];
va_start(va, fmt);
vsprintf(buff, fmt, va);
va_end(va);
printascii(buff);
}
ENTRY(printascii)
addruart r3
b 2f
1: waituart r2, r3
senduart r1, r3
busyuart r2, r3
teq r1, #'\n'
moveq r1, #'\r'
beq 1b
2: teq r0, #0
ldrneb r1, [r0], #1
teqne r1, #0
bne 1b
mov pc, lr
ENDPROC(printascii)
ENTRY(printch)
addruart r3
mov r1, r0
mov r0, #0
b 1b
ENDPROC(printch)
ENTRY(uart_rev_a_char)
addruart r3
waituart_rev_over r2, r3
mov pc, lr
ENDPROC(uart_rev_a_char)
.macro waituart_rev_over,rd,rx
ldr \rd, [ \rx, # S3C2410_UFCON ]
tst \rd, #S3C2410_UFCON_FIFOMODE @ fifo enabled?
beq 1001f @
@ FIFO enabled...
1003:
@fifo_level \rd, \rx
ldr \rd, [ \rx, # S3C2410_UFSTAT ]
and \rd, \rd, #S3C2440_UFSTAT_RXMASK
teq \rd, #0
beq 1003b
@上行汇编-->如果相等,说明结果为0,即cpu状态寄存器的z标志置为1
@也即fifo的接收字节数为0,即fifo还没有接收到任何数据,因此需要死等
@收到数据后即bne,说明结果不为0,即cpu状态寄存器的z标志置为0
b 1002f
1001:
@ idle waiting for non fifo
ldr \rd, [ \rx, # S3C2410_UTRSTAT ]
tst \rd, #S3C2410_UTRSTAT_RXDR
beq 1001b
1002: @ exit busyuart
.endm
以上的实质是用c调用汇编函数,
uart_rev_a_char();可停止内核的执行流程,等待从串口输入一个字符
void s3c_pm_dbg(const char *fmt, ...)打印,与printk()函数效果相同,但不是先将打印信息存入打印buff,而是直接
打印,直接见效果!好处多多。