!streaming_dma_afu Intel PACのサンプル streaming_dma_afu の動作をあれこれ調査. ::ソフトウェア * sw/fpga_dma_st_test.cpp ** main関数.引数の解析(parse_args) ** do_action で処理を開始 * sw/fpga_dma_st.cpp ** MMIOWrite64Blk/MMIOWrite32Blk/MMIORead64Blk/MMIORead32Blk ** dispatcherWorker ** completionWorker ** fpgaDMAOpen/fpgaDMAClose/fpgaGetDMAChannelType/fpgaDMATransferInit/fpgaDMATransferReset/fpgaDMATransferDestroy ** fpgaDMATransferSetSrc/fpgaDMATransferSetDst/fpgaDMATransferSetLen/fpgaDMATransferSetTransferType/ *** pthread_mutex_lockとってfpga_dma_transfer_t方の引数のパラメタをアップデート ** fpgaDMATransferSetTxControl/fpgaDMATransferSetRxControl/fpgaDMATransferSetTransferCallback/fpgaDMATransferSetLast/fpgaDMATransferGetBytesTransferred/fpgaDMATransferCheckEopArrived ** fpgaDMATransfer *** dma->ingress_queue.push(sw_desc) でDMA処理を実行 ** fpgaDMAInvalidate *** pthread_mutex_lockとってfpga_dma_transfer_t方の引数のパラメタをアップデート * sw/fpga_dma_st_test_utils.cpp ** do_action - 実際の処理のエントリ関数 *** non_loopback_test/loopback_testを呼び出す ** loopback_tset *** pthread_createでm2sworkerとs2mworkerを起動.各スレッドが終了するまで待つ(pthread_join) ** non_loopback_test *** config->directionによって m2sworker か s2mworker を呼び出す ** stomCb/mtosCb - バイト数のカウント ** m2sworker, s2mworker *** fpgaDMATransferSetSrc, fpgaDMATransferSetDst, fpgaDMATransferSetLen, fpgaDMATransferSetTransferTypeでDMAセット *** m2sworker: fpgaDMATransferSetTxControl(transfer, TX_NO_PACKET/GENERATE_SOP/GENERATE_EOP/TX_NO_PACKET) で 送信 *** s2mworker: fpgaDMATransferSetRxControl(transfer, rx_ctrl); で 受信 * sw/fpga_pattern_checker.cpp ** start/stop_checker, wait_for_checker_completeでpacket_generaterの制御 *** fpgaReadMMIO32/fpgaWriteMMIO32でレジスタの読み書きをして制御する * sw/fpga_pattern_gen.cpp ** start/stop_generator, wait_for_generator_completeでpacket_generaterの制御 *** fpgaReadMMIO32/fpgaWriteMMIO32でレジスタの読み書きをして制御する * sw/fpga_dma.h ** fpgaDMAXXX系などの関数のプロトタイプ * sw/fpga_dma_st_common.h ** debug_print/error_printなどの定義 * sw/fpga_dma_st_internal.h ** FPGA制御関連のdefineや構造体 * sw/fpga_dma_st_test_utils.h ** fpga_dma_st_testで使う定数などの定義 * sw/fpga_dma_types.h ** DMA転送用の構造体の定義 * sw/fpga_pattern_checker.h ** pattern_checkerのレジスタのベースアドレス,レジスタ読み書き用の構造体 * sw/fpga_pattern_gen.h ** pattern_generatorのレジスタのベースアドレス,レジスタ読み書き用の構造体 * sw/x86-sse2.h ** x86 SSE2でデータのアライメントを取るためのヘルパー関数のプロトタイプ * sw/x86-sse2.S ** x86 SSE2でデータのアライメントを取るためのヘルパー関数の実装(アセンブラ) ::ハードウェア * hw/rtl/QSYS_IPs/custom_pattern_generator/mtm_custom_pattern_generator.v ** パターンジェネレータ.pattern_memoryのデータをAvalon-STで出力 * hw/rtl/QSYS_IPs/custom_pattern_checker/mtm_custom_pattern_checker.v ** パターンチェッカ.Avalon-STで受け取ったデータとpattern_memoryのデータを比較する * hw/rtl/QSYS_IPs/avst_decimator/avst_decimator.sv ** Avalon-STで入ってきたデータをAvalon-STで打ち返す(snk_data -> src_data) ** decimation_counterの値でsrc_validを制御(なので,decimationされる)