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
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]