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

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

?? bfin_ad7179fb_main.c

?? ad7179的驅動程序
?? C
字號:
/* * linux/drivers/video/bfin_ad7179.c -- Analog Devices Blackfin + AD7179 video out chip *  * Based on linux/drivers/video/bfin_ad7171_main.c * Copyright 1999 Ben Pfaff <pfaffben@debian.org> and Petr Vandrovec <VANDROVE@vc.cvut.cz> * Copyright 2004 Ashutosh Kumar Singh (ashutosh.singh@rrap-software.com) * Copyright 2006 Sergio Trofino (sergio.trofino@rayvision.com.br) * This file is subject to the terms and conditions of the GNU General * Public License.  See the file COPYING in the main directory of this * archive for more details.   */#include <linux/module.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/string.h>#include <linux/mm.h>#include <linux/tty.h>#include <linux/slab.h>#include <linux/delay.h>#include <linux/fb.h>#include <linux/ioport.h>#include <linux/init.h>#include <linux/types.h>#include <linux/interrupt.h>#include <linux/sched.h>#include <asm/blackfin.h>#include <asm/irq.h>#include <asm/dma.h>#include <linux/dma-mapping.h>#include "bfin_ad7179fb.h"#define BFIN_FB_PHYS_LEN (RGB_WIDTH*RGB_HEIGHT*sizeof(struct rgb_t))#define BFIN_FB_YCRCB_LEN (YCBCR_WIDTH*YCBCR_HEIGHT)struct dma_descriptor {	unsigned int * next_desc;	unsigned int * start_addr;} descriptor;unsigned char * ycrcb_buffer1 = 0x02000000, * ycrcb_buffer2 = 0x03000000;struct timer_list bfin_framebuffer_timer;static int bfin_ad7179_fb_open(struct fb_info *info, int user);static int bfin_ad7179_fb_release(struct fb_info *info, int user);static int bfin_fb_mmap(struct fb_info *info, struct vm_area_struct * vma);static void bfin_config_ppi(void);static void bfin_config_dma(void *ycrcb_buffer1);static void bfin_disable_dma(void);static void bfin_enable_ppi(void);static void bfin_disable_ppi(void);static void bfin_framebuffer_init(void *ycrcb_buffer1, void *ycrcb_buffer2);static void bfin_framebuffer_update(unsigned char *ycrcb_buffer1, unsigned char *ycrcb_buffer2);static void bfin_framebuffer_timer_setup(void);static void bfin_framebuffer_timerfn(unsigned long data);//extern unsigned long l1_data_A_sram_alloc(unsigned long size);//extern int l1_data_A_sram_free(unsigned long addr);#include <linux/video_encoder.h>#include <linux/videodev.h>static char adv7179_name[] = "adv7179";static char *norms[] = { "PAL", "NTSC" };/* * card parameters */static struct fb_info bfin_ad7179_fb;static struct bfin_ad7179_fb_par {	/* structure holding blackfin / ad7179 paramters when           screen is blanked */	struct {		unsigned char	Mode;		/* ntsc/pal/? */	} vga_state;	atomic_t ref_count;} bfin_par;/* --------------------------------------------------------------------- */static struct fb_var_screeninfo bfin_ad7179_fb_defined = {	.xres		= RGB_WIDTH,	.yres		= RGB_HEIGHT,	.xres_virtual	= RGB_WIDTH,	.yres_virtual	= RGB_HEIGHT,	.bits_per_pixel	= 16,		.activate	= FB_ACTIVATE_TEST,	.height		= -1,	.width		= -1,	.left_margin	= 0,	.right_margin	= 0,	.upper_margin	= 0,	.lower_margin	= 0,	.vmode		= FB_VMODE_INTERLACED,};static struct fb_fix_screeninfo bfin_ad7179_fb_fix __initdata = {	.id		= "BFIN 7179",	.smem_len	= BFIN_FB_PHYS_LEN,	.type		= FB_TYPE_PACKED_PIXELS,	.visual		= FB_VISUAL_TRUECOLOR,	.xpanstep	= 0,	.ypanstep	= 0,	.line_length	= RGB_WIDTH*2,	.accel		= FB_ACCEL_NONE};static struct fb_ops bfin_ad7179_fb_ops = {	.owner		= THIS_MODULE,	.fb_open        = bfin_ad7179_fb_open,	.fb_release     = bfin_ad7179_fb_release,	.fb_mmap	= bfin_fb_mmap,};static void bfin_framebuffer_timer_setup(void){	init_timer(&bfin_framebuffer_timer) ;        bfin_framebuffer_timer.function = bfin_framebuffer_timerfn ;        bfin_framebuffer_timer.expires = jiffies + 10 ;	add_timer(&bfin_framebuffer_timer);}static void bfin_framebuffer_timerfn(unsigned long data){	bfin_framebuffer_update(ycrcb_buffer1, ycrcb_buffer2);	bfin_framebuffer_timer_setup();}	static int bfin_fb_mmap(struct fb_info *info, struct vm_area_struct * vma){  /* we really dont need any map ... not sure how the smem_start will     end up in the kernel  */	int a;	a = ycrcb_buffer2;	*(ycrcb_buffer1 + 900900) = a>>24;	*(ycrcb_buffer1 + 900901) = a>>16;	*(ycrcb_buffer1 + 900902) = a>>8;	*(ycrcb_buffer1 + 900903) = a;	vma->vm_start  = (int)ycrcb_buffer1;	return (int)ycrcb_buffer1;}static void bfin_framebuffer_init(void *ycrcb_buffer1, void *ycrcb_buffer2){	/*unsigned char * ycrcb_ptr = ycrcb_buffer;	int i, j;		for(j = 0; j < (RGB_WIDTH * YCBCR_HEIGHT); j++)		{			*ycrcb_ptr++=0x80;			*ycrcb_ptr++=0x10;		}*/	char *dest1 = (void *)ycrcb_buffer1;	char *dest2 = (void *)ycrcb_buffer2;        int lines;                                                                                                                                                             	for ( lines = 0; lines < YCBCR_HEIGHT; lines++ )	{	        int offset = 0;		unsigned int code;	        int i;#ifdef CONFIG_NTSC		if((lines>=0 && lines<=2) || (lines>=265 && lines <=281))			offset = 0;		else if((lines>=3 && lines<=18) || (lines>=263 && lines<=264))			offset = 1;		else if(lines>=19 && lines<=262)			offset = 2;		else if(lines>=282 && lines<=524)			offset = 3;#else // CONFIG_PAL		if((lines>=1 && lines<=22) || (lines>=311 && lines<=312))			offset = 0;		else if(lines>=23 && lines<=310)			offset = 1;		else if((lines>=313 && lines<=335) || (lines>=624 && lines <=625))			offset = 2;		else if(lines>=336 && lines<=623)			offset = 3;#endif		else				printk("Frame buffer init error\n");		                                                                                                                                             	        // Output EAV code	        code = system_code_map[ offset ].eav;	        *dest1++ = (char) (code >> 24) & 0xff;	        *dest1++ = (char) (code >> 16) & 0xff;	        *dest1++ = (char) (code >> 8) & 0xff;	        *dest1++ = (char) (code) & 0xff;		*dest2++ = (char) (code >> 24) & 0xff;	        *dest2++ = (char) (code >> 16) & 0xff;	        *dest2++ = (char) (code >> 8) & 0xff;	        *dest2++ = (char) (code) & 0xff;	                                                                                                                                             	        // Output horizontal blanking	        for ( i = 0; i < HB_LENGTH/2; ++i )	        {	                *dest1++ = 0x80;	                *dest1++ = 0x10;			*dest2++ = 0x80;	                *dest2++ = 0x10;	        }	                                                                                                                                             	        // Output SAV	        code = system_code_map[ offset ].sav;	        *dest1++ = (char) (code >> 24) & 0xff;	        *dest1++ = (char) (code >> 16) & 0xff;	        *dest1++ = (char) (code >> 8) & 0xff;	        *dest1++ = (char) (code) & 0xff;		*dest2++ = (char) (code >> 24) & 0xff;	        *dest2++ = (char) (code >> 16) & 0xff;	        *dest2++ = (char) (code >> 8) & 0xff;	        *dest2++ = (char) (code) & 0xff;	                                                                                                                                             	        // Output empty horizontal data	        for ( i = 0; i <RGB_WIDTH; ++i )	        {	                *dest1++ = 0x80;	                *dest1++ = 0x10;			*dest2++ = 0x80;	                *dest2++ = 0x10;	        }        }}void bfin_framebuffer_update(unsigned char *ycrcb_buffer1, unsigned char *ycrcb_buffer2){	if (*(ycrcb_buffer1+900902))	{		*(ycrcb_buffer1+900902) = 0;		if (*(ycrcb_buffer1+900901) == 1)			descriptor.start_addr = (unsigned int *) ycrcb_buffer1;		else			descriptor.start_addr = (unsigned int *) ycrcb_buffer2;	}}	static void bfin_config_dma(void *ycrcb_buffer1){		descriptor.next_desc = (unsigned int *) &descriptor;	descriptor.start_addr = (unsigned int *) ycrcb_buffer1;	bfin_write_DMA1_1_NEXT_DESC_PTR((unsigned int *)&descriptor);	bfin_write_DMA1_1_START_ADDR(ycrcb_buffer1);	bfin_write_DMA1_1_X_COUNT(YCBCR_WIDTH/4);        bfin_write_DMA1_1_X_MODIFY(0x0004);        bfin_write_DMA1_1_Y_COUNT(YCBCR_HEIGHT);        bfin_write_DMA1_1_Y_MODIFY(0x0004);        bfin_write_DMA1_1_CONFIG(0x7419);#if 0        *pDMA1_1_START_ADDR       = ycrcb_buffer;        *pDMA1_1_X_COUNT          = YCBCR_WIDTH/2;        *pDMA1_1_X_MODIFY         = 0x0002;        *pDMA1_1_Y_COUNT          = YCBCR_HEIGHT;        *pDMA1_1_Y_MODIFY         = 0x0002;        *pDMA1_1_CONFIG           = 0x1015;#endif	}static void bfin_disable_dma(void){	bfin_write_DMA1_1_CONFIG(bfin_read_DMA1_1_CONFIG() & (~DMAEN));#if 0	*pDMA1_1_CONFIG		&= ~DMAEN;#endif}static void bfin_config_ppi(void){#ifdef CONFIG_BF537        *pPORTG_FER   = 0xFFFF; /* PPI[15:0]    */        *pPORTF_FER  |= 0x8380; /* PF.15 - PPI_CLK */        *pPORT_MUX   &= ~0x0E00;        *pPORT_MUX   |= 0x0100;#endif	bfin_write_PPI1_CONTROL(0x0182);//	bfin_write_PPI1_COUNT(720*2-1);//	bfin_write_PPI1_DELAY(122*2-1);        bfin_write_PPI1_FRAME(YCBCR_HEIGHT-1);}static void bfin_enable_ppi(void){	bfin_write_PPI1_CONTROL(bfin_read_PPI1_CONTROL() | PORT_EN);#if 0	*pPPI1_CONTROL		* matriz_y_i = malloc( sizeof(dma_img_dsc) * 2);|= PORT_EN;#endif}static void bfin_disable_ppi(void){	bfin_write_PPI1_CONTROL(bfin_read_PPI1_CONTROL() & (~PORT_EN));#if 0	*pPPI1_CONTROL		&= ~PORT_EN;#endif}static void Reset_ADV7179(void){	bfin_write_FIO0_DIR(bfin_read_FIO0_DIR() | RESET_ADV7179);	udelay(DELAY_RESET);	// generate reset pulse	bfin_write_FIO0_FLAG_C(RESET_ADV7179);	// clear bit to reset ADV7179 	udelay(DELAY_RESET);	bfin_write_FIO0_FLAG_S(RESET_ADV7179);	// set bit to re-enable ADV7179 	udelay(DELAY_RESET);#if 0	*pFIO0_DIR |= RESET_ADV7179;	udelay(DELAY_RESET);	// generate reset pulse	*pFIO0_FLAG_C = RESET_ADV7179;	// clear bit to reset ADV7179 	udelay(DELAY_RESET);	*pFIO0_FLAG_S = RESET_ADV7179;	// set bit to re-enable ADV7179 	udelay(DELAY_RESET);#endif}int __init bfin_ad7179_fb_init(void){	int ret = 0;		// configure RESET flag as output		Reset_ADV7179();	udelay(5 * (DELAY_RESET));	printk(KERN_NOTICE "bfin_ad7179_fb: initializing:\n");	//ycrcb_buffer1 = (unsigned char *)kmalloc(BFIN_FB_YCRCB_LEN+4, GFP_KERNEL);	//memset(ycrcb_buffer1, 0, BFIN_FB_YCRCB_LEN);	//ycrcb_buffer2 = (unsigned char *)kmalloc(BFIN_FB_YCRCB_LEN, GFP_KERNEL);	//memset(ycrcb_buffer2, 0, BFIN_FB_YCRCB_LEN);	bfin_ad7179_fb.screen_base = (void *)ycrcb_buffer1;	bfin_ad7179_fb_fix.smem_start = (int)ycrcb_buffer1;	if (!bfin_ad7179_fb.screen_base) {		printk("bfin_ad7179_fb: unable to map device\n");		ret = -ENOMEM;	}	bfin_ad7179_fb_defined.red.length   = 8;	bfin_ad7179_fb_defined.green.length = 8;	bfin_ad7179_fb_defined.blue.length  = 8;		bfin_ad7179_fb.fbops = &bfin_ad7179_fb_ops;	bfin_ad7179_fb.var = bfin_ad7179_fb_defined;	// our physical memory is dynamically allocated	bfin_ad7179_fb_fix.smem_start	= (int)ycrcb_buffer1;	bfin_ad7179_fb.fix = bfin_ad7179_fb_fix;	bfin_ad7179_fb.par = &bfin_par;	bfin_ad7179_fb.flags = FBINFO_DEFAULT;	if (register_framebuffer(&bfin_ad7179_fb) < 0) {		printk(KERN_ERR "bfin_ad7179_fb: unable to register framebuffer\n");		ret = -EINVAL;	}	printk(KERN_INFO "fb%d: %s frame buffer device\n",	       bfin_ad7179_fb.node, bfin_ad7179_fb.fix.id);	printk(KERN_INFO "fb memory address : 0x%p\n",ycrcb_buffer1);	return ret;}static int bfin_ad7179_fb_open(struct fb_info *info, int user){	bfin_ad7179_fb.screen_base = (void *)ycrcb_buffer1;	bfin_ad7179_fb_fix.smem_start = (int)ycrcb_buffer1;	if (!bfin_ad7179_fb.screen_base) {		printk("bfin_ad7179_fb: unable to map device\n");		return -ENOMEM;	}        bfin_framebuffer_init(ycrcb_buffer1, ycrcb_buffer2);	bfin_framebuffer_timer_setup(); 	bfin_config_ppi();	bfin_config_dma(ycrcb_buffer1);	bfin_enable_ppi();	return 0;}static int bfin_ad7179_fb_release(struct fb_info *info, int user){	del_timer(&bfin_framebuffer_timer);	bfin_disable_dma();	bfin_disable_ppi();	return 0;}static void __exit bfin_ad7179_fb_exit(void){	if(ycrcb_buffer1)                kfree(ycrcb_buffer1);	if(ycrcb_buffer2)                kfree(ycrcb_buffer2);	unregister_framebuffer(&bfin_ad7179_fb);}MODULE_LICENSE("GPL");module_init(bfin_ad7179_fb_init);module_exit(bfin_ad7179_fb_exit);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕精品一区二区精品绿巨人 | 国产精品国产三级国产aⅴ无密码| 久久99久久精品欧美| 欧美一区二区视频在线观看2020 | 91精品1区2区| 亚洲精品乱码久久久久久久久| 不卡大黄网站免费看| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 国产欧美视频一区二区| 激情综合一区二区三区| 久久综合久久综合亚洲| 国产.欧美.日韩| 国产精品美女一区二区| 日本高清成人免费播放| 午夜伊人狠狠久久| 日韩精品最新网址| 国产成人综合在线播放| 亚洲欧洲精品天堂一级| 欧美三日本三级三级在线播放| 日本人妖一区二区| 国产网站一区二区三区| 91成人在线精品| 蜜桃久久精品一区二区| 中文成人av在线| 欧美日韩免费不卡视频一区二区三区 | 欧美高清dvd| 国产麻豆视频一区二区| 1024成人网| 日韩欧美中文字幕精品| 国产一区二区美女诱惑| 亚洲伦理在线免费看| 欧美一级片在线| 99亚偷拍自图区亚洲| 日本vs亚洲vs韩国一区三区二区 | av一区二区三区在线| 亚洲香蕉伊在人在线观| 精品久久久久久久久久久院品网 | 精品无人区卡一卡二卡三乱码免费卡| 国产欧美一区二区精品性| 色噜噜狠狠色综合中国| 精品一二三四区| 亚洲午夜av在线| 国产欧美日韩激情| 6080yy午夜一二三区久久| 成人国产电影网| 美女视频黄频大全不卡视频在线播放| 18涩涩午夜精品.www| 日韩免费一区二区三区在线播放| 91在线porny国产在线看| 蜜桃免费网站一区二区三区| 一区二区成人在线视频| 久久精品一区二区三区不卡| 8x8x8国产精品| aaa欧美大片| 国产高清不卡一区| 日韩电影在线观看电影| 亚洲欧美日韩国产成人精品影院 | 亚洲欧洲日产国产综合网| 91 com成人网| 欧美日韩精品欧美日韩精品 | 日本黄色一区二区| 国产成人免费视频| 久久超碰97中文字幕| 亚洲午夜免费福利视频| 亚洲色图在线视频| 中文字幕精品综合| www国产精品av| 欧美成人性战久久| 91精品国产一区二区三区香蕉| 欧美主播一区二区三区| 91在线观看下载| 99久久精品国产麻豆演员表| 成人动漫一区二区在线| 国产精品996| 国产精品91一区二区| 韩日av一区二区| 激情欧美日韩一区二区| 麻豆精品一区二区综合av| 奇米亚洲午夜久久精品| 日韩av一区二区三区四区| 亚洲一二三区视频在线观看| 亚洲主播在线观看| 一区二区三区 在线观看视频| 亚洲精品你懂的| 亚洲午夜成aⅴ人片| 日韩在线一区二区| 日韩av一区二区在线影视| 免费成人在线视频观看| 久久激情五月激情| 久久99国产精品久久99| 国产乱码精品一区二区三| 国产精品99久久不卡二区| 成人午夜大片免费观看| av中文字幕一区| 欧美天堂亚洲电影院在线播放| 欧美日韩免费在线视频| 欧美一区中文字幕| 欧美mv日韩mv| 国产免费成人在线视频| 自拍偷拍亚洲激情| 亚洲6080在线| 久久成人精品无人区| 国产高清成人在线| 色天天综合色天天久久| 欧美军同video69gay| 日韩一区二区精品葵司在线| 久久伊人蜜桃av一区二区| 国产精品全国免费观看高清| 亚洲免费在线看| 免费观看久久久4p| 国产69精品久久777的优势| 91福利在线观看| 日韩欧美中文一区二区| 国产精品三级电影| 午夜久久久久久| 国产精品一卡二| 欧美做爰猛烈大尺度电影无法无天| 91精品国产一区二区人妖| 国产日韩亚洲欧美综合| 亚洲国产综合视频在线观看| 韩国女主播一区二区三区| 91视频.com| 精品国产一区二区三区久久久蜜月| 国产精品国产三级国产普通话三级| 天天做天天摸天天爽国产一区| 国产尤物一区二区在线| 91福利在线看| 国产网红主播福利一区二区| 夜夜嗨av一区二区三区四季av| 久久99精品国产麻豆婷婷洗澡| 91色视频在线| 欧美精品一区二区三区蜜桃视频 | 亚洲高清免费观看| 国产九色精品成人porny| 欧美最猛性xxxxx直播| 国产日韩欧美高清| 日韩国产高清在线| 成人激情av网| 精品99999| 午夜日韩在线观看| 91视频com| 中文字幕国产精品一区二区| 日本 国产 欧美色综合| 色狠狠色噜噜噜综合网| 日本一区二区在线不卡| 麻豆成人在线观看| 欧美性色综合网| 专区另类欧美日韩| 国产二区国产一区在线观看| 欧美一区二区美女| 一级精品视频在线观看宜春院| 成人免费看片app下载| 337p粉嫩大胆噜噜噜噜噜91av| 日韩中文字幕亚洲一区二区va在线| 在线视频你懂得一区二区三区| 日本一区二区不卡视频| 国产在线精品一区二区夜色 | 亚洲欧美激情插| 丁香婷婷综合网| 久久精品亚洲麻豆av一区二区| 麻豆久久久久久| 欧美一级片免费看| 免费一区二区视频| 正在播放一区二区| 首页国产丝袜综合| 欧美精品少妇一区二区三区| 一区二区三区在线免费播放| 色综合色综合色综合| 亚洲欧洲日产国码二区| av电影天堂一区二区在线观看| 日本一区二区不卡视频| 国产福利91精品一区二区三区| 久久免费精品国产久精品久久久久 | 美女任你摸久久| 欧美一区二区三区人| 日韩精品成人一区二区在线| 欧美精品久久99久久在免费线| 亚洲h精品动漫在线观看| 欧美日韩精品三区| 日韩精品高清不卡| 91精品国产91久久综合桃花| 日本成人在线电影网| 日韩一区二区免费在线电影| 国内外成人在线| 国产亚洲成av人在线观看导航| 成人一区二区三区| 国产精品电影院| 在线视频一区二区三| 性欧美大战久久久久久久久| 欧美一区二区福利在线| 国内精品写真在线观看| 国产精品视频yy9299一区| 色狠狠一区二区三区香蕉| 午夜电影久久久| 精品国产一区二区三区不卡| 成人黄色大片在线观看| 亚洲一区免费在线观看| 日韩一区二区三区电影在线观看 | 欧美一区二区三区四区高清| 激情五月播播久久久精品|