EDMA 相关资料

上传人:优*** 文档编号:35702322 上传时间:2021-10-27 格式:DOC 页数:14 大小:45KB
收藏 版权申诉 举报 下载
EDMA 相关资料_第1页
第1页 / 共14页
EDMA 相关资料_第2页
第2页 / 共14页
EDMA 相关资料_第3页
第3页 / 共14页
资源描述:

《EDMA 相关资料》由会员分享,可在线阅读,更多相关《EDMA 相关资料(14页珍藏版)》请在装配图网上搜索。

1、 真诚为您提供优质参考资料,若有不当之处,请指正。 DM642基于CSL的EDMA配置方法 目录 前言 一.创建一个EDMA事件句柄 二.从PRAM(参数RAM区域)中分配事件的重载/连接参数 三.给EDMA事件分配传输结束代码,一般分配的结束代码等于EDMA事件通道号 四.配置EDMA事件的参数RAM的6个寄存器值 4.1.配置过程中需要禁止EDMA传输中断 4. 2.参数RAM配置 4.3.寄存器配置接口: 五.配置EDMA相关中断以及ISR 5.1. 安装EDMA向量中断号(物理中断号) 5.2. 是否允许一次传输结束后产生中断(使能传输结束中断) 5.3.

2、挂接传输结束中断的中断服务程序(ISR) 5.4. 使能EDMA事件号的EDMA传输 六.示例程序 6.1.示例程序1 6.2.示例程序2 前言 本文以DM642的VP口为例,描述了基于CSL的EDMA的使用方法,包括EDMA的创建,初始化等.本文中是通过VP的FIFO的阀值设置,触发(启动)EDMA的传输.当FIFO的接收到的数据或者需要发送的数据达到自己设定的阀值,将启动一次EDMA的传输,修改相应的EMDA参数RAM的寄存器值.关于阀值的设置详细见文档“采集功能的配置步骤”。 一.创建一个EDMA事件句柄 调用接口函数EDMA_Handle EDMA_open(int c

3、haNum, Uint32 flags); 1 / 14 在使用EDMA之前,都必须先调用这个函数. 示例: 如果需要打开VP0的通道A的Y,U,V的传输,对应的事件号EDMA_CHA_VP0EVTYA=16, EDMA_CHA_VP0EVTUA=17,EDMA_CHA_VP0EVTVA=18 EDMA_Handle EDMA_VPAY_handle, EDMA_VPAu_handle, EDMA_VPAV_handle; EDMA_VPAY_handle = EDMA_open(EDMA_CHA_VP0EVTYA, EDMA_OPEN_RESET); EDMA_VPAU_han

4、dle = EDMA_open(EDMA_CHA_VP0EVTUA, EDMA_OPEN_RESET); EDMA_VPAV_handle = EDMA_open(EDMA_CHA_VP0EVTVA, EDMA_OPEN_RESET); 参数flags-----EDMA_OPEN_RESET,表示复位EDMA通道,禁止中断,清除中断标志. 具体示例见示例程序1 二.从PRAM(参数RAM区域)中分配事件的重载/连接参数 函数接口:EDMA_Handle EDMA_allocTable(int tableNum); 此函数是为了实现复杂的数据传输方式,在传输BT656模式中,设置两帧

5、数据,每一帧数据分为两场:顶场和底场,第一帧的顶场传输完成连接到底场,底场数据传输完成连接到第二帧的顶场,顶场数据传输完成连接到底场数据,底场数据传输完成再连接到第一帧的顶场数据传输,用四个RLD形成一个循环,每次底场数据传输完成产生中断,通过中断函数,把这一帧的顶场和底场数据入队列,让DSP进行后续处理, 由于BT656由一个亮度分量和两个色度分量组成,因此,需要3*4个重载/连接参数 具体示例见示例程序1 三.给EDMA事件分配传输结束代码,一般分配的结束代码等于EDMA事件通道号 函数接口:int EDMA_intAlloc(int tcc); 具体示例见示例程序1 四.配置

6、EDMA事件的参数RAM的6个寄存器值 4.1.配置过程中需要禁止EDMA传输中断 EDMA_intDisable(chan->tcc[0]); EDMA_intDisable(chan->tcc[1]); 4. 2.参数RAM配置 函数接口:void EDMA_config(EDMA_Handle hEdma, EDMA_Config *config); typedef struct { Uint32 opt; //通道选择 Uint32 src; //源地址 Uint32 cnt; //阵列(二维)/帧(一维)计数 Uint32 dst;

7、 //目的地址 Uint32 idx; //阵列/帧索引 Uint32 rld; //重载地址参数 } EDMA_Config; EDMA_config(chan->hEdma[i], &cfgEdma);//配置EDMA通道事件RAM EDMA_config(chan->hRld[4 * i], &cfgEdma); //配置对应通道事件的传输事件RAM组 4.3.寄存器配置接口: EDMA_OPT_RMK(pri,esize,ds2,sum,dd2,dum,tcint,tcc,tccm,atcint,atcc,pdts,pdtd,link,fs); ED

8、MA_SRC_RMK(src) EDMA_CNT_RMK(frmcnt,elecnt); EDMA_DST_RMK(dst); EDMA_IDX_RMK(frmidx,eleidx); EDMA_RLD_RMK(elerld,link); 术语陈述: 对于传704*576大小的Y数据 EDMA_CNT_RMK(frmcnt,elecnt); 如果配置了EDMA传输的数据宽度为32位.一帧为704个数据,那么frmcnt=576,elecnt=704/4(字节) 这里的帧表示对数据的打包形式或者是说一种数据组织结构的总称,上面的例子表示704个数据为一帧. EDMA_ID

9、X_RMK(frmidx,eleidx);采用帧索引的话,eleidx=0,frmidx=704(一帧的数据个数). 具体示例见程序示例2 五.配置EDMA相关中断以及ISR 5.1. 安装EDMA向量中断号(物理中断号) EDMA的中断号为8, 为固定的 函数接口:Void IRQ_map(Uint32 eventId,, int intNumber); IRQ_map(IRQ_EVT_EDMAINT, irqId); 具体示例见程序示例2 5.2. 是否允许一次传输结束后产生中断(使能传输结束中断) 函数接口: void EDMA_intEnable(Uint32 t

10、ccIntNum); void EDMA_intDisable(Uint32 tccIntNum); void EDMA_intClear(Uint32 tccIntNum); EDMA_intClear(chan->tcc[0]); EDMA_intEnable(chan->tcc[0]); EDMA_intClear(chan->tcc[1]); EDMA_intEnable(chan->tcc[1]); 具体示例见程序示例2 5.3. 挂接传输结束中断的中断服务程序(ISR) 函数接口: EDMA_IntHandler EDMA_intHook(int tccN

11、um, EDMA_IntHandler funcAddr); EDMA_intHook(chan->tcc[0], captureEdmaISR); EDMA_intHook(chan->tcc[1], captureEdmaISR); 具体示例见程序示例2 5.4. 使能EDMA事件号的EDMA传输 函数接口: void EDMA_enableChannel(EDMA_Handle hEdma); for(i = 0; i < numEdmaChans; i ++) { EDMA_disableChannel(chan->hEdma[i]); EDMA_clearC

12、hannel(chan->hEdma[i]); EDMA_enableChannel(chan->hEdma[i]); } IRQ_enable(IRQ_EVT_EDMAINT); 具体示例见程序示例2 六.示例程序 6.1.示例程序1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for(j = 0; j <( _VPORT_NUM_EDMA_CHANS)&& retVal == IOM_COMPLETED; j ++) { if( (chan->hEdma[j] = E

13、DMA_open(chan->edmaChanNum[j], EDMA_OPEN_RESET))==EDMA_HINV //分配一个事件的重载或连接参数RAM表(6个字) || (chan->hRld[4 * j] = EDMA_allocTable(-1))==EDMA_HINV || (chan->hRld[4 * j + 1] = EDMA_allocTable(-1))==EDMA_HINV || (chan->hRld[4 * j + 2] = EDMA_allocTable(-1))==EDMA_HINV || (chan->hRld[4 * j + 3] = E

14、DMA_allocTable(-1))==EDMA_HINV /*分配传输结束代码==EDMA事件号*/ || (chan->tcc[j] = EDMA_intAlloc(chan->edmaChanNum[j])) == -1) { retVal = IOM_EALLOC; msg_print("entrymdCreateChan ---retVal=%d----------jinx",retVal); }/* if((port->...*/ msg_print("entry mdCreateChan ---retVal=%d--------------------jin

15、x",retVal); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6.2.示例程序2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EDMA_Config cfgEdma; for(i = 0; i < numEdmaChans; i ++) { Int optFld1 = EDMA_OPT_RMK(//YEVT通道

16、事件参数RAM edmaPri, // 1,EDMA传输具有最高优先级 EDMA_OPT_ESIZE_32BIT, EDMA_OPT_2DS_NO, //0,表示一维源 EDMA_OPT_SUM_NONE, //0,表示固定源地址 EDMA_OPT_2DD_YES, // 1,表示二维目的 EDMA_OPT_DUM_INC, // 1,目的地址根据2DS和FS位增加 EDMA_OPT_TCINT_NO, // 0,禁止传输结束中断 EDMA_OPT_TCC_OF(0), // 0,传输结束代码为0 EDMA_OPT_TCCM_OF(0),

17、//0,传输事件结束代码最大设置 EDMA_OPT_ATCINT_NO, // 0,禁止将要结束事件中断 EDMA_OPT_ATCC_DEFAULT, EDMA_OPT_PDTS_DISABLE,//源地址为片内外设传输方式0,禁止片内外设读 EDMA_OPT_PDTD_DISABLE,//目的地址为片内外设传输方式0,禁止片内外设写 EDMA_OPT_LINK_YES, // 1,事件参数连接使能 EDMA_OPT_FS_NO //0,数据或者阵列同步 ); Int optFld2a = EDMA_OPT_RMK( edmaPri, E

18、DMA_OPT_ESIZE_32BIT, EDMA_OPT_2DS_NO, EDMA_OPT_SUM_NONE, EDMA_OPT_2DD_YES, EDMA_OPT_DUM_INC, // 1,目的地址根据2DS和FS位增加 (i == 0 ? EDMA_OPT_TCINT_YES:EDMA_OPT_TCINT_NO), EDMA_OPT_TCC_OF(i == 0 ? chan->tcc[0] & 0x0f : 0), EDMA_OPT_TCCM_OF(i == 0 ? chan->tcc[0] >> 4 : 0), EDMA_OPT_ATCINT_NO, EDMA_O

19、PT_ATCC_DEFAULT, EDMA_OPT_PDTS_DISABLE, EDMA_OPT_PDTD_DISABLE, EDMA_OPT_LINK_YES, EDMA_OPT_FS_NO ); Int optFld2b = EDMA_OPT_RMK( edmaPri, EDMA_OPT_ESIZE_32BIT, EDMA_OPT_2DS_NO, EDMA_OPT_SUM_NONE, EDMA_OPT_2DD_YES, EDMA_OPT_DUM_INC, // 1,目的地址根据2DS和FS位增加 (i == 0 ? EDMA_OPT_TCINT_YES:ED

20、MA_OPT_TCINT_NO), EDMA_OPT_TCC_OF(i == 0 ? chan->tcc[1] & 0x0f : 0), EDMA_OPT_TCCM_OF(i == 0 ? chan->tcc[1] >> 4 : 0), EDMA_OPT_ATCINT_NO, EDMA_OPT_ATCC_DEFAULT, EDMA_OPT_PDTS_DISABLE, EDMA_OPT_PDTD_DISABLE, EDMA_OPT_LINK_YES, EDMA_OPT_FS_NO ); thrld = (i == 0) ? chan->yThrld : chan->cThrl

21、d; cfgEdma.src = EDMA_SRC_RMK(chan->edmaAddr[i]); if(chan->interlaced) //隔行扫描模式 noted by jinx 2008.06.23 { if(!(params->cmode & _VPORT_MASK_RAW))//BT.656 { /* to merge the two fields together */ /* EDMA is configured to transfer only field 1 initially */ /* line pitch is twice the line size

22、*/ /* this requires that the threlhold is the same as line size */ /* first field */ //#define EDMA_CNT_RMK(frmcnt,elecnt) //阵列数为288-1;数据计数=704/4, //因为设置为32位数据宽度,而thrld表示2字的个数, //因此转换为数据计数的时候需要把thrld*2,即(thrld << 1) //noted by jinx 2008.06.12 cfgEt = EDMA_CNT_RMK((chan->numEventsFld1) - 1

23、, (thrld << 1)); if(chan->mergeFlds) { //#define EDMA_IDX_RMK(frmidx,eleidx) //thrld << 4表示隔行存放数据,留出存放场2或者场1的一行数据存储空间, //thrld << 3表示连续存储,即存放完此场的一行数据后,接着还是存放此场的下一行数据 cfgEdma.idx = EDMA_IDX_RMK(thrld << 4, 0); } else { cfgEdma.idx = EDMA_IDX_RMK(thrld << 3, 0); } /* hard code the first two f

24、rames as current and reload buffers */ /* first field */ cfgEdma.rld = EDMA_RLD_RMK(0, chan->hRld[4 * i + 1]); cfgEdma.opt = optFld1; cfgEdma.dst = EDMA_DST_RMK(*((Int *)(&chan->viops[0].frame.iFrm.y1) + i)); EDMA_config(chan->hEdma[i], &cfgEdma);//配置EDMA通道事件RAM EDMA_config(chan->hRld[4 * i

25、], &cfgEdma); //配置对应通道事件的传输事件RAM组 cfgEdma.dst = EDMA_DST_RMK(*((Int *)(&chan->viops[1].frame.iFrm.y1) + i)); cfgEdma.rld = EDMA_RLD_RMK(0, chan->hRld[4 * i + 3]); EDMA_config(chan->hRld[4 * i + 2], &cfgEdma); /* second field */ cfgEdma.opt = optFld2a; cfgEt = EDMA_CNT_RMK((chan->numEvents-ch

26、an->numEventsFld1) - 1, (thrld << 1)); cfgEdma.dst = EDMA_DST_RMK(*((Int *)(&chan->viops[0].frame.iFrm.y2) + i)); cfgEdma.rld = EDMA_RLD_RMK(0, chan->hRld[4 * i + 2]); EDMA_config(chan->hRld[4 * i + 1], &cfgEdma); cfgEdma.opt = optFld2b; cfgEdma.dst = EDMA_DST_RMK(*((Int *)(&chan->viops[1].f

27、rame.iFrm.y2) + i)); cfgEdma.rld = EDMA_RLD_RMK(0, chan->hRld[4 * i]); EDMA_config(chan->hRld[4 * i + 3], &cfgEdma); } } } C64X?DSP?EDMA小结及实例详解 (1)EDMA概要 ①EDMA数据传输有两种发起方式: CPU发起的EMDA数据传输(非同步方式):需要传输时,CPU设置ESR寄存器的相应位为1,从而触发一个EDMA事件的产生,事件对应的通道参数被送往地址硬件并且完成相应的处理,这种非同步方式的实时数据传输无需设定EER寄存器; ?

28、 事件触发方式EDMA数据传输(同步方式):ER寄存器保存外设发送过来的事件,一旦CPU设置EER寄存器的相应位为1后,ER中的事件才会提交给事件编码器(Event Encoder),并且进一步引起相关的传输参数的发送给地址产生硬件;如果EER中对应于某事件的位没有置1,则ER寄存器中的事件将保留,一旦置1则触发EDMA的传输,这种特性可以应用到EDMA Chain传输,需要EER和CCER结合使用; ? (2)EDMA数据传输类型: EDMA有两种类型的数据传输:1D和2D的(OPT.2DS和OPT.DDS标示源地址和目的地址的数据传输类型,即有4种组合方式);数据的维数表明了数据的组

29、成方式: ? ①1D数据 ? 数据组成是“块->帧->元素”;一个块中的每帧数据是独立处理(即可以理解亦为2D数据,但是第二维永远是1),每次处理是一个元素,因此一帧中的数据元素可以是在同一个内存地址、连续的地址或者是与同一帧中的前面的数据元素地址具有一定偏移(Offset,由ELEIDX通道参数指定)的某地址;不同帧之间的内存地址偏移由FRMIDX通道参数指定(两帧的第一个元素之间的偏移或者后一帧的第一个元素的地址与前一帧的最后一个元素地址的偏移,具体依赖于通道参数FS的设定);每帧的数据元素个数可以不同,由通道参数ELECNT指定,传完一帧数据后由ELERLD重新载入块中的下一帧的

30、数据元素个数ELECNT;块中的帧的个数由通道参数FRMCNT指定; ? 1D数据传输有两种同步方式:OPT.FS=0,元素同步方式;OPT.FS=1,帧同步方式; ? 元素同步时,一次同步事件引起一帧中的一个元素的传输,每传输一次ELECNT递减1;当同步事件触发时,ELECNT=1表明是一帧的最后一个数据元素,此时EDMA控制器除了完成最后这个元素的传输外,还需要重新载入ELECNT(通过ELERLD)并且FRMCNT递减1;ELEIDX表示元素之间的偏移,FRMIDX表示一帧的最后一个元素和下一帧的第一个元素之间的偏移;如果OPT.LINK=1时,传输完成中断产生(FRMCNT=

31、0)就重新从PRAM中载入当前通道的其他参数; ? 帧同步时,一次同步事件引起一帧数据的传输,FRMIDX表示两帧的第一个元素之间的偏移; ? ② 2D数据 ? 数据组成为“块->数组->元素”,同一数组中的元素是连续存放的,因此ELEIDX无意义;数组中的元素素引表示2D的第一维,块中的数组索引表示2D的第二维;FRMIDX的值依赖于OPT.FS的设定; ? OPT.FS=0:表示一次同步事件传输一个数组,此时FRMIDX是数组首地址之间的偏移;每传完一个数组,FRMCNT递减1;当OPT.LINK=1并且FRMCNT递减至0时,从PRAM的中重新载入当前通道的其他参数;

32、 ? OPT.FS=1:表示一次同步事件传输一个块;FRMIDX表示前一个数组的最后一个元素的地址与后一个数组的第一个元素的地址之间的偏移;如果OPT.LINK等于1,则当整块数据传完时,重新从PRAM中为当前通道载入新的参数; ? (3)EDMA传输过程的源/目的地址的修改 ? 在每次同步事件触发EDMA数据传输,并且传输完成后,需要对源/目的地址进行更新;地址的更新方式由SUM/DUM进行设定,并且和2DS、2DD以及FS是密切相关的; ? (4)数据元素大小和对齐方式 ? 源/目的地址是在元素大小的边界对齐的,因此要注意指向源/目的地址的指针的类型需要OPT.ESIZ

33、E匹配; ? (5)FRMCNT和ELEMCNT的更新 QUESTION:每次进行计数更新时,ELERLD的值哪里来的? ? (6)EDMA Linking Transfer ? 当传输完成时(根据当前通道参数设定已经传完所有数据了,具体条件如下表所示),并且OPT.LINK=1,EDMA控制器会根据通道参数LINK(非OPT.LINK,16bits)从PaRAM中的其他位置(以24个字节对齐,因为通道参数为6WORD)重新载入当前传输通道的参数;可以链接到一个空的通道参数集(NULL Parameter)来停止EDMA传输,也可以自链接(用于循环缓冲处理或者重复的数据传输);L

34、inking过程中不对相关寄存器作判定; ? (7)EDMA中断 ? C64X DSP的EDMA控制器的所有64个通道只产生一种中断:EDMA_INT。如果需要让第n个EDMA通道(或者QDMA请求)可以在传输完成时可以产生中断通知CPU的话,应该如下设定: u OPT.TCINT=1:表示启用传输完成中断 ? u OPT.TCC=n:在传输完成时,CIPR[TCC]=1,用于标记对应通道的传输完成,即便对应的CIER位没有启动,传输完成事件还是会在CIPR记录,即挂起的含义所在; ? u OPT.CIER[n]=1:表示立即允许挂起的第n个通道传输完

35、成事件触发EDMA_INT中断发送给CPU; 其中,TCC用于表示的通道的位数不够时,可以扩展使用TCCM(即TCCM:TCC),CIPR和CIER均由两个寄存器组成:CIPRL+CIPRH以及CIERL+CIERH。 ? 中断服务例程ISR读取CIPR,确定哪一个通道完成了数据传输,进行相应的处理。ISR在进行处理之前需要清除CIPR中确定了通道的位(写入1到相关位清除,写入0不起作用),目的是记录以后的传输完成事件的发生。在中断服务例程对某通道的传输完成中断进行服务后,因为期间有可能有其他通道传输完成了,也已经设置了CIPR中的相应位,或者也有可能本来有好几个中断挂起了并且现在触发了

36、,因此中断服务例程必须检查所有的CIPR并全部完成中断服务才行。当CIPR[n]&CIER[n]=1时,则设置对应的IFR为1,防止在退出ISR时丢失中断并且使得可以多次调用ISR。中断服务例程的一个任务是清除CIPR和CIER中的与通道对应的位。 ? C64X DSP除了传输完成中断外,还有交替性传输完成中断,即在传输过程中完成一个传输子过程(如传完一个数据元素、传完一个帧/数组数据;2D帧同步传输没有交替性传输完成中断)给CPU发送一个中断,相应的设定由OPT.ATINT、OPT.ATCC设定,处理过程和传输完成中断雷同,区别只是在传输还没全部完成的过程中进行中断处理而已。 这是使用

37、BIOS和CSL LIB 作EDMA简单例子. 在CCS BIOS 中需要作 中断--EDMA--edmaHwi 的设置. Spru234 和 spra636a 都是有用的参考 解释见注释. void main() { initEdma(); //Edma 初始化 initHwi(); //中断初始化 EDMA_setChannel(hEdma); //开始EDMA传送 while (1) {} } void initEdma(void) { EDMA_Config gEdmaConfig; //EDMA设置表 hEdma = EDMA_open(EDMA_CHA_AN

38、Y, EDMA_OPEN_RESET); // gXmtTCC = EDMA_intAlloc(-1); //分配一个可用的TCC .... //根据实际需要填写EDMA设置表 EDMA_config(hEdma, &gEdmaConfig); 设置EDMA通道 hEdmaReload = EDMA_allocTable(-1); //得到EDMA重载标实 EDMA_config(hEdmaReload, &gEdmaConfig); // 设置EDMA重载通道 EDMA_link(hEdma, hEdmaReload); //设置EDMA重载 EDMA_link(hEdmaReload, hEdmaReload); //设置EDMA重载 EDMA_intClear(gXmtTCC); // 清除可能的EDMA中断 EDMA_intEnable(gXmtTCC); // 打开EDMA中断 EDMA_intHook(gXmtTCC, edmaHwi); //通知系统edmaHwi是中断服务者 } void edmaHwi(int tcc) //中断服务 { 。。。。//准备数据 EDMA_setChannel(hEdma); //再次开始EDMA传送 } 温馨提示:最好仔细阅读后才下载使用,万分感谢!

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!