まず、実験環境
1.1 仮想マシン環境
a) Vmware版本:Vmware Workstation 12.5.7
b)のUbuntuのバージョン:9.10
C)カーネルのバージョン:2.6.31.14
バージョンツールチェーンD):腕のlinux-gccの3.4.5
1.2 開発ボード
優れたFS2410開発ボード柳州、UDA1341サウンドカード
1.3デバッガ
ハードウェア:百ネットOpenJTAGを尋ねます
ソフトウェア:OpenOCD、Eclipseの3.6ヘリオス
第二に、デバッグプロセスレコード
1は、JP1開発ボードは、U-ブートDNWと0x60000でwindows.wavにプログラムさsound.binのnandflashアドレス0、にプログラムされたUSB機能により、NORスタートアップに設定されています
そして、NAND JP1を開始するように設定されています。ボードに再パワーヘッドフォン、シリアル端末のメニューは、選択します。[M] MINI2440または[T] TQ2440、ないサウンドヘッドフォンを!
2、デバッグコードOpenJTAG + Eclipseと
(参照の具体的な方法:百の質問ネットワークOpenJTAGデバッガ製品マニュアル「のEclipse、OpenOCD、OpenJTAGv3.1開発チュートリアルv5.pdf」2.4 Eclipseのデバッガを使用して:S3C2440のLEDプログラムとの一例として)
試運転レポートを起動した後:
init.cでnand_addrで0x33f8028c(ADDR = <アウト最適化>):125
調査は、中init.cのでます。#define NFADDR(*((揮発性はunsigned char *)0x4E00000C))、これは2440年、2410年ではないです。
ソリューション:
init.c変更します。
//の#define NFCONT(*((揮発性のunsigned long *)0x4E000004)) //の#define NFCMMD(*((揮発性はunsigned char *)0x4E000008)) //の#define NFADDR(*((揮発性はunsigned char *)0x4E00000C) ) //の#define NFDATA(*((揮発性はunsigned char *)0x4E000010)) //の#define NFSTAT(*((揮発性はunsigned char *)0x4E000020)) の#define NFCMMD(*((揮発性 符号なし CHAR *)0x4E000004)) #define NFADDR(*((揮発性 符号なし CHAR *)0x4E000008)) の#define NFDATA(*((揮発性 符号なし CHAR *)0x4E00000C)) の#define NFSTAT(*((揮発性 符号なし CHAR *)0x4E000010))
図3は、再び端末のシリアルポートメニューで、選択します:[M] MINI2440または[T] TQ2440は、ヘッドフォンは音を聞くことができます!
しかし、sound.bin再プログラムさnandflashには、開発ボードを再起動して、もう一度しようとすると、ヘッドフォンまだ音無し!
日食による4は、NANDに設置されたコードのデバッグサポートしていない、あなただけのデバッグOpenOCDにログインするTelnetクライアントを使用することができます
(参照の具体的な方法:百の質問ネットワークOpenJTAGデバッガ製品マニュアル「のEclipse、OpenOCD、OpenJTAGv3.1開発チュートリアルv5.pdf」2.2使用OpenOCD、OpenJTAGプログラミングプロセス、デバッガ)
停止します
load_image sound.bin 0x0の
ステップ0
再開した後、時々異常未定義命令に!
時にはそれは、PC B8に繰り返される、BC間で削除されました:
私は原因を見つけることができません。絶望では、あなただけのステップバイ文を実行することができ、ステップのシリーズ(ポジショニングの効率を向上させるために、あなたは二分法を使用することができます)を介して、最終的には問題の核心が見つかりました:
チャールズは解体sound.dis:
33f80330 <nand_read>: 33f80330: e92d41f0 push {r4, r5, r6, r7, r8, lr} 33f80334: e1823000 orr r3, r2, r0 33f80338: e1a0cb83 lsl ip, r3, #23 33f8033c: e1a0cbac lsr ip, ip, #23 33f80340: e35c0000 cmp ip, #0 ; 0x0 33f80344: e24dd008 sub sp, sp, #8 ; 0x8 33f80348: e1a05002 mov r5, r2 33f8034c: e1a04001 mov r4, r1 33f80350: 1a000031 bne 33f8041c <nand_read+0xec> … 33f8041c: e28dd008 add sp, sp, #8 ; 0x8 33f80420: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} 33f80424: e12fff1e bx lr
对应于init.c的nand_read:
if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) { //NAND_BLOCK_MASK=511,因为K9F1208 一页大小是512字节 return ; /* 如果地址或长度不对齐,就直接返回*/ }
通过查看r2寄存器的值,可知size=0x33D4,而0x33D4& 1ff !=0 ,所以程序直接return了!最终导致nand里的代码段未能拷贝到程序的链接地址,因此程序跑飞了!
经查,调用栈是这样的:
(head.S)
mov r0, #0
ldr r1, =_start
ldr r2, =__bss_start
sub r2, r2, r1
bl copy_code_to_sdram # 会调用init.c的copy_code_to_sdram(0, _start, __bss_start) ,其中,_start即.text ,而.text 和__bss_start都定义在sound.lds中
copy_code_to_sdram(src, dst, len) # 把程序从nand读出来拷贝到内存_start地址处,长度为__bss_start-_start
nand_read(src, dest, len)
查看sound.lds,有:
…
。= ALIGN(4); // 4バイトの現在のリンクアドレスが整列されていることを示し
__bss_start =。;
...
変更されました:= ALIGN(512);サウンドを再生するために、再び、ついにでき。!
注:K9F1208のNAND FS2410使用され、サイズがマニュアルによれば、読み出し動作、読み出すための任意のページ内アドレス512バイト、およびネットワークパケットであるが、コード最初nand_readを変更していないので、時間を持って変更。
第三に、要約
サウンドドライバは、ハードウェアの動作の詳細情報とフレームとベアボードの駆動デバッグ方法を処理するために、EURONAVY FS2410開発ボードに裸プレートUDA1341カードによって駆動試運転。
裸のボードの主な困難を駆動します:
1、コーデックチップ構成、(IISなどDAI()を含む、DMA)SOC設定、マシン構成(チップコーデック(CSB、SCLK、SDIN)を制御するためのピン接続端子)
2、問題に一度、どのようにデバッグしますか?
より良いアプローチはOpenJTAG + OpenOCDは、ソースレベルのデバッグ用のEclipseと組み合わせて使用するのですが、コード内でデバッグNANDしたい場合は、telnetのOpenOCDにアセンブリレベルに(欠点は、比較的煩雑な操作ですが、また、分析とデバッグをすることができますアセンブリコード)
第四に、参考文献
1、魏東山「組込みLinuxアプリケーション開発完全マニュアル」
2、魏東山 "エクリプス、OpenOCD、OpenJTAGv3.1開発チュートリアルv5.pdf"