Understanding the internal state ("visibility") of the Delta Driver is crucial for troubleshooting.
The -vis delta driver is not in mainline Linux. It exists in vendor BSPs (e.g., older Openmoko, FIC Neo1973 patches, and custom industrial RT-Linux builds). Expect the source structure:
drivers/video/s3c2410-vis/
vis_delta.c
vis_ioctl.c
vis_dma.c
s3c2410_vis.h
| Symptom | Likely Delta cause | Fix |
|---------|--------------------|-----|
| No image, FIFO overflow | Wrong PCLK polarity | Check VIDCON1.SIGPCLK |
| Green/pink stripes | DELTA_LINE_SZ mismatch | Set to width * bpp, not width |
| Random DMA fault | DELTA_START not cache-aligned | Use dma_alloc_coherent() |
| Interrupt flood | Missing DELTA_STATUS clear | Clear after reading | -vis On S3c2410x Delta Driver -
s3c2410camera.h):
Traditional ADCs use successive approximation. A Delta-Sigma ADC, however, oversamples the input and produces a serial bitstream. The -vis driver must capture this bitstream and run it through a decimation filter. In the S3C2410X, this is often done by attaching the Delta's DATA and CLK lines to the nRTS or nCTS pins of the UART or to the SPI interface running in "clock slave" mode.
Before diving into the driver, we must understand the target hardware. The S3C2410X contains four key registers relevant to the VIS Delta Driver: Understanding the internal state ("visibility") of the Delta
The "Delta" approach is critical here because modifying LCDCON1 (e.g., changing VCLK) requires a complete stop-and-start sequence, causing flicker. A Delta Driver avoids this by batching changes.
/* s3c2410_delta.c - simplified excerpt */ struct s3c2410_delta void __iomem *regs; int irq; u32 threshold; u32 motion_pixel_cnt; bool motion_detected; ;static void s3c2410_delta_start(struct s3c2410_delta *delta) = (delta->threshold << 8) & 0xFF00; ctrl | Symptom | Likely Delta cause | Fix
static irqreturn_t s3c2410_delta_irq(int irq, void *dev_id) struct s3c2410_delta *delta = dev_id; u32 status = readl(delta->regs + S3C2410_DELTA_STATUS);
if (status & (1 << 0)) // Motion event delta->motion_detected = true; delta->motion_pixel_cnt = (status >> 8) & 0xFFFFFF; // 24-bit counter wake_up_interruptible(&delta->wait_queue); // Clear interrupt writel(status, delta->regs + S3C2410_DELTA_STATUS); return IRQ_HANDLED; return IRQ_NONE;