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

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

?? mx27_v4l2_output.c

?? LINUX下的ov2640驅動程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. *//* * The code contained herein is licensed under the GNU General Public * License. You may obtain a copy of the GNU General Public License * Version 2 or later at the following locations: * * http://www.opensource.org/licenses/gpl-license.html * http://www.gnu.org/copyleft/gpl.html *//*! * @file mx27_v4l2_output.c * * @brief MX27 V4L2 Video Output Driver * * Video4Linux2 Output Device using MX27 eMMA Post-processing functionality. * * @ingroup MXC_V4L2_OUTPUT */#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/delay.h>#include <linux/fb.h>#include <linux/pci.h>#include <linux/platform_device.h>#include <media/v4l2-dev.h>#include <asm/poll.h>#include <asm/io.h>#include <asm/semaphore.h>#include "mxc_v4l2_output.h"#include "mx27_pp.h"#include "../drivers/video/mxc/mx2fb.h"#define SDC_FG_FB_FORMAT	V4L2_PIX_FMT_RGB565struct v4l2_output mxc_outputs[1] = {	{	 .index = 0,	 .name = "DISP0 Video Out",	 .type = V4L2_OUTPUT_TYPE_ANALOG,	/* not really correct,						   but no other choice */	 .audioset = 0,	 .modulator = 0,	 .std = V4L2_STD_UNKNOWN},};static int video_nr = 16;static spinlock_t g_lock = SPIN_LOCK_UNLOCKED;vout_data *g_vout;/* debug counters */uint32_t g_irq_cnt;uint32_t g_buf_output_cnt;uint32_t g_buf_q_cnt;uint32_t g_buf_dq_cnt;static int dq_intr_cnt = 0;#ifdef CONFIG_VIDEO_MXC_OUTPUT_FBSYNCstatic uint32_t g_output_fb = -1;static uint32_t g_fb_enabled = 0;static uint32_t g_pp_ready = 0;static int fb_event_notify(struct notifier_block *self,			   unsigned long action, void *data){	struct fb_event *event = data;	struct fb_info *info = event->info;	unsigned long lock_flags;	int blank, i;	for (i = 0; i < num_registered_fb; i++)		if (registered_fb[i] == info)			break;	/*	 * Check if the event is sent by the framebuffer in which	 * the video is displayed.	 */	if (i != g_output_fb)		return 0;	switch (action) {	case FB_EVENT_BLANK:		blank = *(int *)event->data;		spin_lock_irqsave(&g_lock, lock_flags);		g_fb_enabled = !blank;		if (blank && g_pp_ready) {			if (pp_enable(1))				pr_debug("unable to enable PP\n");			g_pp_ready = 0;		}		spin_unlock_irqrestore(&g_lock, lock_flags);		break;	case FB_EVENT_MXC_EOF:		spin_lock_irqsave(&g_lock, lock_flags);		g_fb_enabled = 1;		if (g_pp_ready) {			if (pp_enable(1))				pr_debug("unable to enable PP\n");			g_pp_ready = 0;		}		spin_unlock_irqrestore(&g_lock, lock_flags);		break;	}	return 0;}static struct notifier_block fb_event_notifier = {	.notifier_call = fb_event_notify,};static struct notifier_block mx2fb_event_notifier = {	.notifier_call = fb_event_notify,};#endif#define QUEUE_SIZE (MAX_FRAME_NUM + 1)static __inline int queue_size(v4l_queue * q){	if (q->tail >= q->head)		return (q->tail - q->head);	else		return ((q->tail + QUEUE_SIZE) - q->head);}static __inline int queue_buf(v4l_queue * q, int idx){	if (((q->tail + 1) % QUEUE_SIZE) == q->head)		return -1;	/* queue full */	q->list[q->tail] = idx;	q->tail = (q->tail + 1) % QUEUE_SIZE;	return 0;}static __inline int dequeue_buf(v4l_queue * q){	int ret;	if (q->tail == q->head)		return -1;	/* queue empty */	ret = q->list[q->head];	q->head = (q->head + 1) % QUEUE_SIZE;	return ret;}static __inline int peek_next_buf(v4l_queue * q){	if (q->tail == q->head)		return -1;	/* queue empty */	return q->list[q->head];}static __inline unsigned long get_jiffies(struct timeval *t){	struct timeval cur;	if (t->tv_usec >= 1000000) {		t->tv_sec += t->tv_usec / 1000000;		t->tv_usec = t->tv_usec % 1000000;	}	do_gettimeofday(&cur);	if ((t->tv_sec < cur.tv_sec)	    || ((t->tv_sec == cur.tv_sec) && (t->tv_usec < cur.tv_usec)))		return jiffies;	if (t->tv_usec < cur.tv_usec) {		cur.tv_sec = t->tv_sec - cur.tv_sec - 1;		cur.tv_usec = t->tv_usec + 1000000 - cur.tv_usec;	} else {		cur.tv_sec = t->tv_sec - cur.tv_sec;		cur.tv_usec = t->tv_usec - cur.tv_usec;	}	return jiffies + timeval_to_jiffies(&cur);}/*! * Private function to free buffers * * @param bufs_paddr	Array of physical address of buffers to be freed * * @param bufs_vaddr	Array of virtual address of buffers to be freed * * @param num_buf	Number of buffers to be freed * * @param size		Size for each buffer to be free * * @return status  0 success. */static int mxc_free_buffers(dma_addr_t bufs_paddr[], void *bufs_vaddr[],			    int num_buf, int size){	int i;	for (i = 0; i < num_buf; i++) {		if (bufs_vaddr[i] != 0) {			dma_free_coherent(0, size, bufs_vaddr[i],					  bufs_paddr[i]);			pr_debug("freed @ paddr=0x%08X\n", (u32) bufs_paddr[i]);			bufs_paddr[i] = 0;			bufs_vaddr[i] = NULL;		}	}	return 0;}/*! * Private function to allocate buffers * * @param bufs_paddr	Output array of physical address of buffers allocated * * @param bufs_vaddr	Output array of virtual address of buffers allocated * * @param num_buf	Input number of buffers to allocate * * @param size		Input size for each buffer to allocate * * @return status	-0 Successfully allocated a buffer, -ENOBUFS failed. */static int mxc_allocate_buffers(dma_addr_t bufs_paddr[], void *bufs_vaddr[],				int num_buf, int size){	int i;	for (i = 0; i < num_buf; i++) {		bufs_vaddr[i] = dma_alloc_coherent(0, size,						   &bufs_paddr[i],						   GFP_DMA | GFP_KERNEL);		if (bufs_vaddr[i] == 0) {			mxc_free_buffers(bufs_paddr, bufs_vaddr, i, size);			pr_debug("dma_alloc_coherent failed.\n");			return -ENOBUFS;		}		pr_debug("allocated @ paddr=0x%08X, size=%d.\n",			 (u32) bufs_paddr[i], size);	}	return 0;}static void mxc_v4l2out_timer_handler(unsigned long arg){	int index;	unsigned long timeout;	unsigned long lock_flags;	vout_data *vout = (vout_data *) arg;	pr_debug("timer handler: %lu\n", jiffies);	spin_lock_irqsave(&g_lock, lock_flags);	if ((vout->state == STATE_STREAM_OFF)	    || (vout->state == STATE_STREAM_STOPPING)) {		pr_debug("stream has stopped\n");		goto exit0;	}	/*	 * If timer occurs before PP h/w is ready, then set the state to	 * paused and the timer will be set again when next buffer is queued	 * or PP completes.	 */	if (vout->ipu_buf[0] != -1) {		pr_debug("buffer is busy\n");		vout->state = STATE_STREAM_PAUSED;		goto exit0;	}	/* Dequeue buffer and pass to PP */	index = dequeue_buf(&vout->ready_q);	if (index == -1) {	/* no buffers ready, should never occur */		pr_debug("mxc_v4l2out: timer - no queued buffers ready\n");		goto exit0;	}	g_buf_dq_cnt++;	vout->frame_count++;	vout->ipu_buf[0] = index;	if (pp_ptr((unsigned int)vout->queue_buf_paddr[index])) {		pr_debug("unable to update buffer\n");		goto exit0;	}#ifdef CONFIG_VIDEO_MXC_OUTPUT_FBSYNC	if (vout->tear_protection == TEARING_PROTECTION_ACTIVE) {		if (g_fb_enabled		    && (vout->v4l2_fb.flags != V4L2_FBUF_FLAG_OVERLAY))			g_pp_ready = 1;		else if (pp_enable(1)) {			pr_debug("unable to enable PP\n");			goto exit0;		}	} else if (pp_enable(1)) {		pr_debug("unable to enable PP\n");		goto exit0;	}#else	if (pp_enable(1)) {		pr_debug("unable to enable PP\n");		goto exit0;	}#endif	pr_debug("enabled index %d\n", index);	/* Setup timer for next buffer */	index = peek_next_buf(&vout->ready_q);	pr_debug("next index %d\n", index);	if (index != -1) {		/* if timestamp is 0, then default to 30fps */		if ((vout->v4l2_bufs[index].timestamp.tv_sec == 0)		    && (vout->v4l2_bufs[index].timestamp.tv_usec == 0))			timeout =			    vout->start_jiffies + vout->frame_count * HZ / 30;		else			timeout =			    get_jiffies(&vout->v4l2_bufs[index].timestamp);		if (jiffies >= timeout) {			pr_debug("warning: timer timeout already expired.\n");		}		if (mod_timer(&vout->output_timer, timeout))			pr_debug("warning: timer was already set\n");		pr_debug("timer handler next schedule: %lu\n", timeout);	} else {		vout->state = STATE_STREAM_PAUSED;		pr_debug("timer handler paused\n");	}      exit0:	spin_unlock_irqrestore(&g_lock, lock_flags);}irqreturn_t mxc_v4l2out_pp_in_irq_handler(int irq, void *dev_id){	int last_buf;	int index;	unsigned long timeout;	unsigned long lock_flags;	vout_data *vout = dev_id;	spin_lock_irqsave(&g_lock, lock_flags);	g_irq_cnt++;	if ((vout->state == STATE_STREAM_OFF)	    || (vout->state == STATE_STREAM_STOPPING)) {		spin_unlock_irqrestore(&g_lock, lock_flags);		return IRQ_HANDLED;	}	if (vout->v4l2_fb.flags == V4L2_FBUF_FLAG_OVERLAY) {		struct fb_gwinfo gwinfo;		gwinfo.enabled = 1;		gwinfo.alpha_value = 255;		gwinfo.ck_enabled = 0;		gwinfo.xpos = vout->crop_current.left;		gwinfo.ypos = vout->crop_current.top;		gwinfo.base = (unsigned long)vout->display_bufs[pp_num_last()];		gwinfo.xres = vout->crop_current.width;		gwinfo.yres = vout->crop_current.height;		gwinfo.xres_virtual = vout->crop_current.width;		gwinfo.vs_reversed = 0;		mx2_gw_set(&gwinfo);	}	/* Process previous buffer */	last_buf = vout->ipu_buf[0];	pr_debug("last_buf %d g_irq_cnt %d\n", last_buf, g_irq_cnt);	if (last_buf != -1) {		g_buf_output_cnt++;		vout->v4l2_bufs[last_buf].flags = V4L2_BUF_FLAG_DONE;		queue_buf(&vout->done_q, last_buf);		vout->ipu_buf[0] = -1;		wake_up_interruptible(&vout->v4l_bufq);	}	/* Setup timer for next buffer, when stream has been paused */	if ((vout->state == STATE_STREAM_PAUSED)	    && ((index = peek_next_buf(&vout->ready_q)) != -1)) {		pr_debug("next index %d\n", index);		/* if timestamp is 0, then default to 30fps */		if ((vout->v4l2_bufs[index].timestamp.tv_sec == 0)		    && (vout->v4l2_bufs[index].timestamp.tv_usec == 0))			timeout =			    vout->start_jiffies + vout->frame_count * HZ / 30;		else			timeout =			    get_jiffies(&vout->v4l2_bufs[index].timestamp);		if (jiffies >= timeout) {			pr_debug("warning: timer timeout already expired.\n");		}		vout->state = STATE_STREAM_ON;		if (mod_timer(&vout->output_timer, timeout))			pr_debug("warning: timer was already set\n");		pr_debug("timer handler next schedule: %lu\n", timeout);	}	spin_unlock_irqrestore(&g_lock, lock_flags);	return IRQ_HANDLED;}/*! * Start the output stream * * @param vout      structure vout_data * * * @return status  0 Success */static int mxc_v4l2out_streamon(vout_data * vout){	unsigned long timeout;	int index;	if (!vout)		return -EINVAL;	if (vout->state != STATE_STREAM_OFF)		return -EBUSY;	if (queue_size(&vout->ready_q) < 1) {		pr_debug("no buffers queued yet!\n");		return -EINVAL;	}	vout->ipu_buf[0] = -1;	if (vout->v4l2_fb.flags == V4L2_FBUF_FLAG_OVERLAY) {		/* Free previously allocated buffer */		mxc_free_buffers(vout->display_bufs, vout->display_bufs_vaddr,				 2, vout->sdc_fg_buf_size);		/* Allocate buffers for foreground */		if (mxc_allocate_buffers(vout->display_bufs,					 vout->display_bufs_vaddr, 2,					 vout->sdc_fg_buf_size) < 0) {			pr_debug("unable to allocate SDC FG buffers\n");			return -ENOMEM;		}	}	/* Configure PP */	if (pp_cfg(vout)) {		/* Free previously allocated buffer */		mxc_free_buffers(vout->display_bufs, vout->display_bufs_vaddr,				 2, vout->sdc_fg_buf_size);		pr_debug("failed to config PP.\n");		return -EINVAL;	}#ifdef CONFIG_VIDEO_MXC_OUTPUT_FBSYNC	if (vout->tear_protection == TEARING_PROTECTION_ACTIVE) {		g_output_fb = vout->output_fb_num[vout->cur_disp_output];		g_fb_enabled = 0;		g_pp_ready = 0;		fb_register_client(&fb_event_notifier);		mx2fb_register_client(&mx2fb_event_notifier);	}#endif	vout->frame_count = 0;	vout->state = STATE_STREAM_ON;	index = peek_next_buf(&vout->ready_q);	/* if timestamp is 0, then default to 30fps */	if ((vout->v4l2_bufs[index].timestamp.tv_sec == 0)	    && (vout->v4l2_bufs[index].timestamp.tv_usec == 0))		timeout = jiffies;	else		timeout = get_jiffies(&vout->v4l2_bufs[index].timestamp);	if (jiffies >= timeout) {		pr_debug("warning: timer timeout already expired.\n");	}	vout->start_jiffies = vout->output_timer.expires = timeout;	pr_debug("STREAMON:Add timer %d timeout @ %lu jiffies, current = %lu\n",		 index, timeout, jiffies);	add_timer(&vout->output_timer);	return 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜电影网一区| 日本在线不卡视频一二三区| 精品国产精品一区二区夜夜嗨| 91一区一区三区| 91亚洲精品一区二区乱码| 不卡免费追剧大全电视剧网站| 国产精品系列在线播放| 国产麻豆精品久久一二三| 国产精品主播直播| 国产999精品久久久久久绿帽| 国产成人小视频| 成人av网站免费| 91免费在线视频观看| 在线观看日韩高清av| 69成人精品免费视频| 日韩欧美一级在线播放| 久久久精品人体av艺术| 亚洲青青青在线视频| 亚洲va韩国va欧美va精品 | 国产精品免费av| 亚洲图片你懂的| 天堂精品中文字幕在线| 极品少妇xxxx精品少妇| 99精品一区二区| 欧美精品 国产精品| 久久精品无码一区二区三区| 亚洲精品视频自拍| 国产精品天天看| 五月综合激情婷婷六月色窝| 国产伦精品一区二区三区免费| 91蜜桃在线免费视频| 欧美精品国产精品| 欧美韩日一区二区三区| 日本特黄久久久高潮| 波多野结衣欧美| 欧美一区二区观看视频| 国产精品久久久久7777按摩| 国产**成人网毛片九色| 国产天堂亚洲国产碰碰| 国产亚洲一区二区三区四区| 天天色图综合网| 欧美日本在线视频| 麻豆久久一区二区| 久久久99精品免费观看不卡| 不卡av免费在线观看| 亚洲女爱视频在线| 欧美日韩一区高清| 另类小说综合欧美亚洲| 欧美国产欧美亚州国产日韩mv天天看完整| 国产在线一区二区| 国产精品久久久久影视| 在线免费观看日韩欧美| 日本视频一区二区三区| wwww国产精品欧美| 91麻豆视频网站| 亚洲一区免费在线观看| 日韩美女视频在线| www.av亚洲| 视频一区二区三区入口| 久久综合九色综合欧美98| av中文字幕亚洲| 午夜成人免费电影| 国产午夜精品久久久久久免费视| 成a人片国产精品| 天天操天天色综合| 亚洲国产精品精华液2区45| 日本韩国一区二区三区视频| 麻豆91免费观看| 国产精品白丝在线| 日韩女优av电影| 在线观看av一区二区| 国产精品综合二区| 亚洲成人综合网站| 国产色产综合色产在线视频| 欧美另类videos死尸| 国产99一区视频免费| 午夜激情久久久| 国产精品毛片无遮挡高清| 欧美一区二区三区啪啪| www.欧美色图| 国产一区在线观看视频| 亚洲成人福利片| 中文字幕一区二区三区在线不卡 | 一区二区三区中文字幕电影| 日韩精品一区二区三区四区视频| 色国产综合视频| 国产精选一区二区三区| 日本视频在线一区| 亚洲夂夂婷婷色拍ww47| 综合自拍亚洲综合图不卡区| 久久综合色婷婷| 91精品国产乱码久久蜜臀| 一本色道久久综合亚洲aⅴ蜜桃| 国产丶欧美丶日本不卡视频| 麻豆精品国产91久久久久久 | 亚洲视频资源在线| 久久精品免费在线观看| 51精品国自产在线| 欧美午夜精品久久久久久超碰 | 日韩一级二级三级精品视频| 在线视频欧美区| 色老综合老女人久久久| 丁香啪啪综合成人亚洲小说| 国产自产高清不卡| 精品亚洲免费视频| 美女www一区二区| 日韩av中文在线观看| 丝袜美腿亚洲色图| 日韩精品每日更新| 日韩高清不卡一区二区| 偷拍日韩校园综合在线| 亚洲成人综合在线| 日本午夜精品一区二区三区电影| 日本欧美在线看| 日本最新不卡在线| 精品无人码麻豆乱码1区2区| 精品一区二区三区在线播放 | 亚洲国产成人在线| 国产欧美一区二区三区沐欲| 国产精品麻豆一区二区| 亚洲欧洲成人精品av97| 亚洲欧美日韩综合aⅴ视频| 亚洲天堂久久久久久久| 亚洲在线中文字幕| 青草av.久久免费一区| 精品一区在线看| 成人毛片视频在线观看| 色婷婷激情一区二区三区| 欧美日韩国产电影| 亚洲精品在线三区| 欧美激情综合在线| 怡红院av一区二区三区| 五月婷婷激情综合| 国产一区二区三区高清播放| 成人性生交大片免费| 在线观看成人小视频| 日韩视频一区二区三区在线播放| 久久综合九色综合97婷婷女人 | 欧美性猛交xxxx黑人交| 日韩一区二区三区观看| 亚洲国产精品成人综合色在线婷婷| 亚洲欧美电影一区二区| 五月婷婷综合激情| 国产精品影视天天线| 97精品国产露脸对白| 91精品国产91综合久久蜜臀| 久久久电影一区二区三区| 亚洲精品福利视频网站| 免费xxxx性欧美18vr| aa级大片欧美| 日韩精品一区二区三区三区免费 | 国产精品你懂的| 婷婷六月综合网| 风间由美中文字幕在线看视频国产欧美| 色综合久久综合中文综合网| 精品久久久久久久人人人人传媒| 中文字幕一区二区不卡 | 日韩av中文在线观看| 成人黄动漫网站免费app| 欧美精品aⅴ在线视频| 亚洲国产精品精华液2区45| 日本一区中文字幕 | 99久久99久久久精品齐齐| 欧美一级欧美一级在线播放| 中文字幕佐山爱一区二区免费| 美国一区二区三区在线播放| 91毛片在线观看| 久久久av毛片精品| 爽好多水快深点欧美视频| 成人黄色国产精品网站大全在线免费观看 | 成人一道本在线| 欧美变态tickle挠乳网站| 亚洲国产综合91精品麻豆| 国产成人av一区二区| 日韩视频免费观看高清完整版 | 国产精品情趣视频| 精品在线亚洲视频| 91精品国产综合久久久久久久 | 国产大陆亚洲精品国产| 日韩一二在线观看| 日本亚洲三级在线| 欧美日韩成人高清| 亚洲激情网站免费观看| 99热在这里有精品免费| 国产欧美一区二区三区在线看蜜臀| 捆绑变态av一区二区三区| 欧美日本一区二区| 亚洲1区2区3区4区| 欧美日韩国产影片| 亚洲国产日韩av| 欧美在线视频全部完| 亚洲美女淫视频| 91高清视频在线| 亚洲高清免费在线| 91久久精品国产91性色tv| 中文字幕亚洲电影| 91看片淫黄大片一级在线观看| 日韩理论片中文av| 色激情天天射综合网| 午夜在线电影亚洲一区|