基于Quick Capture技术的摄像头驱动方案
e=frame_size;
//以下为捕捉视频
//camera_info->fifo1_transfer_size=0;
//camera_info->fifo2_transfer_size=0;
②根据每帧的大小和描述器一次能传送的大小确定描述器的个数。
camera_info->fifo0_num_descriptors=
(camera_info->fifo0_transfer_size+SINGLE_DESCRIPTOR_TRANSFER_MAX-1)
/SINGLE_DESCRIPTOR_TRANSFER_MAX;
camera_info->fifo1_num_descriptors=…;
camera_info->fifo1_num_descriptors=…;
③判断是否超过DMA规定的描述器的大小限制。
④分配DMA描述器的地址,并赋给FIFO0。
camera_context->fifo0_descriptors_physical=
(unsigned)camera_context->dma_descriptors_physical;
cur_des_physical=(DMAC_DESCRIPTOR_T*)
camera_context->fifo0_descriptors_physical
⑤将每个描述器与1帧图片的每个数据块建立一一对应的关系。
for(j=0;j<camera_context->fifo0_num_descriptors;j++){
//建立描述符
cur_des_virtual->DDADR=
(unsigned)cur_des_physical+sizeof(DMAC_DESCRIPTOR_T);
//FIFO0物理地址z
cur_des_virtual->DSADR=CI_REGBASE_PHY+CIBR0;
cur_des_virtual->DTADR=darget_physical;
cur_des_virtual->DCMD=des_rtansfer_size
|DMAC_DCMD_FLOW_SRC
|DMAC_DCMD_INC_TRG_ADDR
|(DMAC_BURSTSIZE_16<<16);
//向前移动指针
remain_size-=des_transfer_size;
cur_des_virtual++;
cur_des_physical+
+;
target_physical+=des_transfer_size;
}
//停止DMA传送捕捉的帧
last_des_virtual=cur_des_virtual-1;
last_des_virtual->DDADR=(unsigned)camera_context->fifo0_descriptors_physical;
将每个描述器的DDADR(DMA描述器地址寄存器)指向下一个描述器的地址,将最后一个DDADR指向第一个描述器的地址,这样形成一个环路的描述器链。另外,还要设置DSADR(DMA源地址寄存器)。由于是从摄像头感应器到内存,所以FIFO的地址是源地址,DTADR(DMA目标地址寄存器)为内存,DCMD(DMA命令寄存器)设置传输大小和源流控制。
以上都建立好以后,DMA就可以传送数据了。传送数据的流程如图3所示。
结语
目前的嵌入式开发板对于摄像头感应器的数据传送方式各不相同。如NeoMagic公司开发的Mimagic5传送图片采用的是独立的DMA功能,而传送视频采用的是特定的内存访问通道,VideoCaptureInterface不通过DMA方式;而Intel公司的PXA27x采用QuickCaptre技术,从官方发布数据表明,明显地提高了视频信息的传送速度。
随着嵌入式设备不断的发展更新,将会有更多、更先进、更高速的数据传输技术被应用到嵌入式开发的各个领域。
《基于Quick Capture技术的摄像头驱动方案(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/143434.html
//以下为捕捉视频
//camera_info->fifo1_transfer_size=0;
//camera_info->fifo2_transfer_size=0;
②根据每帧的大小和描述器一次能传送的大小确定描述器的个数。
camera_info->fifo0_num_descriptors=
(camera_info->fifo0_transfer_size+SINGLE_DESCRIPTOR_TRANSFER_MAX-1)
/SINGLE_DESCRIPTOR_TRANSFER_MAX;
camera_info->fifo1_num_descriptors=…;
camera_info->fifo1_num_descriptors=…;
③判断是否超过DMA规定的描述器的大小限制。
④分配DMA描述器的地址,并赋给FIFO0。
camera_context->fifo0_descriptors_physical=
(unsigned)camera_context->dma_descriptors_physical;
cur_des_physical=(DMAC_DESCRIPTOR_T*)
camera_context->fifo0_descriptors_physical
⑤将每个描述器与1帧图片的每个数据块建立一一对应的关系。
for(j=0;j<camera_context->fifo0_num_descriptors;j++){
//建立描述符
cur_des_virtual->DDADR=
(unsigned)cur_des_physical+sizeof(DMAC_DESCRIPTOR_T);
//FIFO0物理地址z
cur_des_virtual->DSADR=CI_REGBASE_PHY+CIBR0;
cur_des_virtual->DTADR=darget_physical;
cur_des_virtual->DCMD=des_rtansfer_size
|DMAC_DCMD_FLOW_SRC
|DMAC_DCMD_INC_TRG_ADDR
|(DMAC_BURSTSIZE_16<<16);
//向前移动指针
remain_size-=des_transfer_size;
cur_des_virtual++;
cur_des_physical+
+;
target_physical+=des_transfer_size;
}
//停止DMA传送捕捉的帧
last_des_virtual=cur_des_virtual-1;
last_des_virtual->DDADR=(unsigned)camera_context->fifo0_descriptors_physical;
将每个描述器的DDADR(DMA描述器地址寄存器)指向下一个描述器的地址,将最后一个DDADR指向第一个描述器的地址,这样形成一个环路的描述器链。另外,还要设置DSADR(DMA源地址寄存器)。由于是从摄像头感应器到内存,所以FIFO的地址是源地址,DTADR(DMA目标地址寄存器)为内存,DCMD(DMA命令寄存器)设置传输大小和源流控制。
以上都建立好以后,DMA就可以传送数据了。传送数据的流程如图3所示。
结语
目前的嵌入式开发板对于摄像头感应器的数据传送方式各不相同。如NeoMagic公司开发的Mimagic5传送图片采用的是独立的DMA功能,而传送视频采用的是特定的内存访问通道,VideoCaptureInterface不通过DMA方式;而Intel公司的PXA27x采用QuickCaptre技术,从官方发布数据表明,明显地提高了视频信息的传送速度。
随着嵌入式设备不断的发展更新,将会有更多、更先进、更高速的数据传输技术被应用到嵌入式开发的各个领域。
《基于Quick Capture技术的摄像头驱动方案(第2页)》