dma 是soc上的硬件模块之间数据通信的接口,基本所有模块上都用到了它,他们都是固定的api,虽然只要知道api怎么调用就够用了,但是还是有必要看看底层的逻辑是什么。
documentation/dmaengine.txt
documentation/dma-api.txt
documentation/dma-apt-howto.txt
dma_alloc_coherent--->ops->alloc == arm_dma_alloc
dma_request_slave_channel_compat---> __dma_request_slave_channel_compat ---> dma_request_slave_channel ---> of_dma_request_slave_channel --->
ofdma->of_dma_xlate == (of_dma_controller_register--->at_dma_xlate) --->dma_request_channel--->__dma_request_channel--->private_candidate
dmaengine_slave_config--->dmaengine_device_control---> chan->device->device_control == atc_control--->set_runtime_config--->convert_burst
dma_map_single--->dma_map_single_attrs--->ops->map_page == arm_dma_map_page
sg_init_table
sg_dma_len
device_prep_slave_sg == atc_prep_slave_sg
tx_submit ==atc_tx_submit--->atc_dostart
device_issue_pending==atc_issue_pending--->atc_advance_work--->atc_complete_all--->atc_chain_complete--->callback--->dma_run_dependencies