FC2ブログ

[NEEK][LCD表示]SGDMA設定手順

なんか動いた。
ここまで来るのに長かった。。。良く分からんサンプルデザインのCソースを解読して、なんだかんだとやってたら
初めて、SGDMAディスクリプタテーブルへコマンドが発行され、その後、転送が実行されたみたい。
SGDMAでハマってから、どれくらい経ったことか。
成功してみれば、こんなに時間かかった原因は「C言語がわからな過ぎた事」かな。素直にExample Designをマネ
出来るくらいの知識があればあっという間にここまで来れるんでしょう。きっと。

以下波形を見ても次の点から、一歩前進したようだ。
  ・最上段のRGB_OUTは今まで、ずっと不定値だったが、SGDMA動作後、初めてValid値を出力(10011001)。
  ・上から2段目のcommand_fifo_emptyは、これまでずっとHだったが、正常にコマンドが入ったからLへ。
  ・SGDMA:REGの段のactual_bytes_transferredは、今まで0のままだったが、転送量を示すようになった。

NEEK_SGDMA_OK_1ST_100129

SOPCB構成も実は変更した。以下が変更点。
  ・以前はvramにディスクリプタテーブルも配置し、画像ソースも同じ場所へ入れるつもりでいた。
   でもよくよく考えると矛盾があるので、sgdma_descを新たに追加し、こちらへディスクリプタテーブル配置。
  ・冷静に考え直してMaster、Slave接続を変更。
     csr = SGDMAコア内のレジスタ。よって、NiosのInst&Data Masterと接続すべき。
     descriptor_read = ディスクリプタと通信するから、追加したsgdma_descと接続。
     descriptor_write = 同上。
     m_read = Memoryリードの事と予想。ならば、画像ソース元であるvramと接続すべき。

SOPCB_TREE_MOD_POINT_100129

■設定手順 (注)以下はまだ実験途中。不要な設定あるかも。
 ①構造体alt_sgdma_devを使って、今回回路に含まれる「Memory to Stream」用の構造体を宣言。
  その後、
     SGDMA用のベースアドレス
     ディスクリプタテーブルが存在するメモリのアドレス
     現在実行中のその次のディスクリプタの場所
  を設定。

#define SGDMA_BASE 0x00000040
#define SGDMA_DESC 0x00002000
      :
alt_sgdma_dev sgdma_mem2st;
sgdma_mem2st.base = (void*)SGDMA_BASE;
sgdma_mem2st.descriptor_base = (void*)SGDMA_DESC;
sgdma_mem2st.next_descriptor = (void*)SGDMA_DESC;

 ②ディスクリプタテーブル用メモリへ、各種コマンドを設定。
  コマンドの種類はAlteraのデータシートに記載。そのコマンド配置順通りに、source addressからdesc control
  までをWriteする関数がwr_sgdma_desc(自作)。値はデタラメ。

// source address
// | destination address=0 for Avalon-ST destination
// | | next descriptor pointer
// | | | bytes to transfer
// | | | | desc control
// | | | | |
wr_sgdma_desc(SGDMA_DESC, 0x0, SGDMA_DESC, 0x33, 0x11) ;

 ③データシート、及びExample Designとして登録してあったソース(altera_avalon_sgdma.c)から「必要では?」
  と思ったコマンドをマネしてテキトーに書いてみた。以下2つ。

alt_avalon_sgdma_construct_mem_to_stream_desc(
(void *)SGDMA_DESC,
(void *)SGDMA_DESC,
(void *)VRAM_S2,
(unsigned short)0x0400,
0x00000001,
0x00000001,
0x00000001,
0x0000000a
);

hoge = alt_avalon_sgdma_do_sync_transfer( &sgdma_mem2st, (void *)SGDMA_DESC);
if (hoge == 0 ) {
printf("success");
}
else {
printf("fail");
}

  ちなみに、2個目は成功すると戻り値が0であるため、hogeへ格納して、デバッグ用に標準出力させている。
  しかし、なぜかSimでUARTから出て来ない・・・

(この記事は随時、修正、更新して手順を完成させたいと思う)
スポンサーサイト
カレンダー
12 | 2010/01 | 02
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

Author:bobgosso
FPGAのブログへようこそ!

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード