亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cpia.c

?? Usb1.1驅動c語言源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * USB CPiA Video Camera driver * * Supports CPiA based Video Cameras. Many manufacturers use this chipset. * There's a good chance, if you have a USB video camera, it's a CPiA based * one. * * (C) Copyright 1999 Johannes Erdfelt * (C) Copyright 1999 Randy Dunlap */#include <linux/kernel.h>#include <linux/sched.h>#include <linux/list.h>#include <linux/malloc.h>#include <linux/mm.h>#include <linux/smp_lock.h>#include <linux/videodev.h>#include <linux/vmalloc.h>#include <linux/wrapper.h>#include <linux/module.h>#include <linux/spinlock.h>#include <asm/io.h>#include "usb.h"#include "cpia.h"static int debug = 0;MODULE_PARM(debug, "i");/* Video Size 384 x 288 x 3 bytes for RGB *//* 384 because xawtv tries to grab 384 even though we tell it 352 is our max */#define MAX_FRAME_SIZE (384 * 288 * 3)/*******************************//* Memory management functions *//*******************************/#define MDEBUG(x)	do { } while(0)		/* Debug memory management */static struct usb_driver cpia_driver;/* Given PGD from the address space's page table, return the kernel * virtual mapping of the physical memory mapped at ADR. */static inline unsigned long uvirt_to_kva(pgd_t *pgd, unsigned long adr){	unsigned long ret = 0UL;	pmd_t *pmd;	pte_t *ptep, pte;	if (!pgd_none(*pgd)) {		pmd = pmd_offset(pgd, adr);		if (!pmd_none(*pmd)) {			ptep = pte_offset(pmd, adr);			pte = *ptep;			if (pte_present(pte))				ret = page_address(pte_page(pte)) | (adr & (PAGE_SIZE-1));		}	}	MDEBUG(printk("uv2kva(%lx-->%lx)", adr, ret));	return ret;}static inline unsigned long uvirt_to_bus(unsigned long adr){	unsigned long kva, ret;	kva = uvirt_to_kva(pgd_offset(current->mm, adr), adr);	ret = virt_to_bus((void *)kva);	MDEBUG(printk("uv2b(%lx-->%lx)", adr, ret));	return ret;}static inline unsigned long kvirt_to_bus(unsigned long adr){	unsigned long va, kva, ret;	va = VMALLOC_VMADDR(adr);	kva = uvirt_to_kva(pgd_offset_k(va), va);	ret = virt_to_bus((void *)kva);	MDEBUG(printk("kv2b(%lx-->%lx)", adr, ret));	return ret;}/* Here we want the physical address of the memory. * This is used when initializing the contents of the * area and marking the pages as reserved. */static inline unsigned long kvirt_to_pa(unsigned long adr){	unsigned long va, kva, ret;	va = VMALLOC_VMADDR(adr);	kva = uvirt_to_kva(pgd_offset_k(va), va);	ret = __pa(kva);	MDEBUG(printk("kv2pa(%lx-->%lx)", adr, ret));	return ret;}static void *rvmalloc(unsigned long size){	void *mem;	unsigned long adr, page;	/* Round it off to PAGE_SIZE */	size += (PAGE_SIZE - 1);	size &= ~(PAGE_SIZE - 1);	mem = vmalloc(size);	if (!mem)		return NULL;	memset(mem, 0, size); /* Clear the ram out, no junk to the user */	adr = (unsigned long) mem;	while (size > 0) {		page = kvirt_to_pa(adr);		mem_map_reserve(MAP_NR(__va(page)));		adr += PAGE_SIZE;		if (size > PAGE_SIZE)			size -= PAGE_SIZE;		else			size = 0;	}	return mem;}static void rvfree(void *mem, unsigned long size){	unsigned long adr, page;	if (!mem)		return;	size += (PAGE_SIZE - 1);	size &= ~(PAGE_SIZE - 1);	adr=(unsigned long) mem;	while (size > 0) {		page = kvirt_to_pa(adr);		mem_map_unreserve(MAP_NR(__va(page)));		adr += PAGE_SIZE;		if (size > PAGE_SIZE)			size -= PAGE_SIZE;		else			size = 0;	}	vfree(mem);}static int usb_cpia_get_version(struct usb_device *dev, void *buf){	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),		USB_REQ_CPIA_GET_VERSION,		USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,		0, 0, buf, 4, HZ);}#ifdef NOTUSEDstatic int usb_cpia_get_pnp_id(struct usb_device *dev, void *buf){	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),		USB_REQ_CPIA_GET_PNP_ID,		USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,		0, 0, buf, 6, HZ);}#endif#ifdef NOTUSEDstatic int usb_cpia_get_camera_status(struct usb_device *dev, void *buf){	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),		USB_REQ_CPIA_GET_CAMERA_STATUS,		USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,		0, 0, buf, 8, HZ);}#endifstatic int usb_cpia_goto_hi_power(struct usb_device *dev){	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),		USB_REQ_CPIA_GOTO_HI_POWER, USB_TYPE_VENDOR | USB_RECIP_DEVICE,		0, 0, NULL, 0, HZ);}static int usb_cpia_get_vp_version(struct usb_device *dev, void *buf){	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),		USB_REQ_CPIA_GET_VP_VERSION,		USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,		0, 0, buf, 4, HZ);}static int usb_cpia_set_sensor_fps(struct usb_device *dev, int sensorbaserate, int sensorclkdivisor){	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),		USB_REQ_CPIA_SET_SENSOR_FPS,		USB_TYPE_VENDOR | USB_RECIP_DEVICE,		(sensorbaserate << 8) + sensorclkdivisor, 0, NULL, 0, HZ);}#ifdef NOTUSEDstatic int usb_cpia_grab_frame(struct usb_device *dev, int streamstartline){	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),		USB_REQ_CPIA_GRAB_FRAME, USB_TYPE_VENDOR | USB_RECIP_DEVICE,		streamstartline << 8, 0, NULL, 0, HZ);}#endifstatic int usb_cpia_upload_frame(struct usb_device *dev, int forceupload){	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),		USB_REQ_CPIA_UPLOAD_FRAME, USB_TYPE_VENDOR | USB_RECIP_DEVICE,		forceupload, 0, NULL, 0, HZ);}static int usb_cpia_set_grab_mode(struct usb_device *dev, int continuousgrab){	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),		USB_REQ_CPIA_SET_GRAB_MODE,		USB_TYPE_VENDOR | USB_RECIP_DEVICE, continuousgrab,		0, NULL, 0, HZ);}static int usb_cpia_set_format(struct usb_device *dev, int size, int subsample, int order){	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),		USB_REQ_CPIA_SET_FORMAT,		USB_TYPE_VENDOR | USB_RECIP_DEVICE,		(subsample << 8) + size, order, NULL, 0, HZ);}static int usb_cpia_set_roi(struct usb_device *dev, int colstart, int colend, int rowstart, int rowend){	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),		USB_REQ_CPIA_SET_ROI,		USB_TYPE_VENDOR | USB_RECIP_DEVICE,		(colend << 8) + colstart, (rowend << 8) + rowstart,		NULL, 0, HZ);}static int usb_cpia_set_compression(struct usb_device *dev, int compmode, int decimation){	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),		USB_REQ_CPIA_SET_COMPRESSION,		USB_TYPE_VENDOR | USB_RECIP_DEVICE,		(decimation << 8) + compmode, 0, NULL, 0, HZ);}#ifdef NOTUSEDstatic int usb_cpia_set_compression_target(struct usb_device *dev, int target, int targetfr, int targetq){	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),		USB_REQ_CPIA_SET_COMPRESSION_TARGET,		USB_TYPE_VENDOR | USB_RECIP_DEVICE,		(targetfr << 8) + target, targetq, NULL, 0, HZ);}#endif#ifdef NOTUSEDstatic int usb_cpia_initstreamcap(struct usb_device *dev, int skipframes, int streamstartline){	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),		USB_REQ_CPIA_INIT_STREAM_CAP,		USB_TYPE_VENDOR | USB_RECIP_DEVICE,		(streamstartline << 8) + skipframes, 0, NULL, 0, HZ);}static int usb_cpia_finistreamcap(struct usb_device *dev){	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),		USB_REQ_CPIA_FINI_STREAM_CAP,		USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, 0, NULL, 0, HZ);}static int usb_cpia_startstreamcap(struct usb_device *dev){	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),		USB_REQ_CPIA_START_STREAM_CAP,		USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, 0, NULL, 0, HZ);}static int usb_cpia_endstreamcap(struct usb_device *dev){	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),		USB_REQ_CPIA_END_STREAM_CAP,		USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, 0, NULL, 0, HZ);}#endif/* How much data is left in the scratch buf? */#define scratch_left(x)	(cpia->scratchlen - (int)((char *)x - (char *)cpia->scratch))static void cpia_parse_data(struct usb_cpia *cpia){	struct cpia_frame *frame, *pframe;	unsigned char *data = cpia->scratch;	unsigned long left;	long copylen = 0;	/* Grab the current frame and the previous frame */	frame = &cpia->frame[cpia->curframe];	pframe = &cpia->frame[(cpia->curframe - 1 + CPIA_NUMFRAMES) % CPIA_NUMFRAMES];	while (1) {		if (!scratch_left(data))			goto out;		switch (frame->scanstate) {		case STATE_SCANNING:		{			struct cpia_frame_header *header;			/* We need at least 2 bytes for the magic value */			if (scratch_left(data) < 2)				goto out;			header = (struct cpia_frame_header *)data;			if (be16_to_cpup(&header->magic) == CPIA_MAGIC) {				frame->scanstate = STATE_HEADER;				break;			}			/* Woops, lost the header, find the end of the frame */			if (scratch_left(data) < 4)				goto out;			/* See if we found the end of the frame */			while (scratch_left(data) >= 4) {				if (*((__u32 *)data) == 0xFFFFFFFF) {					data += 4;					if (debug >= 1)						printk(KERN_INFO "cpia: EOF while scanning for magic\n");					goto error;				}				data++;			}			break;		}		case STATE_HEADER:			/* We need at least 64 bytes for the header */			if (scratch_left(data) <			    sizeof(struct cpia_frame_header))				goto out;			memcpy(&frame->header, data,				sizeof(struct cpia_frame_header));			/* Skip over the header */			data += sizeof(struct cpia_frame_header);			frame->hdrwidth = (frame->header.col_end -				frame->header.col_start) * 8;			frame->hdrheight = (frame->header.row_end -				frame->header.row_start) * 4;			if (debug >= 2) {				printk(KERN_DEBUG "cpia: frame size %dx%d\n",					frame->hdrwidth, frame->hdrheight);				printk(KERN_DEBUG "cpia: frame %scompressed\n",					frame->header.comp_enable ? "" : "not ");			}			frame->scanstate = STATE_LINES;			frame->curline = 0;			break;		case STATE_LINES:		{			unsigned char *f, *end;			unsigned int len;			int i;			int y, u, y1, v, r, g, b;			/* We want at least 2 bytes for the length */			if (scratch_left(data) < 2)				goto out;			/* Grab the length */			len = data[0] + (data[1] << 8);			/* Check to make sure it's nothing outrageous */			if (len > (frame->hdrwidth * 2) + 1) {				if (debug >= 1)					printk(KERN_DEBUG "cpia: bad length, resynching (expected %d, got %d)\n", (frame->hdrwidth * 2) + 1, len);				goto error;			}			/* Make sure there's enough data for the entire line */			if (scratch_left(data + 2) < len)				goto out;			/* Skip over the length */			data += 2;			/* Is the end of the line there */			if (data[len - 1] != 0xFD) {				if (debug >= 1)					printk(KERN_DEBUG "cpia: lost synch\n");				goto error;			}			/* Start at the beginning */			end = data + len - 1;			f = frame->data + (frame->width * 3 * frame->curline);			if (frame->header.comp_enable) {				unsigned char *fp;				/* We use the previous frame as a reference */				fp = pframe->data +					(frame->width * 3 * frame->curline);				while (data < end) {					if (*data & 1) {						/* Compress RLE data */						i = *data >> 1;						memcpy(f, fp, i * 3);						copylen += (i * 3);						f += (i * 3);						fp += (i * 3);						data++;					} else {						/* Raw data */#define LIMIT(x) ((((x)>0xffffff)?0xff0000:(((x)<=0xffff)?0:(x)&0xff0000))>>16)y =  *data++ - 16;u =  *data++ - 128;y1 = *data++ - 16;v =  *data++ - 128;r = 104635 * v;g = -25690 * u + -53294 * v;b = 132278 * u;y  *= 76310;y1 *= 76310;*f++ = LIMIT(b + y); *f++ = LIMIT(g + y); *f++ = LIMIT(r + y);*f++ = LIMIT(b + y1); *f++ = LIMIT(g + y1); *f++ = LIMIT(r + y1);						fp += 6;						copylen += 6;					}				}			} else {				/* Raw data */				while (data < end) {y =  *data++ - 16;u =  *data++ - 128;y1 = *data++ - 16;v =  *data++ - 128;r = 104635 * v;g = -25690 * u + -53294 * v;b = 132278 * u;y  *= 76310;y1 *= 76310;*f++ = LIMIT(b + y); *f++ = LIMIT(g + y); *f++ = LIMIT(r + y);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人亚洲综合a∨婷婷| 亚洲国产视频一区| 在线不卡欧美精品一区二区三区| 成人激情综合网站| 国产精品综合一区二区三区| 日韩高清一级片| 天涯成人国产亚洲精品一区av| 亚洲精品成人在线| 亚洲欧美视频在线观看视频| 亚洲乱码一区二区三区在线观看| 中文一区二区完整视频在线观看 | 中文字幕欧美区| 久久一区二区三区四区| 久久视频一区二区| 久久久国产综合精品女国产盗摄| 日韩女优毛片在线| 欧美高清hd18日本| 欧美日韩你懂得| 91精品在线一区二区| 日韩一区二区三区精品视频| 欧美电视剧在线观看完整版| 久久亚洲春色中文字幕久久久| 久久久精品国产免大香伊| 久久色在线观看| 国产精品欧美经典| 亚洲小说欧美激情另类| 男人的j进女人的j一区| 国产一区999| 91片黄在线观看| 在线播放一区二区三区| 精品国产1区二区| 自拍偷拍国产精品| 亚洲mv大片欧洲mv大片精品| 久久机这里只有精品| 成人网在线播放| 欧美探花视频资源| 久久久99精品免费观看不卡| 亚洲免费观看高清| 精品在线亚洲视频| 色综合久久六月婷婷中文字幕| 制服丝袜亚洲播放| 国产精品久久午夜夜伦鲁鲁| 亚洲一区二区3| 国产传媒一区在线| 欧美日韩在线三级| 国产精品污污网站在线观看| 三级成人在线视频| 99久久婷婷国产综合精品| 91精品国产福利在线观看| 国产欧美一区二区在线| 天天亚洲美女在线视频| jizz一区二区| 久久精品这里都是精品| 亚洲成人动漫精品| 成人97人人超碰人人99| 欧美大片国产精品| 夜夜精品浪潮av一区二区三区| 精品一区二区三区视频| 欧美精品免费视频| 自拍偷拍国产亚洲| 国产91丝袜在线18| 精品国产乱码久久久久久牛牛| 一区二区三区四区不卡在线 | 久久久影视传媒| 午夜精品久久久久久不卡8050| 国产成人av电影在线| 精品国产乱码久久久久久牛牛 | 日韩精品乱码免费| 色爱区综合激月婷婷| 国产精品久久久久久久午夜片| 美女视频免费一区| 欧美精品国产精品| 亚洲国产色一区| 欧美亚洲一区二区在线观看| 亚洲精选在线视频| 不卡av在线免费观看| 国产精品亲子伦对白| 国产99久久久精品| 欧美经典一区二区三区| 国产精华液一区二区三区| 久久综合九色综合久久久精品综合| 日本亚洲电影天堂| 91精品国产欧美一区二区| 天堂va蜜桃一区二区三区 | 日韩电影在线免费看| 欧美性大战xxxxx久久久| 精品视频全国免费看| 日韩欧美国产一二三区| 97久久精品人人澡人人爽| 欧美国产1区2区| 成人免费高清视频在线观看| 国产三级精品三级| 91丨九色丨蝌蚪丨老版| 亚洲欧美国产三级| 欧美午夜电影在线播放| 亚洲成人tv网| 欧美videos大乳护士334| 国产综合久久久久久鬼色| 国产网红主播福利一区二区| 成人性色生活片免费看爆迷你毛片| 亚洲国产岛国毛片在线| 91福利精品视频| 奇米888四色在线精品| 久久久精品国产99久久精品芒果| 国产成人精品免费网站| 亚洲精品大片www| 欧美精品777| 国产精品资源网站| 亚洲精品欧美在线| 欧美一区日本一区韩国一区| 国产在线精品一区二区夜色 | 奇米影视一区二区三区| 久久久久久久久一| 91福利国产成人精品照片| 全部av―极品视觉盛宴亚洲| 国产欧美日韩中文久久| 在线观看不卡视频| 韩国成人精品a∨在线观看| 亚洲视频1区2区| 欧美成人一区二区三区在线观看| 处破女av一区二区| 日本亚洲天堂网| 自拍偷拍国产亚洲| 精品对白一区国产伦| 色综合久久久久综合| 激情综合网av| 亚洲v日本v欧美v久久精品| 国产性做久久久久久| 欧美日韩国产高清一区二区三区| 国产高清不卡一区| 婷婷丁香久久五月婷婷| 亚洲色图视频网| www国产精品av| 欧美日韩情趣电影| 91麻豆国产在线观看| 国内精品免费**视频| 午夜激情久久久| 亚洲免费毛片网站| 国产精品美女久久久久aⅴ国产馆| 在线不卡中文字幕播放| 91高清视频在线| av亚洲精华国产精华精华| 黄网站免费久久| 日韩中文字幕av电影| 亚洲综合丝袜美腿| 国产精品大尺度| 欧美国产一区二区在线观看| 日韩一级完整毛片| 欧美另类一区二区三区| 欧美性三三影院| 色婷婷激情一区二区三区| 国产91丝袜在线18| 国产91色综合久久免费分享| 另类小说图片综合网| 日韩精品视频网| 亚洲成人先锋电影| 亚洲成人免费影院| 午夜久久久久久久久久一区二区| 一区二区三区在线免费观看 | 色综合天天综合色综合av | 亚洲精品乱码久久久久久| 国产精品灌醉下药二区| 国产精品美女一区二区三区| 26uuu色噜噜精品一区| 久久综合av免费| 国产农村妇女毛片精品久久麻豆 | 99精品久久免费看蜜臀剧情介绍| 成人爽a毛片一区二区免费| 国产精品主播直播| 成人毛片视频在线观看| 高清不卡一区二区在线| www.久久久久久久久| 色综合天天综合| 欧美色爱综合网| 欧美一区二区三区免费| 欧美mv和日韩mv国产网站| 久久久亚洲精品一区二区三区| 欧美高清在线视频| 亚洲男人的天堂网| 亚洲午夜日本在线观看| 日韩精品一级二级| 激情小说亚洲一区| 成人av网站大全| 欧美日韩日日骚| 久久综合五月天婷婷伊人| 国产精品日韩精品欧美在线| 一级中文字幕一区二区| 美女视频黄频大全不卡视频在线播放 | 三级成人在线视频| 国产成人综合自拍| 在线精品亚洲一区二区不卡| 91精品国产欧美一区二区| 国产日韩欧美一区二区三区综合| 亚洲欧美在线视频| 日韩精品一卡二卡三卡四卡无卡| 国产一区二区视频在线| 一本色道久久综合亚洲aⅴ蜜桃 | 亚洲精品一区二区三区蜜桃下载 | 一区av在线播放| 精品在线一区二区|