⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 meye.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 4 页
字号:
/* * Motion Eye video4linux driver for Sony Vaio PictureBook * * Copyright (C) 2001-2004 Stelian Pop <stelian@popies.net> * * Copyright (C) 2001-2002 Alc魐e <www.alcove.com> * * Copyright (C) 2000 Andrew Tridgell <tridge@valinux.com> * * Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras. * * Some parts borrowed from various video4linux drivers, especially * bttv-driver.c and zoran.c, see original files for credits. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <linux/config.h>#include <linux/module.h>#include <linux/pci.h>#include <linux/sched.h>#include <linux/init.h>#include <linux/videodev.h>#include <asm/uaccess.h>#include <asm/io.h>#include <linux/delay.h>#include <linux/interrupt.h>#include <linux/vmalloc.h>#include <linux/dma-mapping.h>#include "meye.h"#include <linux/meye.h>MODULE_AUTHOR("Stelian Pop <stelian@popies.net>");MODULE_DESCRIPTION("v4l/v4l2 driver for the MotionEye camera");MODULE_LICENSE("GPL");MODULE_VERSION(MEYE_DRIVER_VERSION);/* force usage of V4L1 API */static int forcev4l1; /* = 0 */module_param(forcev4l1, int, 0644);MODULE_PARM_DESC(forcev4l1, "force use of V4L1 instead of V4L2");/* number of grab buffers */static unsigned int gbuffers = 2;module_param(gbuffers, int, 0444);MODULE_PARM_DESC(gbuffers, "number of capture buffers, default is 2 (32 max)");/* size of a grab buffer */static unsigned int gbufsize = MEYE_MAX_BUFSIZE;module_param(gbufsize, int, 0444);MODULE_PARM_DESC(gbufsize, "size of the capture buffers, default is 614400"		 " (will be rounded up to a page multiple)");/* /dev/videoX registration number */static int video_nr = -1;module_param(video_nr, int, 0444);MODULE_PARM_DESC(video_nr, "video device to register (0=/dev/video0, etc)");/* driver structure - only one possible */static struct meye meye;/****************************************************************************//* Memory allocation routines (stolen from bttv-driver.c)                   *//****************************************************************************/static void *rvmalloc(unsigned long size){	void *mem;	unsigned long adr;	size = PAGE_ALIGN(size);	mem = vmalloc_32(size);	if (mem) {		memset(mem, 0, size);		adr = (unsigned long) mem;		while (size > 0) {			SetPageReserved(vmalloc_to_page((void *)adr));			adr += PAGE_SIZE;			size -= PAGE_SIZE;		}	}	return mem;}static void rvfree(void * mem, unsigned long size){	unsigned long adr;	if (mem) {		adr = (unsigned long) mem;		while ((long) size > 0) {			ClearPageReserved(vmalloc_to_page((void *)adr));			adr += PAGE_SIZE;			size -= PAGE_SIZE;		}		vfree(mem);	}}/* * return a page table pointing to N pages of locked memory * * NOTE: The meye device expects DMA addresses on 32 bits, we build * a table of 1024 entries = 4 bytes * 1024 = 4096 bytes. */static int ptable_alloc(void){	u32 *pt;	int i;	memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));	/* give only 32 bit DMA addresses */	if (dma_set_mask(&meye.mchip_dev->dev, DMA_32BIT_MASK))		return -1;	meye.mchip_ptable_toc = dma_alloc_coherent(&meye.mchip_dev->dev,						   PAGE_SIZE,						   &meye.mchip_dmahandle,						   GFP_KERNEL);	if (!meye.mchip_ptable_toc) {		meye.mchip_dmahandle = 0;		return -1;	}	pt = meye.mchip_ptable_toc;	for (i = 0; i < MCHIP_NB_PAGES; i++) {		dma_addr_t dma;		meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev,							  PAGE_SIZE,							  &dma,							  GFP_KERNEL);		if (!meye.mchip_ptable[i]) {			int j;			pt = meye.mchip_ptable_toc;			for (j = 0; j < i; ++j) {				dma = (dma_addr_t) *pt;				dma_free_coherent(&meye.mchip_dev->dev,						  PAGE_SIZE,						  meye.mchip_ptable[j], dma);				pt++;			}			dma_free_coherent(&meye.mchip_dev->dev,					  PAGE_SIZE,					  meye.mchip_ptable_toc,					  meye.mchip_dmahandle);			meye.mchip_ptable_toc = NULL;			meye.mchip_dmahandle = 0;			return -1;		}		*pt = (u32) dma;		pt++;	}	return 0;}static void ptable_free(void){	u32 *pt;	int i;	pt = meye.mchip_ptable_toc;	for (i = 0; i < MCHIP_NB_PAGES; i++) {		dma_addr_t dma = (dma_addr_t) *pt;		if (meye.mchip_ptable[i])			dma_free_coherent(&meye.mchip_dev->dev,					  PAGE_SIZE,					  meye.mchip_ptable[i], dma);		pt++;	}	if (meye.mchip_ptable_toc)		dma_free_coherent(&meye.mchip_dev->dev,				  PAGE_SIZE,				  meye.mchip_ptable_toc,				  meye.mchip_dmahandle);	memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));	meye.mchip_ptable_toc = NULL;	meye.mchip_dmahandle = 0;}/* copy data from ptable into buf */static void ptable_copy(u8 *buf, int start, int size, int pt_pages){	int i;	for (i = 0; i < (size / PAGE_SIZE) * PAGE_SIZE; i += PAGE_SIZE) {		memcpy(buf + i, meye.mchip_ptable[start++], PAGE_SIZE);		if (start >= pt_pages)			start = 0;	}	memcpy(buf + i, meye.mchip_ptable[start], size % PAGE_SIZE);}/****************************************************************************//* JPEG tables at different qualities to load into the VRJ chip             *//****************************************************************************//* return a set of quantisation tables based on a quality from 1 to 10 */static u16 *jpeg_quantisation_tables(int *length, int quality){	static u16 jpeg_tables[][70] = { {		0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,		0xffff, 0xffff, 0xffff,		0xdbff, 0x4300, 0xff01, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,		0xffff, 0xffff, 0xffff,	},	{		0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46,		0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8,		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,		0xffff, 0xffff, 0xffff,		0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb,		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,		0xffff, 0xffff, 0xffff,	},	{		0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23,		0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164,		0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad,		0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff,		0xe6ff, 0xfffd, 0xfff8,		0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876,		0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,		0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,		0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,		0xf8f8, 0xf8f8, 0xfff8,	},	{		0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17,		0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042,		0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73,		0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba,		0x99c7, 0xaba8, 0xffa4,		0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e,		0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,		0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,		0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,		0xa4a4, 0xa4a4, 0xffa4,	},	{		0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712,		0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932,		0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556,		0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c,		0x7396, 0x817e, 0xff7c,		0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b,		0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,		0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,		0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,		0x7c7c, 0x7c7c, 0xff7c,	},	{		0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e,		0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28,		0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745,		0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470,		0x5c78, 0x6765, 0xff63,		0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f,		0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,		0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,		0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,		0x6363, 0x6363, 0xff63,	},	{		0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b,		0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20,		0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37,		0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a,		0x4a60, 0x5251, 0xff4f,		0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26,		0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,		0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,		0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,		0x4f4f, 0x4f4f, 0xff4f,	},	{		0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08,		0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318,		0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129,		0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43,		0x3748, 0x3e3d, 0xff3b,		0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c,		0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,		0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,		0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,		0x3b3b, 0x3b3b, 0xff3b,	},	{		0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706,		0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710,		0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c,		0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d,		0x2530, 0x2928, 0xff28,		0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813,		0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,		0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,		0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,		0x2828, 0x2828, 0xff28,	},	{		0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403,		0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08,		0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e,		0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416,		0x1218, 0x1514, 0xff14,		0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409,		0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,		0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,		0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,		0x1414, 0x1414, 0xff14,	},	{		0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,		0x0101, 0x0101, 0xff01,		0xdbff, 0x4300, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,		0x0101, 0x0101, 0xff01,	} };	if (quality < 0 || quality > 10) {		printk(KERN_WARNING		       "meye: invalid quality level %d - using 8\n", quality);		quality = 8;	}	*length = ARRAY_SIZE(jpeg_tables[quality]);	return jpeg_tables[quality];}/* return a generic set of huffman tables */static u16 *jpeg_huffman_tables(int *length){	static u16 tables[] = {		0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405,		0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131,		0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142,		0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918,		0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443,		0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463,		0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483,		0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A,		0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8,		0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6,		0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2,		0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,		0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405,		0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206,		0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1,		0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125,		0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A,		0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A,		0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A,		0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998,		0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6,		0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4,		0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2,		0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,		0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000,		0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,		0xFF0B,		0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101,		0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,		0xFF0B	};	*length = ARRAY_SIZE(tables);	return tables;}/****************************************************************************//* MCHIP low-level functions                                                *//****************************************************************************//* returns the horizontal capture size */static inline int mchip_hsize(void){	return meye.params.subsample ? 320 : 640;}/* returns the vertical capture size */static inline int mchip_vsize(void){	return meye.params.subsample ? 240 : 480;}/* waits for a register to be available */static void mchip_sync(int reg){	u32 status;	int i;	if (reg == MCHIP_MM_FIFO_DATA) {		for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {			status = readl(meye.mchip_mmregs +				       MCHIP_MM_FIFO_STATUS);			if (!(status & MCHIP_MM_FIFO_WAIT)) {				printk(KERN_WARNING "meye: fifo not ready\n");				return;			}			if (status & MCHIP_MM_FIFO_READY)				return;			udelay(1);		}	} else if (reg > 0x80) {		u32 mask = (reg < 0x100) ? MCHIP_HIC_STATUS_MCC_RDY					 : MCHIP_HIC_STATUS_VRJ_RDY;		for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {			status = readl(meye.mchip_mmregs + MCHIP_HIC_STATUS);			if (status & mask)				return;			udelay(1);		}	} else		return;	printk(KERN_WARNING	       "meye: mchip_sync() timeout on reg 0x%x status=0x%x\n",	       reg, status);}/* sets a value into the register */static inline void mchip_set(int reg, u32 v){	mchip_sync(reg);	writel(v, meye.mchip_mmregs + reg);}/* get the register value */static inline u32 mchip_read(int reg){	mchip_sync(reg);	return readl(meye.mchip_mmregs + reg);}/* wait for a register to become a particular value */static inline int mchip_delay(u32 reg, u32 v){	int n = 10;	while (--n && mchip_read(reg) != v)		udelay(1);	return n;}/* setup subsampling */static void mchip_subsample(void){	mchip_set(MCHIP_MCC_R_SAMPLING, meye.params.subsample);	mchip_set(MCHIP_MCC_R_XRANGE, mchip_hsize());	mchip_set(MCHIP_MCC_R_YRANGE, mchip_vsize());	mchip_set(MCHIP_MCC_B_XRANGE, mchip_hsize());	mchip_set(MCHIP_MCC_B_YRANGE, mchip_vsize());	mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);}/* set the framerate into the mchip */static void mchip_set_framerate(void){	mchip_set(MCHIP_HIC_S_RATE, meye.params.framerate);}/* load some huffman and quantisation tables into the VRJ chip ready   for JPEG compression */static void mchip_load_tables(void){	int i;	int length;	u16 *tables;	tables = jpeg_huffman_tables(&length);	for (i = 0; i < length; i++)		writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);	tables = jpeg_quantisation_tables(&length, meye.params.quality);	for (i = 0; i < length; i++)		writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);}/* setup the VRJ parameters in the chip */static void mchip_vrj_setup(u8 mode){	mchip_set(MCHIP_VRJ_BUS_MODE, 5);	mchip_set(MCHIP_VRJ_SIGNAL_ACTIVE_LEVEL, 0x1f);	mchip_set(MCHIP_VRJ_PDAT_USE, 1);	mchip_set(MCHIP_VRJ_IRQ_FLAG, 0xa0);	mchip_set(MCHIP_VRJ_MODE_SPECIFY, mode);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -