版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
RevisionChangescomparedtoprevious概 編寫目 適用范 相 模塊介 模塊功能介 相關術(shù)語介 描述符 散列傳 模塊配置介 源碼結(jié)構(gòu)介 模塊體系結(jié)構(gòu)描 DMA驅(qū)動架構(gòu) DMA狀 模塊數(shù)據(jù)結(jié)構(gòu)描 模塊接口描 模塊開發(fā) DMA使用流程 demo程 Android系統(tǒng)支 模塊調(diào) config的配 測試用例選 測試操作步 總 概DMA開發(fā)模塊介dmaDirectMemoryAccess(直接內(nèi)存存取),cpu,直接在設備和內(nèi)存,內(nèi)存和內(nèi)存,設備和設備之間傳輸.DMA可以減cpu負擔,cpu可用于忙別的活,傳輸速度也比cpu搬運高得多.A20許多模塊內(nèi)置了DMA,sd,usbehci,nand等,DMA驅(qū)動,usbotg,audiocodec.DMA驅(qū)動,DirectMemoryAccess,即直接內(nèi)存存取,cpu,直接在設備和內(nèi)存,內(nèi)存和內(nèi)存,設備和設備之間傳輸.描述符指能被DMA硬件解析的一段內(nèi)存區(qū)域,其數(shù)據(jù)按一定的格式組織,包含源地址,目的地址,傳輸?shù)臄?shù)據(jù)長度等.DMA一次,就將多筆數(shù)據(jù)傳完,即一次啟動,批量傳輸上的散列傳輸,指前一筆數(shù)據(jù)傳完后,DMA驅(qū)動自動啟動下一筆傳輸,硬件硬件上的散列傳輸,指硬件將多筆傳完,硬件能自動解析下一個數(shù)據(jù)塊信息,無DMA驅(qū)動代碼在\linux-3.3\arch\arm\mach-sun7i\dma下模塊體系結(jié)構(gòu)描內(nèi)內(nèi)核dma接APdma使用dma硬內(nèi)核層對應驅(qū)動響應應用層請求,調(diào)用DMA模塊API進行數(shù)據(jù)傳輸.比如alsa驅(qū)動DMA模塊根據(jù)數(shù)據(jù)請求設置DMA硬件DMA硬件完成數(shù)據(jù)的實際傳輸DMA驅(qū)動組織Dma.c:dma模塊初始化dma中斷處理Dma_core.c:實Dma_interface.c:Dma_csp.c:dma硬件操作函數(shù)DMA狀增增加Id啟動dm停止dm停止dm增加增加Rdon所有buffer傳開定義了三種狀態(tài)idle:DMA硬件空閑的狀態(tài)running:DMA正在傳輸?shù)臓顟B(tài)模塊數(shù)據(jù)結(jié)構(gòu)描DMA通道信息DMA得到的句柄.structdma_channel_t{/*1used,0unuse/*channelid,0~15 /*dmachnnnelownername*/ reg_base;/*regsbaseaddr*/ /*cotinuemode*/ irq_spt;/*channelirqsupprottype,usedforirqhandleronlyenabledthencancallirqcallback*/structdma_cb_t /*halfdonecallbackfunc*/structdma_cb_t /*fulldonecallbackfunc*/structdma_cb_t /*queuedonecallbackfunc*/structdma_op_cb_t /*dmaoperationcallbackfunc*/structdes_save_info_tdes_info_save;/*savetheprevbufpara,usedsw_dma_enqueueenumdma_work_mode_eunion /*channelstateforchain/single /*dmachannellock*forchainmodestructlist_head cur_list;/*buflistwhichisbeingtranferring*/structlist_head /*buflistbkupfornexttranfer*/*forsinglemode *pcur_des;/*curbufferwhichistransferring*/structlist_head dma配置描述符結(jié)構(gòu)structstructcofig_des_t/*dmaconfigurationreg/*dmasrcphysaddrreg/*dmadstphysaddrreg/*dmabytecntreg/*dmaparamregstructcofig_des_t /*nextdescriptoraddresstypedefstructtypedefstructdes_itemstruct /*descriptorthatwillbesettohw structlist_head/*physicaladdrofthisdes_itemstruct/*listnode描述符管理單元DMA通道狀態(tài)typedeftypedefenum/*maybebeforestartorafterstopCHAN_STA_RUNING,/*transferringCHAN_STA_LAST_DONE/*thelastbufferhasdone,inthisstate,sw_dma_enqueuewillstartdma*/dmahalf/full/queuedone回調(diào)函數(shù) dma_cb_cause_ecause);structdma_cb_t /*函數(shù)指針*/ /*func的參數(shù)*/dma操作類型/*setoperationcallback/*sethalfdonecallback/*setfulldonecallback/*setqueuedonecallback /*getchannelstatus:idle/busy*/ /*getcurrentsrcaddress*/ /*getcurrentdstaddress*/ /*getbytecntleft/*startdma/*pausetransferring/*resumetransferring/*stopdmaenum{DMA_OP_START,模塊接口描原型:dm_hdl_tsw_dma_reqhar*name,enumdma_work_mode_e功能dma通道.name:dma通道名,由調(diào)用者取,可以為NULL,但不能與已有的 work_mode:dma工作模式,DMA_WORK_MODE_CHAIN表示chain模式,.返回:成功返回句柄,原型u32sw_dma_release(dm_hdl_t功能:dma通道返回:0,失敗返回出錯的行號原型u32sw_dma_ctl(dm_hdl_tdma_hdlenumdma_op_type_eopvoid功能dma控制函數(shù),用于啟動dma,停止dma,獲取數(shù)據(jù)傳輸狀態(tài),等enumdma_op_type_eenumdma_op_type_e/*startdma/*pausetransferring/*resume/*stopdma/*getchannelstatus:address op:pargparg操作所帶參數(shù),op參數(shù)意義不同返回:成功返回0,失敗返回出錯的行號./*setoperationcallback/*sethalfdonecallback/*setfulldonecallback/*setqueuedonecallback /*getbytecntleftaddress原型: dma_enque_phase_ephase);功能:dma之前,dma硬件參數(shù),參數(shù) 添加buffer的階段 該參數(shù)現(xiàn)無意義 請固定設enum形加加
一般的添加,即非以下三種情dmafulldone回調(diào)函數(shù)中添返回:0,失敗返回出錯的行號原型u32sw_dma_enqueue(dm_hdl_tdma_hdlu32src_addru32dst_addru32t,dma_enque_phase_ephase);功能buffer到隊列.src_addr:dst_addr:t:phase:傳輸階段.該參數(shù)現(xiàn)無意義,返回:0,失敗返回出錯的行號原型intsw_dma_getposition(dm_hdl_tdma_hdlu32*pSrc,u32功能:獲取當前傳輸位置信息.注:僅音頻模塊(spdif/i2s/ audio/pcm)用到,其參數(shù)pSrc:srcaddrpDst:dstaddr寄存器值返回:0,失敗返回出錯的行號功能:打印通道信息函數(shù).用于調(diào)試.返回:無.開開有新數(shù)據(jù)Y需要等待傳輸 成還Y結(jié)sw_dma_release dma通道sw_dma_ctl停止dma等待傳輸sw_dma_enqueue(sw_dma_ctl(啟動dmasw_dma_enqueue添加buffersw_dma_ctl(設置sw_dma_request申請dma通道sw_dma_config(硬件參數(shù)dma通道設置回調(diào)函數(shù)hd_cb(desbuffer傳輸一半時回調(diào)fd_cb(des隊列中buffer傳輸完時回調(diào)),qd_cb(des隊列中所有buffer傳輸完時回調(diào))配置dma參數(shù),如srcdrqtype(源地址類型burstlength(burst長度);dma通道demo#include#include/*src/dststartaddressstaticu32g_src_addr=0,g_dst_addr=/*curbufindexstatic t=cb_fd_normal-fulldonecallbackforcase@dma_hdl:dma@parg:argsregisterdwithcbReturns0ifsucess,theerrlinenumberif cb_fd_normal(dma_hdl_tdma_hdl,void{ uret=u32ucur_saddr=0,ucur_daddr=t=TOTAL_LEN_NORMAL/ONE_LEN_NORMAL; t=0; /*enqueueifnotdonet=atomic_add_return(1, t< t){printk("%s,line /*NOTE:fatalerr,whenreadhere, thaschangedbyotherplace,2012-12-2*/ ucur_saddr=g_src_addr+ t*ONE_LEN_NORMAL;ucur_daddr=g_dst_addr t* printk("%serr,line }else{/*bufenqueuecompleteprintk("%s,line //sw_dma_dump_chan(dma_hdl);/*fordebug/*maybeit'sthelastirq*/}if(0!=pr_err("%serr,line ,}cb_hd_normal-halfdonecallbackforcase@dma_hdl:dma@parg:argsregisterdwithcbReturns0ifsucess,theerrlinenumberif cb_hd_normal(dma_hdl_tdma_hdl,void{ uret=u32ucur_saddr=0,ucur_daddr=t=TOTAL_LEN_NORMAL/ONE_LEN_NORMAL; t=0; /*enqueueifnotdonet=atomic_add_return(1, t< t){printk("%s,line /*NOTE:fatalerr,whenreadhere, thaschangedbyotherplace,2012-12-2*/ ucur_saddr=g_src_addr+ t*ONE_LEN_NORMAL;ucur_daddr=g_dst_addr t* printk("%serr,line }if(0!=pr_err("%serr,line ,}waitdone_normal-waitdmatransferfunctionforcaseReturns0ifsucess,theerrlinenumberif { ret= timeout=2*/*waitdmadoneret=wait_event_interruptible_timeout(g_dtc_queue[DTC_NORMAL],\atomic_read(&g_adma_done)==1,timeout);/*resetdmadoneflagto0*/if(-ERESTARTSYS==ret)pr_info("%ssuccess!\n", return0;}elseif(0==ret)pr_info("%serr,timeout!\n", }elsepr_info("%ssuccesswithconditionmatch,ret }}
return { uret=0/*,tmp=0 *src_vaddr=NULL,*dst_vaddr=NULL; src_paddr=0,dst_paddr=0;dma_hdl_tdma_hdl=(dma_hdl_t)NULL;dma_cb_tdone_cb;dma_config_tdma_config; /*preparethebufferanddata (dma_addr_t*)&src_paddr,GFP_KERNEL);if(NULL=={uret=LINE gotoend;} (u32)src_vaddr,src_paddr);
(dma_addr_t*)&dst_paddr,GFP_KERNEL);if(NULL=={uret=LINE gotoend;} (u32)dst_vaddr,dst_paddr);/*initsrcbuffermemset(dst_vaddr,0x54,TOTAL_LEN_NORMAL);/*initlooppara*/ g_src_addr=src_paddr;g_dst_addr=dst_paddr;/*requestdmachanneldma_hdl=sw_dma_request("m2m_dma",CHAN_NORAML);if(NULL==dma_hdl){uret= gotoend;}pr_info("%s:sw_dma_requestsuccess,dma_hdl0x%08x\n",
/*setfulldonecallback*/done_cb.func= done_cb.parg=NULL;if(0!=sw_dma_ctl(dma_hdl,DMA_OP_SET_FD_CB,(void{uret=LINE gotoend;}pr_info("%s:setfulldone_cb /*sethalfdonecallback*/done_cb.func= done_cb.parg=NULL;if(0!=sw_dma_ctl(dma_hdl,DMA_OP_SET_HD_CB,(void*)&done_cb))uret= gotoend;}pr_info("%s:sethalfdone_cb /*configparamemset(&dma_config,0,sizeof(dma_config)); dma_config.xfer_type.src_bst_len=DATA_BRST_4; dma_config.xfer_type.dst_bst_len=DATA_BRST_4;dma_config.address_type.src_addr_mode=dma_config.address_type.dst_addr_mode=dma_config.src_drq_type=N_SRC_SDRAM;dma_config.dst_drq_type=N_DST_SDRAM;dma_config.bconti_mode=false; =CHAN_IRQ_HD|CHAN_IRQ_FD;if(0!=sw_dma_config(dma_hdl,&dma_config)){uret= gotoend;}pr_info("%s:sw_dma_config #if0/*addornotadd,bothok,2013-2-2821:08/*setsrc/dstsecutmp={uret=LINE gotoend;}pr_info("%s:DMA_OP_SET_SECURITY /*setwaitstate,ndmaonly{u32state=0;/*0~7,fromspecif(0!=sw_dma_ctl(dma_hdl,DMA_OP_SET_WAIT_STATE,{uret=LINE gotoend;} }#if/*setparareg,ddmaonly{dma_para_tpara; =para.src_wait_cyc= =para.dst_wait_cyc={uret=LINE gotoend;}
/* buf ONE_LEN_NORMAL)){uret= gotoend;} buf /*dumpchain*//*startdmaif(0!=sw_dma_ctl(dma_hdl,DMA_OP_START,{uret=LINE gotoend;}/*enqueueotherbuffer,withcallbackenqueuesimutanously{ t=0,ucur_saddr=0,ucur_daddr=t=TOTAL_LEN_NORMAL/ t= t)) {ucur_saddr=g_src_addr t*ucur_daddr=g_dst_addr t* printk("%serr,line }}pr_info("%s,line /*waitdmadoneif(0 {uret=LINE gotoend;} waitdone_normal NOTE:mustsleephere,becasewhen enqueuecomplete,butdatamightnottransfercomplete,2012-11-/*checkifdataokpr_info("%s:d heckok!\n", elsepr_err("%s:d heckerr!\n", uret= ;/*returnerr*/goto}/*stopandreleasedmachannelif(0!=sw_dma_ctl(dma_hdl,DMA_OP_STOP,{uret=LINE gotoend;}pr_info("%s:sw_dma_stopsuccess\n", if(0!=sw_dma_release(dma_hdl)){uret= gotoend;}dma_hdl=pr_info("%s:sw_dma_release if(0!=pr_err("%serr,line%d!\n", ,uret);/*printerrline*/ /*stopandfreedmachannel,ifneed*/if((dma_hdl_t)NULL!=dma_hdl){pr_err("%s,stopandreleasedmahandlenow!\n", if(0!=sw_dma_ctl(dma_hdl,DMA_OP_STOP,NULL))pr_err("%serr,line%d!\n", if(0!=sw_dma_release(dma_hdl))pr_err("%serr,line }pr_info("%s,line /*freedmamemory*/if(NULL!= if(NULL!= pr_info("%s,end!\n", returnuret;}#ifndef#ifndefTEST_CASE_NORMAL#define/*totallengthandonebuflength#defineTOTAL_LEN_NORMAL #defineONE_LEN_NORMAL u32 u32 u32u32 u32 #endif/*#endif/* #ifndefSUN7I_DMA_TEST_H#define#ifndefSUN7I_DMA_TEST_H#defineSUN7I_DMA_TEST_H#include<linux/kernel.h>#include<linux/init.h>#include<linux/module.h>#include<linux/types.h>#include< #include<linux/gfp.h>#include<linux/interrupt.h>#include<linux/init.h>#include<linux/ioport.h>#include<linux/in.h>#include<linux/string.h>#include<linux/delay.h>#include<linux/errno.h>#include<linux/skbuff.h>#include#include<linux/dma-map#include<linux/slab.h>#include<asm/io.h>#include<asm/pgtable.h>#include<asm/dma.h>#include<linux/delay.h>#include<asm/dma-map#include<linux/wait.h>#include#include#include*dmatestcaseenumdma_test_case_eDTC_NORMAL=0, /*casefornormalchannel*/ /*casefornormalchannelcontinuemode /*casefordedicatechannel*/ /*casefordedicatechannelcontinuemode*fordedicate /*enqueuedbufferafterdmalastdone,toseeifcancotinueautostart*/ /*manybufferenqueued,functiontest*/ /*stopwhendmarunning*/ /*two-threadrunsimutalously,pressuretestandmemoryleaktest*/externatomic_tg_adma_done;#endif SUN7I_DMA_TEST_H#include#include/*waitdmadonequeue,usedforwaitdmadone*/ g_adma_done=ATOMIC_INIT(0);/*dmadoneflagconstchar*case_name[]{"DTC_NORMAL", dma_test_init_waitqueue-initdmawaitstatic {u32i=}staticintdma_test_main(int{enumdma_test_case_ecur_test=(enumdma_test_case_e)id;u32ret=0;{caseret= case//ret= case//ret= case//ret= case//ret= case//ret case//ret= case//ret= ret= }if(0==printk("%s:testsuccess!\n", printk("%s:testfailed!\n", returnret;}ssize_ttest_store(structclass*class,structclass_attribute*attr,constchar*buf,size_tsize){intid=/*gettestidif(strict_strtoul(buf,10,(longunsignedint{pr_err("%s:invalidstring%s\n",func return-EINVAL;}pr_info("%s:string%s,testcase ,buf,if(0!=pr_err("%s:dma_test_mainfailed!id%d\n", pr_info("%s:dma_test_mainsuccess!id%d\n", returnsize;}ssize_thelp_show(structclass*class,structclass_attribute*attr,char{ssize_tcnt=cnt+=sprintf(buf+cnt,"usage:echoid>cnt+=sprintf(buf+cnt, idforcase %d\n",cnt+=sprintf(buf+cnt," idforcaseDTC_NORMAL_CONT_MODEis%d\n",(int)DTC_NORMAL_CONT_MODE);cnt+=sprintf(buf+cnt, idforcase %d\n",cnt+=sprintf(buf+cnt," idforcaseDTC_DEDICATE_CONT_MODEis%d\n",(int)DTC_DEDICATE_CONT_MODE);cnt+=sprintf(buf+cnt," idforcaseDTC_ENQ_AFT_DONEis%d\n",(int)DTC_ENQ_AFT_DONE);cnt+=sprintf(buf+cnt, idforcase %d\n",cnt+=sprintf(buf+cnt, idforcase %d\n",cnt+=sprintf(buf+cnt," idforcaseDTC_M2M_TWO_THREADis%d\n",(int)DTC_M2M_TWO_THREAD);cnt+=sprintf(buf+cnt,"casecnt+=sprintf(buf+cnt," casefornormalchannel\n");cnt+=sprintf(buf+cnt," normalchannelcontinuemode\n");cnt+=sprintf(buf+cnt," casefordedicatechannel\n");cnt+=sprintf(buf+cnt," DTC_DEDICATE_CONT_MODE:casefordedicatechannelcontinuemode\n");cnt+=sprintf(buf+cnt, belowisforcnt+=sprintf(buf+cnt," bufferafterdmalastdone,toseeifcancotinueautostart\n");cnt+=sprintf(buf+cnt," enqueued,functiontest\n");cnt+=sprintf(buf+cnt," dmarunning\n"); two-threadrunsimutalously,pressuretestandmemoryleaktest\n");return}staticstructclass_attributedma_test_class_attrs[]=ATTR(test,0220,NULL,test_store),/*not222,forCTS,othergroupcannothavewritepermission,2013-1-11*/ATTR(help,0444,help_show,staticstructclassdma_test_class= = =.class_attrs=static init{int /*initdmawaitqueue*//*registersysclassif(status<0)pr_info("%serr,status%d\n", pr_info("%ssuccess\n", return0;}*sw_dma_test_exit-exitthedmateststatic exit{pr_info("sw_dma_test_exit:}#ifdefMODULEMODULE_LICENSE("GPL");MODULE_AUTHOR("liugang");MODULE_DESCRIPTION("sun7iDmaTestdrivercode"); #endif/*MODULE*/Androiddma屬linux內(nèi)核模塊 和
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版出口企業(yè)信用評估合同規(guī)定與評級流程3篇
- 2024年貸款型二手房買賣合同履約保證金管理細則3篇
- 家庭飲食營養(yǎng)搭配的誤區(qū)與解析
- 設備驗收報告5篇
- 2024版雙方感情不和離婚協(xié)議書范本
- 《小劇場戲劇觀演關系間的重建》
- 家庭辦公與老年人生活質(zhì)量的提升
- 安全生產(chǎn)標準化從源頭上預防事故
- 公共洗手間的舒適性設計與空間美感提升策略研究
- 小學數(shù)學微課的多媒體應用策略
- 四川省成都市2022-2023學年高二上學期期末調(diào)研考試物理試題(原卷版)
- OBE教育理念驅(qū)動下的文學類課程教學創(chuàng)新路徑探究
- GB/T 20279-2024網(wǎng)絡安全技術(shù)網(wǎng)絡和終端隔離產(chǎn)品技術(shù)規(guī)范
- 2024年國家公務員考試《行測》真題卷(行政執(zhí)法)答案和解析
- 2024年首屆全國標準化知識競賽真題題庫導出版-下(判斷題部分)
- 一年級下數(shù)學教案-筆算兩位數(shù)減兩位數(shù)(退位減)-蘇教版秋
- 2024-2025學年高一地理新教材必修1配套課件 第6章 第4節(jié) 地理信息技術(shù)在防災減災中的應用
- 2024貴州省體育彩票管理中心招聘工作人員44人歷年高頻500題難、易錯點模擬試題附帶答案詳解
- 電梯維護保養(yǎng)分包合同
- 10以內(nèi)連加減口算練習題完整版139
- 2022-2023學年廣東省廣州市海珠區(qū)六年級(上)期末英語試卷(含答案)
評論
0/150
提交評論