使用printascii与printhex输出log到串口

来源:互联网 发布:适用于mac的办公软件 编辑:程序博客网 时间:2024/05/22 07:09

转载请标注原文地址:http://blog.csdn.net/uranus_wm/article/details/11176877

 

当串口控制台suspend时,内核c语言函数printk无法输出log

在linux2.3.0版本,arm架构下有两个汇编函数printascii和printhex,可以用于log调试

由于是用arm汇编指令写的,仅支持arm架构平台

文件位置:/arch/arm/kernel/debug.S

ENTRY(printascii)addruart_current r3, r1, r2b2f1:waituart r2, r3senduart r1, r3busyuart r2, r3teqr1, #'\n'moveqr1, #'\r'beq1b2:teqr0, #0ldrnebr1, [r0], #1teqner1, #0bne1bmovpc, lrENDPROC(printascii)

 

这个函数需要在menuconfig中打开宏定义:CONFIG_DEBUG_LL

打开这个宏之后log会很多,所以建议是直接编辑:/arch/arm/kernel/Makefile

在obj-y 后面增加一项:debug.o

这样就可使直接调用这两个函数
汇编文件中可以这样使用:

#ifdef CONFIG_DEBUG_LLadrr0, str_p1blprintasciimovr0, r9blprinthex8adrr0, str_p2blprintasciib__errorstr_p1:.asciz"\nError: value = (0x"str_p2:.asciz").\n".align#endif

注意printascii只能打印ascii码字符串,不能打印变量值,变量值得通过ldr到寄存器,然后通过printhex打印

 

c语言中直接这样使用:

extern void printascii(const 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);#ifdef CONFIG_DEBUG_LLprintascii(buff);#endif}

使用vsprintf将字符串和变量保存在buff内,然后通过printascii送到串口!

 

我的开发板是exynos4412,在u-boot里面直接对串口进行配置,可以打印单个字符:

/* * uart_asm_init: Initialize UART in asm mode, 115200bps fixed. * void uart_asm_init(void) */.globl uart_asm_inituart_asm_init:/* set GPIO to enable UART */@ GPIO setting for UART for UART0/1/2/3ldrr0, =0x11400000ldrr1, =0x22222222str   r1, [r0]ldrr0, =0x11400020ldrr1, =0x222222str   r1, [r0]ldrr0, =S5PV310_CLOCK_BASEldrr1, =CLK_SRC_PERIL0_VALldrr2, =CLK_SRC_PERIL0_OFFSETstrr1, [r0, r2]ldrr1, =CLK_DIV_PERIL0_VALldrr2, =CLK_DIV_PERIL0_OFFSETstrr1, [r0, r2]ldrr0, =S5PV310_UART_CONSOLE_BASEldrr1, =0x111strr1, [r0, #UFCON_OFFSET]movr1, #0x3strr1, [r0, #ULCON_OFFSET]ldrr1, =0x3c5strr1, [r0, #UCON_OFFSET]ldrr1, =UART_UBRDIV_VALstrr1, [r0, #UBRDIV_OFFSET]ldrr1, =UART_UDIVSLOT_VALstrr1, [r0, #UDIVSLOT_OFFSET]ldrr1, =0x4f4f4f4fstrr1, [r0, #UTXH_OFFSET]@'O'

直接通过配置串口寄存器0x11400000,0x11400020等对串口初始化

ldr r0, =S5PV310_UART_CONSOLE_BASE 获取平台定义的log输出端口,如uart1

最后两行就是打印字符‘O’,UTXH_OFFSET寄存器只能接受8bit,所以只能打印一个字符

 

uart初始化好之后,我们可以这样使用,打印一个字符‘K’

/* Print 'K' */ldrr0, =S5PV310_UART_CONSOLE_BASEldrr1, =0x4b4b4b4bstrr1, [r0, #UTXH_OFFSET]
原创粉丝点击