printasciiとprinthexを使ってシリアルポートにロゴを出力します.
転載は原文の住所を表示してください.http://blog.csdn.net/uranus_wm/articale/detail/11176877
シリアルコントロールテーブルsuspendの場合、カーネルc言語関数printkはロゴを出力できません.
linux 2.3.0バージョンでは、armアーキテクチャの下で2つのアセンブリ関数printasciiとprinthexがあり、ロゴデバッグに使用できます.
armアセンブリコマンドで書かれていますので、armアーキテクチャプラットフォームのみをサポートします.
ファイルの位置:/arch/arm/kenel/debug.S
この関数はmenuconfigでマクロ定義を開く必要があります.CONFIG_DEBUG_LL
このマクロを開くとロゴが多くなりますので、直接編集することをお勧めします.
obj-yの後に一つ追加します.debug.o
このようにして、直接にこの2つの関数を呼び出すことができます.
c言語で直接このように使います.
私の開発ボードはexynos 4412です.u-bootで直接シリアルポートを配置して、単一の文字を印刷できます.
ldr 0=S 5 PV 310_UART_CONSOSE.BASE取得プラットフォームに定義されているlog出力ポート、例えば、uart 1
最後の2行はプリント文字「O」、UTXH_です.OFFFSETレジスタは8 bitしか受け付けられませんので、1文字だけ印刷できます.
カラー初期化が完了したら、このように使用できます.
シリアルコントロールテーブルsuspendの場合、カーネルc言語関数printkはロゴを出力できません.
linux 2.3.0バージョンでは、armアーキテクチャの下で2つのアセンブリ関数printasciiとprinthexがあり、ロゴデバッグに使用できます.
armアセンブリコマンドで書かれていますので、armアーキテクチャプラットフォームのみをサポートします.
ファイルの位置:/arch/arm/kenel/debug.S
ENTRY(printascii)
addruart_current r3, r1, r2
b 2f
1: waituart r2, r3
senduart r1, r3
busyuart r2, r3
teq r1, #'
'
moveq r1, #'\r'
beq 1b
2: teq r0, #0
ldrneb r1, [r0], #1
teqne r1, #0
bne 1b
mov pc, lr
ENDPROC(printascii)
この関数はmenuconfigでマクロ定義を開く必要があります.CONFIG_DEBUG_LL
このマクロを開くとロゴが多くなりますので、直接編集することをお勧めします.
obj-yの後に一つ追加します.debug.o
このようにして、直接にこの2つの関数を呼び出すことができます.
#ifdef CONFIG_DEBUG_LL
adr r0, str_p1
bl printascii
mov r0, r9
bl printhex8
adr r0, str_p2
bl printascii
b __error
str_p1: .asciz "
Error: value = (0x"
str_p2: .asciz ").
"
.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_LL
printascii(buff);
#endif
}
vsprintifを使って文字列と変数をbuff内に保存し、printasciiを通じてシリアルポートに送ります.私の開発ボードはexynos 4412です.u-bootで直接シリアルポートを配置して、単一の文字を印刷できます.
/*
* uart_asm_init: Initialize UART in asm mode, 115200bps fixed.
* void uart_asm_init(void)
*/
.globl uart_asm_init
uart_asm_init:
/* set GPIO to enable UART */
@ GPIO setting for UART for UART0/1/2/3
ldr r0, =0x11400000
ldr r1, =0x22222222
str r1, [r0]
ldr r0, =0x11400020
ldr r1, =0x222222
str r1, [r0]
ldr r0, =S5PV310_CLOCK_BASE
ldr r1, =CLK_SRC_PERIL0_VAL
ldr r2, =CLK_SRC_PERIL0_OFFSET
str r1, [r0, r2]
ldr r1, =CLK_DIV_PERIL0_VAL
ldr r2, =CLK_DIV_PERIL0_OFFSET
str r1, [r0, r2]
ldr r0, =S5PV310_UART_CONSOLE_BASE
ldr r1, =0x111
str r1, [r0, #UFCON_OFFSET]
mov r1, #0x3
str r1, [r0, #ULCON_OFFSET]
ldr r1, =0x3c5
str r1, [r0, #UCON_OFFSET]
ldr r1, =UART_UBRDIV_VAL
str r1, [r0, #UBRDIV_OFFSET]
ldr r1, =UART_UDIVSLOT_VAL
str r1, [r0, #UDIVSLOT_OFFSET]
ldr r1, =0x4f4f4f4f
str r1, [r0, #UTXH_OFFSET] @'O'
直接シリアルレジスタを構成することにより、0 x 1140000、0 x 11400020などのシリアルポートを初期化する.ldr 0=S 5 PV 310_UART_CONSOSE.BASE取得プラットフォームに定義されているlog出力ポート、例えば、uart 1
最後の2行はプリント文字「O」、UTXH_です.OFFFSETレジスタは8 bitしか受け付けられませんので、1文字だけ印刷できます.
カラー初期化が完了したら、このように使用できます.
/* Print 'K' */
ldr r0, =S5PV310_UART_CONSOLE_BASE
ldr r1, =0x4b4b4b4b
str r1, [r0, #UTXH_OFFSET]