📄 dma.c
字号:
static int malloc_buffer(){ printk("malloc buffer\n"); if ((csi_data_buf = (U32 *) __get_free_pages(GFP_KERNEL, 8))) // 128 pages = 128x4K = 512K { dma_buf_phy_addr = virt_to_phys((void *) csi_data_buf);// dprintcsi2c("Buffer start: 0x%08x, DMA addr: 0x%08x\n", printk("Buffer start: 0x%08x, DMA addr: 0x%08x\n", (int) csi_data_buf, (int) dma_buf_phy_addr);// (int) csi_data_buf, (int) dma_buf_phy_addr); } else { printk ("*** ERROR: cannot allocate buffer memory for driver ! ***\n"); return -1; } if ((csi_data_buf2 = (U32 *) __get_free_pages(GFP_KERNEL, 8))) // 128 pages = 128x4K = 512K { dma_buf_phy_addr2 = virt_to_phys((void *) csi_data_buf2); } return 0; // 128 pages = 128x4K = 512K}static void free_buffer(){ if (csi_data_buf) __free_pages((void *) csi_data_buf, 8); // 512K if (csi_data_buf2) __free_pages((void *) csi_data_buf2, 8);}//------------------------------------//// Capture image data with DMA//// Unified function for all // supported image size capture//// Return TRUE if success// Return FALSE if FIFO is overrun////------------------------------------static U32 SFCM_capture_DMA(U32 nPixel){ dma_data_size = nPixel; readSeqNum = capSeqNum = SOFseqNum = 0; stopCapture = 0; PRP_enable(); return TRUE;}void dma_complete_handler(){ disable_dma(dma_channel); _reg_DMA_DISR = (1 << dma_channel); // clear DMA complete interrupt flag wake_up_interruptible(&dma_wait); enable_dma(dma_channel); /* if (*(U32 *) CSI_STS_REG & 1) { printk("!!! Data in FIFO !!!\n"); return; } */}static void dma_error_handler(int error_type){ printk("*** CSI DMA error, type = 0x%08x ! ***\n", error_type);}static void csi_intr_handler(int irq, void *dev_id, struct pt_regs *regs){ if (_reg_CSI_CSISTATR & 0x10000) // SOF intr ? { _reg_CSI_CSISTATR = 0x10000; // clear SOF intr if (SOFseqNum == 0) { _reg_CSI_CSICR1 &= ~0x10000; //disable SOF intr } else { return; } } return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -