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

📄 meye.c

📁 pxa270下的摄像头mtd91111的驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
/*  * Motion Eye video4linux driver for Sony Vaio PictureBook * * Copyright (C) 2001 Stelian Pop <stelian.pop@fr.alcove.com>, Alc魐e * * 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/wrapper.h>#include <linux/interrupt.h>#include <linux/vmalloc.h>#include "meye.h"#include "linux/meye.h"/* driver structure - only one possible */static struct meye meye;/* number of grab buffers */static unsigned int gbuffers = 2;/* size of a grab buffer */static unsigned int gbufsize = MEYE_MAX_BUFSIZE;/* /dev/videoX registration number */static int video_nr = -1;/****************************************************************************//* Queue routines                                                           *//****************************************************************************//* Inits the queue */static inline void meye_initq(struct meye_queue *queue) {	queue->head = queue->tail = 0;	queue->len = 0;	queue->s_lock = (spinlock_t)SPIN_LOCK_UNLOCKED;	init_waitqueue_head(&queue->proc_list);}/* Pulls an element from the queue */static inline int meye_pullq(struct meye_queue *queue) {	int result;	unsigned long flags;	spin_lock_irqsave(&queue->s_lock, flags);	if (!queue->len) {		spin_unlock_irqrestore(&queue->s_lock, flags);		return -1;	}	result = queue->buf[queue->head];	queue->head++;	queue->head &= (MEYE_QUEUE_SIZE - 1);	queue->len--;	spin_unlock_irqrestore(&queue->s_lock, flags);	return result;}/* Pushes an element into the queue */static inline void meye_pushq(struct meye_queue *queue, int element) {	unsigned long flags;	spin_lock_irqsave(&queue->s_lock, flags);	if (queue->len == MEYE_QUEUE_SIZE) {		/* remove the first element */		queue->head++;		queue->head &= (MEYE_QUEUE_SIZE - 1);		queue->len--;	}	queue->buf[queue->tail] = element;	queue->tail++;	queue->tail &= (MEYE_QUEUE_SIZE - 1);	queue->len++;	spin_unlock_irqrestore(&queue->s_lock, flags);}/* Tests if the queue is empty */static inline int meye_emptyq(struct meye_queue *queue, int *elem) {	int result;	unsigned long flags;	spin_lock_irqsave(&queue->s_lock, flags);	result = (queue->len == 0);	if (!result && elem)		*elem = queue->buf[queue->head];	spin_unlock_irqrestore(&queue->s_lock, flags);	return result;}/****************************************************************************//* Memory allocation routines (stolen from bttv-driver.c)                   *//****************************************************************************//* Here we want the physical address of the memory. * This is used when initializing the contents of the area. */static inline unsigned long kvirt_to_pa(unsigned long adr) {        unsigned long kva, ret;        kva = (unsigned long) page_address(vmalloc_to_page((void *)adr));	kva |= adr & (PAGE_SIZE-1); /* restore the offset */	ret = __pa(kva);        return ret;}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); /* Clear the ram out, no junk to the user */	        adr = (unsigned long)mem;		while (size > 0) {			mem_map_reserve(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) {			mem_map_unreserve(vmalloc_to_page((void *)adr));			adr += PAGE_SIZE;			size -= PAGE_SIZE;		}		vfree(mem);	}}/* return a page table pointing to N pages of locked memory */static int ptable_alloc(void) {	u32 *pt;	int i;	memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));	meye.mchip_ptable[MCHIP_NB_PAGES] = pci_alloc_consistent(meye.mchip_dev, 								 PAGE_SIZE, 								 &meye.mchip_dmahandle);	if (!meye.mchip_ptable[MCHIP_NB_PAGES])		return -1;	pt = (u32 *)meye.mchip_ptable[MCHIP_NB_PAGES];	for (i = 0; i < MCHIP_NB_PAGES; i++) {		meye.mchip_ptable[i] = pci_alloc_consistent(meye.mchip_dev, 							    PAGE_SIZE,							    pt);		if (!meye.mchip_ptable[i])			return -1;		pt++;	}	return 0;}static void ptable_free(void) {	u32 *pt;	int i;	pt = (u32 *)meye.mchip_ptable[MCHIP_NB_PAGES];	for (i = 0; i < MCHIP_NB_PAGES; i++)		if (meye.mchip_ptable[i])			pci_free_consistent(meye.mchip_dev, 					    PAGE_SIZE, 					    meye.mchip_ptable[i], *pt);	if (meye.mchip_ptable[MCHIP_NB_PAGES])		pci_free_consistent(meye.mchip_dev, 				    PAGE_SIZE, 				    meye.mchip_ptable[MCHIP_NB_PAGES], 				    meye.mchip_dmahandle);	memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));	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 *size, int quality) {	static u16 tables0[] = {		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, 	};	static u16 tables1[] = {		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, 	};	static u16 tables2[] = {		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, 	};	static u16 tables3[] = {		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, 	};	static u16 tables4[] = {		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, 	};	static u16 tables5[] = {		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, 	};	static u16 tables6[] = {		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, 	};	static u16 tables7[] = {		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, 	};	static u16 tables8[] = {		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, 	};	static u16 tables9[] = {		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, 	};	static u16 tables10[] = {		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, 	};	switch (quality) {	case 0:		*size = sizeof(tables0);		return tables0;	case 1:		*size = sizeof(tables1);		return tables1;	case 2:		*size = sizeof(tables2);		return tables2;	case 3:		*size = sizeof(tables3);		return tables3;	case 4:		*size = sizeof(tables4);		return tables4;	case 5:		*size = sizeof(tables5);		return tables5;	case 6:		*size = sizeof(tables6);		return tables6;	case 7:		*size = sizeof(tables7);		return tables7;	case 8:		*size = sizeof(tables8);		return tables8;	case 9:		*size = sizeof(tables9);		return tables9;	case 10:		*size = sizeof(tables10);		return tables10;	default:		printk(KERN_WARNING "meye: invalid quality level %d - using 8\n", quality);		*size = sizeof(tables8);		return tables8;	}	return NULL;}/* return a generic set of huffman tables */static u16 *jpeg_huffman_tables(int *size) {	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	};	*size = sizeof(tables);	return tables;}/****************************************************************************//* MCHIP low-level functions                                                *//****************************************************************************//* waits for the specified miliseconds */static inline void wait_ms(unsigned int ms) {	if (!in_interrupt()) {		set_current_state(TASK_UNINTERRUPTIBLE);		schedule_timeout(1 + ms * HZ / 1000);	}	else		mdelay(ms);}/* 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)

⌨️ 快捷键说明

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