コード例 #1
0
static void solo_fillbuf(struct solo_filehandle *fh,
			 struct videobuf_buffer *vb)
{
	struct solo6010_dev *solo_dev = fh->solo_dev;
	dma_addr_t vbuf;
	unsigned int fdma_addr;
	int frame_size;
	int error = 1;
	int i;

	if (!(vbuf = videobuf_to_dma_contig(vb)))
		goto finish_buf;

	if (erase_off(solo_dev)) {
		void *p = videobuf_queue_to_vaddr(&fh->vidq, vb);
		int image_size = solo_image_size(solo_dev);
		for (i = 0; i < image_size; i += 2) {
			((u8 *)p)[i] = 0x80;
			((u8 *)p)[i + 1] = 0x00;
		}
		error = 0;
		goto finish_buf;
	}

	frame_size = SOLO_HW_BPL * solo_vlines(solo_dev);
	fdma_addr = SOLO_DISP_EXT_ADDR(solo_dev) + (fh->old_write * frame_size);

	for (i = 0; i < frame_size / SOLO_DISP_BUF_SIZE; i++) {
		int j;
		for (j = 0; j < (SOLO_DISP_BUF_SIZE / SOLO_HW_BPL); j++) {
			if (solo_p2m_dma_t(solo_dev, SOLO_P2M_DMA_ID_DISP, 0,
					   vbuf, fdma_addr + (j * SOLO_HW_BPL),
					   solo_bytesperline(solo_dev)))
				goto finish_buf;
			vbuf += solo_bytesperline(solo_dev);
		}
		fdma_addr += SOLO_DISP_BUF_SIZE;
	}
	error = 0;

finish_buf:
	if (error) {
		vb->state = VIDEOBUF_ERROR;
	} else {
		vb->state = VIDEOBUF_DONE;
		vb->field_count++;
		do_gettimeofday(&vb->ts);
	}

	wake_up(&vb->done);

	return;
}
コード例 #2
0
ファイル: solo6010-core.c プロジェクト: ssraghavan76/solo6x10
static ssize_t sdram_offsets_show(struct device *dev,
				  struct device_attribute *attr,
				  char *buf)
{
	struct solo6010_dev *solo_dev =
		container_of(dev, struct solo6010_dev, dev);
	char *out = buf;

	out += sprintf(out, "DISP: 0x%08x @ 0x%08x\n",
		       SOLO_DISP_EXT_ADDR(solo_dev),
		       SOLO_DISP_EXT_SIZE);

	out += sprintf(out, "EOSD: 0x%08x @ 0x%08x (0x%08x * %d)\n",
		       SOLO_EOSD_EXT_ADDR(solo_dev),
		       SOLO_EOSD_EXT_AREA(solo_dev),
		       SOLO_EOSD_EXT_SIZE(solo_dev),
		       SOLO_EOSD_EXT_AREA(solo_dev) /
		       SOLO_EOSD_EXT_SIZE(solo_dev));

	out += sprintf(out, "MOTI: 0x%08x @ 0x%08x\n",
		       SOLO_MOTION_EXT_ADDR(solo_dev),
		       SOLO_MOTION_EXT_SIZE);

	out += sprintf(out, "G723: 0x%08x @ 0x%08x\n",
		       SOLO_G723_EXT_ADDR(solo_dev),
		       SOLO_G723_EXT_SIZE);

	out += sprintf(out, "CAPT: 0x%08x @ 0x%08x (0x%08x * %d)\n",
		       SOLO_CAP_EXT_ADDR(solo_dev),
		       SOLO_CAP_EXT_SIZE(solo_dev),
		       SOLO_CAP_PAGE_SIZE,
		       SOLO_CAP_EXT_SIZE(solo_dev) / SOLO_CAP_PAGE_SIZE);

	out += sprintf(out, "EREF: 0x%08x @ 0x%08x (0x%08x * %d)\n",
		       SOLO_EREF_EXT_ADDR(solo_dev),
		       SOLO_EREF_EXT_AREA(solo_dev),
		       SOLO_EREF_EXT_SIZE,
		       SOLO_EREF_EXT_AREA(solo_dev) / SOLO_EREF_EXT_SIZE);

	out += sprintf(out, "MPEG: 0x%08x @ 0x%08x\n",
		       SOLO_MP4E_EXT_ADDR(solo_dev),
		       SOLO_MP4E_EXT_SIZE(solo_dev));

	out += sprintf(out, "JPEG: 0x%08x @ 0x%08x\n",
		       SOLO_JPEG_EXT_ADDR(solo_dev),
		       SOLO_JPEG_EXT_SIZE(solo_dev));

	return out - buf;
}
コード例 #3
0
ファイル: solo6010-v4l2.c プロジェクト: curtishall/solo6x10
static void solo_fillbuf(struct solo_filehandle *fh,
			 struct videobuf_buffer *vb)
{
	struct solo6010_dev *solo_dev = fh->solo_dev;
	dma_addr_t vbuf;
	unsigned int fdma_addr;
	int error = -1;
	int i;

	if (!(vbuf = videobuf_to_dma_contig(vb)))
		goto finish_buf;

	if (erase_off(solo_dev)) {
		void *p = videobuf_queue_to_vmalloc(&fh->vidq, vb);
		int image_size = solo_image_size(solo_dev);
		for (i = 0; i < image_size; i += 2) {
			((u8 *)p)[i] = 0x80;
			((u8 *)p)[i + 1] = 0x00;
		}
		error = 0;
	} else {
		fdma_addr = SOLO_DISP_EXT_ADDR(solo_dev) + (fh->old_write *
				(SOLO_HW_BPL * solo_vlines(solo_dev)));

		error = solo_p2m_dma_t(solo_dev, 0, vbuf, fdma_addr,
				       solo_bytesperline(solo_dev),
				       solo_vlines(solo_dev), SOLO_HW_BPL);
	}

finish_buf:
	if (error) {
		vb->state = VIDEOBUF_ERROR;
	} else {
		vb->state = VIDEOBUF_DONE;
		vb->field_count++;
	}

	wake_up(&vb->done);
}