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

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

?? pxa270_ch7013.c

?? ch7013數據手冊和21下的驅動
?? C
字號:
/** * @file ch7013.c * @brief Source file for CH7013B tvout driver. * * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * Copyright (C) 2006 Sitek Hengke Electronics Wuxi. *                              http://www.sitek.cn * Modification history: *  * Nov.  29, 2006.  Gary * 	Initial version of this file. *  */#include <linux/kernel.h>#include <linux/module.h>#include <linux/mm.h>#include <linux/slab.h>#include <linux/init.h>#include <linux/i2c.h>#include <linux/i2c-algo-bit.h>#include <linux/i2c-id.h>#include <linux/poll.h>#include <linux/miscdevice.h>#include <linux/proc_fs.h>#include <linux/delay.h>#include <asm/types.h>#include <asm/hardware.h>#include <asm/arch/pxa-regs.h>#include "tvout.h"#include "ch7013.h"extern int pxa27x_set_cpufreq(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int);	extern unsigned int get_clk_frequency_khz(int info);#define MODULE_NAME	"tvout"static int g_tvout_major = 0;static lcdc_regs_t g_lcdc_regs;/*************************************************************************************************	i2c related*************************************************************************************************/#define I2C_DRIVERID_I2CCH7013 0xF000#define I2C_M_READ 0x01#define I2C_M_WT 0x02//CH7013 i2c addr//ADDR   Serial Address Selected//  1        111 0101 = 75h          //high: 0xEA(write), 0xEB(read)//  0        111 0110 = 76h	     // low:  0xEC(write), 0xED(read)#define CH7013_I2C_ADDR  0x76	//0xECstatic int i2c_ch7013_attach_adapter (struct i2c_adapter * adap);static struct i2c_driver i2c_ch7013_driver ={	name:		"i2c-ch7013 client driver",	id:		I2C_DRIVERID_I2CCH7013,	flags:		I2C_DF_NOTIFY,	attach_adapter:	i2c_ch7013_attach_adapter,	detach_client:	NULL,	command:	NULL};static struct i2c_client i2c_ch7013_client ={	name:		"i2c-ch7013 client",	id:		2,	flags:		0,	addr:		-1,	adapter:	NULL,	driver:		&i2c_ch7013_driver};static int i2c_ch7013_attach_adapter (struct i2c_adapter * adap){	if (memcmp(adap->name, "PXA i2c adapter", 15) != 0 ) {		return -ENODEV;	}	i2c_ch7013_client.adapter = adap;	return 0;}void i2c_ch7013_init(void){	/* 	 * set the address of the CH7013 to the client	 */	i2c_ch7013_client.addr = CH7013_I2C_ADDR;	/* 	 * call the i2c_add_driver() to register the driver 	 * to the Linux I2C system	 */	if (i2c_add_driver( &i2c_ch7013_driver ) != 0) {		printk("I2C add driver failed\n");		return;	}	/* 	 * attach the client to the adapter by calling the i2c_attach_client() 	 * function of the Linux I2C system	 */	if (i2c_attach_client(&i2c_ch7013_client ) != 0) {			printk("I2C attach client failed\n");		i2c_del_driver(&i2c_ch7013_driver);		return;	}}void i2c_ch7013_cleanup(void){	i2c_detach_client(&i2c_ch7013_client );	i2c_del_driver(&i2c_ch7013_driver);}/** * @brief Write one byte to CH7013 register * * @param reg	CH7013 register address * @param data  Data to be written to the register */static int i2c_ch7013_write(unsigned int reg, unsigned char data){	struct i2c_msg msg;	char buf[2];	int ret;	/* 	 * store the register value to the first address of the buffer 	 * the adapter/algorithm driver will regard the first byte 	 * as the register value 	 */	buf[0] = (char)reg;	buf[1] = data;			/* 	 * initialize the message structure	 */	msg.addr = i2c_ch7013_client.addr;	msg.flags = I2C_M_WT;	msg.len = 2;	msg.buf = buf;		ret = i2c_transfer( i2c_ch7013_client.adapter, &msg, 1 );	return ret;}static int i2c_ch7013_read(unsigned int reg_offset, unsigned char *buf){	struct i2c_msg msg[2]  = {		{ i2c_ch7013_client.addr, 0,        1, &reg_offset },		{ i2c_ch7013_client.addr, I2C_M_RD, 1, buf }	};	if (i2c_transfer( i2c_ch7013_client.adapter, msg, 2 ) == 2)		return 2;	else		return 0;}/*************************************************************************************************	End of i2c related*************************************************************************************************////////////////////////////////////////////////////////////////////////TVOUT CH7013 Part////////////////////////////////////////////////////////////////////static int ch7013_program(void);static void ch7013_hw_init(void);static void ch7013_hw_exit(void);static void ch7013_save_lcdc(void);static ch7013_fixed_table_t ctable[] ={	{0x60, 0x2A, 0x50, 0x74, 0x31, 0x81, 0x18, 0x2D, 0x40,  0x0D, 0x14, 0x300AE7C4, 0x10, 0x00},	//display mode 13	{0x61, 0x2A, 0x50, 0x44, 0x31, 0x81, 0x36, 0x2C, 0x40,  0x04, 0x09, 0x266F1FD0, 0x10, 0x00},	//display mode 14	{0x69, 0x2A, 0x50, 0x6A, 0x30, 0x81, 0x1F, 0xF9, 0x40,  0x3F, 0x6E, 0x25249249, 0x00, 0x00},	//display mode 16	{0x6A, 0x2A, 0x50, 0x64, 0x30, 0x81, 0x2D, 0xFD, 0x40,  0x3F, 0x7E, 0x20800000, 0x00, 0x00},	//display mode 17};static int ch7013_program(void){	int idx;	unsigned char chip_ver;			idx = 3;	i2c_ch7013_write(0x0E, 0x00);			//soft reset	mdelay(1);	i2c_ch7013_write(0x0E, 0x0B);			//all are active	mdelay(1);		i2c_ch7013_read(0x25, &chip_ver);	printk("Chip version ID(0x22)= 0x%X", chip_ver);	i2c_ch7013_write(0x00, ctable[idx].DMR);	//display mode	i2c_ch7013_write(0x01, ctable[idx].FFR);	//flicker filter settings	i2c_ch7013_write(0x04, 0x00);	                     //Input data format		 16bit 565	i2c_ch7013_write(0x06, ctable[idx].CM);	//clock mode	i2c_ch7013_write(0x07, ctable[idx].SAV);	//start of active video register	i2c_ch7013_write(0x08, ctable[idx].PO);	//position overflow	i2c_ch7013_write(0x09, ctable[idx].BLR);	//black level	i2c_ch7013_write(0x0A, ctable[idx].HPR);	//horizontal position	i2c_ch7013_write(0x0B, ctable[idx].VPR);	//vertical position	i2c_ch7013_write(0x13, ctable[idx].MNE);	//PLLM and PLLN	i2c_ch7013_write(0x14, ctable[idx].PLLM);	i2c_ch7013_write(0x15, ctable[idx].PLLN);	i2c_ch7013_write(0x20, ctable[idx].PLLC);	//PLL control	i2c_ch7013_write(0x21, ctable[idx].CIVC);	//turn off CIV	i2c_ch7013_write(0x18, (ctable[idx].FSCI & 0xF0000000) >> 28);	i2c_ch7013_write(0x19, (ctable[idx].FSCI & 0x0F000000) >> 24);	i2c_ch7013_write(0x1A, (ctable[idx].FSCI & 0x00F00000) >> 20);	i2c_ch7013_write(0x1B, (ctable[idx].FSCI & 0x000F0000) >> 16);	i2c_ch7013_write(0x1C, (ctable[idx].FSCI & 0x0000F000) >> 12);	i2c_ch7013_write(0x1D, (ctable[idx].FSCI & 0x00000F00) >> 8);	i2c_ch7013_write(0x1E, (ctable[idx].FSCI & 0x000000F0) >> 4);	i2c_ch7013_write(0x1F, ctable[idx].FSCI & 0x0000000F);		return 0;}//This function config LCDC registers to fit TVOUT output.static void ch7013_set_lcdc(void){	unsigned int reg_lccr0;	unsigned int reg_lccr1;	unsigned int reg_lccr2;	unsigned int reg_lccr3;	unsigned int PCD;		LCCR0 = 0;	LCCR1 = 0;	LCCR2 = 0;	LCCR3 = 0;	LCCR4 = 0;	LCCR5 = 0x3f3f3f3f;	FSADR0 = g_lcdc_regs.fsadr0;	FDADR0 = g_lcdc_regs.fdadr0;	FIDR0 = g_lcdc_regs.fidr0;	LDCMD0 = g_lcdc_regs.ldcmd0;		// Configure the LCD Controller Control Registers	PCD = 2;		reg_lccr0 = (LCCR0_BM | LCCR0_PAS | \                      LCCR0_EFM | LCCR0_IUM | LCCR0_SFM | LCCR0_LDM);	LCCR0 = reg_lccr0;  	 reg_lccr1 = (LCD_PPL(640) | LCD_HSW(0x35) | LCD_ELW(0x10)  | LCD_BLW(0x4B));	 LCCR1 = reg_lccr1; 	reg_lccr2 = (LCD_LPP(480) | LCD_VSW(0x30) | LCD_EFW(0x22)  | LCD_BFW(0x20));   	LCCR2 = reg_lccr2;  	reg_lccr3 = (LCD_PCD(PCD)  | LCD_BPP(4) |LCD_OEP|LCD_PCP | LCD_PDFOR(PDFOR_00)); 	LCCR3 = reg_lccr3; 	 	LCCR4 = 0x80000000;		// enable LCD Controller	LCCR0 |= LCD_ENB;		//printk("lccr0: 0x%08x \n", LCCR0);	//printk("lccr1: 0x%08x \n", LCCR1);	//printk("lccr2: 0x%08x \n", LCCR2);	//printk("lccr3: 0x%08x \n", LCCR3);	//printk("lccr4: 0x%08x \n", LCCR4);}#if 0static void ch7013_regs_dump(void){	unsigned int k;	unsigned char v;		for (k = 0x00; k <= 0x29; k++) {		i2c_ch7013_read(k, &v);		printk("REG:%x = 0x%x \n", k, v);	}}#endif//This function modify PXA27x CPU Clock and LCDC Clockstatic void ch7013_change_cpufreq(void){	//unsigned int CCCR_L;	//int LCLK = 0;	unsigned int l = 26;	unsigned int n2 = 3;	unsigned int t = 2; 	unsigned int b = 0;	unsigned int a = 1;	unsigned int memclk, lcdclk;		//printk("*******************First**************************\n");	//get_clk_frequency_khz(1);	//memclk = get_memclk_frequency_10khz();	//lcdclk = get_lcdclk_frequency_10khz();	//printk("memclk = %d,  lcdclk = %d\n", memclk, lcdclk);	ch7013_save_lcdc();	// 1. turn off LCDC clock before change 	CKEN &= (~0x10000);		// 2. change CPU clock	pxa27x_set_cpufreq(l, n2, b, t, a);	// 3. turn on LCDC clock	CKEN |= 0x110000;		//printk("********************Second*************************\n");	get_clk_frequency_khz(1);	memclk = get_memclk_frequency_10khz();	lcdclk = get_lcdclk_frequency_10khz();	printk("memclk = %d,  lcdclk = %d\n", memclk, lcdclk);		return;}/** * @brief Save the register values/status that might be changed by tvout */static void ch7013_save_lcdc(void){	g_lcdc_regs.lccr0 = LCCR0;	g_lcdc_regs.lccr1 = LCCR1;	g_lcdc_regs.lccr2 = LCCR2;	g_lcdc_regs.lccr3 = LCCR3;	g_lcdc_regs.fsadr0 = FSADR0;	g_lcdc_regs.fdadr0 = FDADR0;	g_lcdc_regs.fidr0 = FIDR0;	g_lcdc_regs.ldcmd0 = LDCMD0;	}static void ch7013_hw_init(void){	i2c_ch7013_init();		ch7013_change_cpufreq();		ch7013_set_lcdc();		mdelay(10);	ch7013_program();}static void ch7013_hw_exit(void){	i2c_ch7013_cleanup();}#if 0static void ch7013_i2c_test(void){	unsigned char chip_ver;	//silicon ID	printk("read id:\n");	i2c_ch7013_read(0x25, &chip_ver);	printk("Chip version ID(0x22)= 0x%X", chip_ver);}#endifstatic int ch7013_open(struct inode * inode, struct file * filp){	return 0;}static int ch7013_release(struct inode * inode, struct file * filp){	return 0;}static int ch7013_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg){	int ret = 0;		return ret;}struct file_operations g_tvout_fops = {	owner:		THIS_MODULE,	ioctl:		ch7013_ioctl,	open:		ch7013_open,	release:		ch7013_release,};static int __init ch7013_init(void){	printk("PXA27x CH7013 tvout driver.\n"); 	g_tvout_major = register_chrdev(0, MODULE_NAME, &g_tvout_fops); 	if (g_tvout_major < 0) { 		printk("Unable to register %s driver.\n",MODULE_NAME);		remove_proc_entry(MODULE_NAME, NULL); 		return -ENODEV; 	} else {		printk("/dev/tvout major device number is: %d\n", g_tvout_major); 	}	ch7013_hw_init();		//printk("%s driver init successfully.\n",MODULE_NAME);	//ch7013_i2c_test();	//ch7013_regs_dump();		return 0;}static void __exit ch7013_exit(void){	ch7013_hw_exit();	if (g_tvout_major > 0) {		unregister_chrdev(g_tvout_major, MODULE_NAME);	}}module_init(ch7013_init);module_exit(ch7013_exit);MODULE_DESCRIPTION("PXA270 TVOUT CH7013 Driver ");MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久国产精麻豆99网站| 日韩欧美一二三| 国产精品一区在线观看你懂的| 日韩国产精品久久久久久亚洲| 亚洲激情图片qvod| 综合久久国产九一剧情麻豆| 亚洲区小说区图片区qvod| 中文字幕一区二区三区蜜月| 国产精品美女久久久久久久久久久| 国产日韩一级二级三级| 国产午夜精品久久久久久久 | 日本欧美在线观看| 青草国产精品久久久久久| 日本欧美一区二区三区乱码| 久久精品久久综合| 国产成人在线色| eeuss鲁片一区二区三区 | 国产麻豆精品在线| 国产激情一区二区三区桃花岛亚洲| 国产福利一区二区三区视频在线| 国产精品一区二区男女羞羞无遮挡| 国产在线国偷精品免费看| 国产成人综合亚洲91猫咪| 91在线视频官网| 欧美色欧美亚洲另类二区| 日韩午夜在线观看| 国产精品夫妻自拍| 亚洲自拍另类综合| 精品亚洲aⅴ乱码一区二区三区| 国产一区二区福利| 色噜噜狠狠成人网p站| 日韩一级二级三级| 国产精品国产三级国产普通话三级| 亚洲伦理在线精品| 精品影视av免费| 91尤物视频在线观看| 日韩一区二区在线观看视频播放| 精品久久国产97色综合| 亚洲天堂精品在线观看| 久久成人精品无人区| 成人高清伦理免费影院在线观看| 欧洲一区在线电影| 国产亲近乱来精品视频| 午夜不卡av免费| 岛国精品一区二区| 日韩欧美国产午夜精品| 亚洲精品乱码久久久久久黑人| 麻豆国产精品官网| 欧美日韩三级视频| 亚洲国产成人在线| 久久精品久久综合| 欧美这里有精品| 国产精品国产精品国产专区不片| 美女爽到高潮91| 欧美私人免费视频| 亚洲欧美日韩在线播放| 成人午夜电影小说| 精品美女在线播放| 蜜臀精品一区二区三区在线观看| 日本精品裸体写真集在线观看| 26uuu国产电影一区二区| 日日摸夜夜添夜夜添亚洲女人| 91在线看国产| 国产精品看片你懂得| 国产一级精品在线| 欧美成人乱码一区二区三区| 亚洲成人在线观看视频| 欧美午夜一区二区三区免费大片| 国产精品拍天天在线| 国产91清纯白嫩初高中在线观看| 欧美不卡一二三| 日本欧美肥老太交大片| 日韩一区二区视频在线观看| 亚洲福利视频导航| 欧美在线|欧美| 午夜久久久久久久久久一区二区| 一本色道亚洲精品aⅴ| 国产精品久久久久婷婷二区次| 国内欧美视频一区二区| 久久久美女毛片| 国产乱码精品一品二品| 久久久不卡网国产精品二区 | 国产在线视频一区二区三区| 国产黄色91视频| 亚洲精品在线网站| 国产一区久久久| 久久伊人中文字幕| 成人综合婷婷国产精品久久蜜臀| 久久久噜噜噜久久人人看| 久久精品二区亚洲w码| 日韩免费视频线观看| 国产在线乱码一区二区三区| www成人在线观看| 国产成人综合自拍| 国产精品毛片无遮挡高清| 日韩成人午夜电影| 日韩久久免费av| 国产精品1区2区3区| 日韩毛片在线免费观看| 欧美三级日韩在线| 久久国产人妖系列| 亚洲欧美自拍偷拍| 欧美日韩国产不卡| 国产综合久久久久久久久久久久| 久久久.com| 91久久奴性调教| 美女免费视频一区| 国产精品久久久久影院老司| 欧美视频在线一区| 国产在线播放一区| 亚洲欧美一区二区不卡| 欧美麻豆精品久久久久久| 国产一区二区三区四区五区美女 | 国产真实乱对白精彩久久| 国产精品电影院| 欧美一区二区视频在线观看| 成人黄色片在线观看| 丝袜美腿高跟呻吟高潮一区| 国产欧美日韩麻豆91| 欧美色视频一区| 成a人片国产精品| 日本中文字幕一区| 亚洲欧美一区二区久久| 欧美tickling网站挠脚心| 在线欧美一区二区| 粉嫩av一区二区三区在线播放 | 国产999精品久久久久久绿帽| 一区二区三区四区中文字幕| 国产亚洲午夜高清国产拍精品| 欧美三级视频在线观看| 91在线精品一区二区三区| 久久疯狂做爰流白浆xx| 香港成人在线视频| 亚洲激情在线激情| 中文字幕一区不卡| 欧美国产丝袜视频| www日韩大片| 欧美一级午夜免费电影| 欧美亚洲国产一区二区三区| 成人18精品视频| 国产二区国产一区在线观看| 麻豆91免费看| 美女一区二区三区| 日韩精品成人一区二区在线| 亚洲国产精品久久久男人的天堂| 综合精品久久久| 成人免费在线视频观看| 中文字幕在线不卡一区| 国产精品高潮久久久久无| 国产欧美日韩精品一区| 日本一区二区三区国色天香| 久久久777精品电影网影网| 久久蜜桃av一区二区天堂| 精品国产成人在线影院| 久久这里只有精品视频网| 久久综合久久鬼色中文字| 久久精品一区二区三区av| 久久亚洲一级片| 中文字幕精品三区| 1024亚洲合集| 亚洲午夜视频在线| 免费精品视频最新在线| 国产综合成人久久大片91| 国产精品一区二区免费不卡| 国产a级毛片一区| 91在线播放网址| 欧美三级午夜理伦三级中视频| 欧美日韩在线直播| 日韩一区二区电影网| 26uuu国产一区二区三区| 国产精品水嫩水嫩| 亚洲曰韩产成在线| 日日夜夜一区二区| 国产成人在线色| 99久久99久久精品免费观看| 在线区一区二视频| 3d动漫精品啪啪| 国产拍欧美日韩视频二区| 亚洲精品国产a久久久久久 | 国产亚洲欧美日韩在线一区| 国产精品午夜免费| 亚洲一区二区三区四区的| 亚洲成av人在线观看| 九九在线精品视频| 一本一道久久a久久精品| 91麻豆精品国产91久久久资源速度| 久久伊人中文字幕| 亚洲男人电影天堂| 激情五月婷婷综合| 一本一道久久a久久精品综合蜜臀 一本一道综合狠狠老 | 亚洲制服欧美中文字幕中文字幕| 三级在线观看一区二区| 成人自拍视频在线观看| 欧美日本韩国一区| 国产精品人成在线观看免费| 日韩电影在线观看一区| 99精品视频中文字幕| 日韩一二在线观看| 夜夜亚洲天天久久| 国产不卡免费视频|