魏東山組込みLinuxビデオチュートリアル_3プロジェクトの戦闘フェイズとALSAサウンドカードをコンパイル_(ロングFS2410優れた開発ボードに基づいて)裸のボードテスト

まず、実験環境

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間で削除されました:

       clip_image002 [4]

      私は原因を見つけることができません悲しい笑顔絶望では、あなただけのステップバイ文を実行することができ、ステップのシリーズ(ポジショニングの効率を向上させるために、あなたは二分法を使用することができます)を介して、最終的には問題の核心が見つかりました:

画像

画像

      チャールズは解体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"

  。3、NandFlash K9F1208U0A /読み出し動作のK9F1208U0B

おすすめ

転載: www.cnblogs.com/normalmanzhao2003/p/12324519.html