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

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

?? sm5.c

?? S3C2440+SM501在wince環境下的應用!
?? C
?? 第 1 頁 / 共 3 頁
字號:
#include "video_fb.h"#include "sm501.h"#include <string.h>#include "global.h"#include "comdef.h"int sm501mode = 7;		// 10:1024*768,75Hz; 7:800*600, 72Hzint sm501bpp = 16;int	sm501out = 1;GraphicDevice 			sm501;struct SM501STRU		sm501info;static char 			*sm501Reg;static char 			*sm501Mem;volatile unsigned int CONFIG_SM501_MEM_BASE = 0x20000000;static int error;#define FBTYPE_8BIT_INDEX        0#define FBTYPE_8BIT_332RGB       5#define FBTYPE_15BIT_555RGB      1#define FBTYPE_16BIT_565RGB      2#define FBTYPE_32BIT_X888RGB     3#define FBTYPE_24BIT_888RGB      4#define VSYNCTIMEOUT                       10000#define SM501_DEBUG 0#define RGB(r, g, b) ((unsigned long)(((r) << 16) | ((g) << 8) | (b)))#define CONFIG_SM501_REG_BASE     0x23e00000u_long regRead32(u_long nOffset);void regWrite32(u_long nOffset, u_long nData);// Format of mode table record.typedef struct _mode_table_t{	// Horizontal timing.	int			horizontal_total;	int			horizontal_display_end;	int			horizontal_sync_start;	int			horizontal_sync_width;	polarity_t	horizontal_sync_polarity;	// Vertical timing.	int 		vertical_total;	int 		vertical_display_end;	int 		vertical_sync_start;	int 		vertical_sync_height;	polarity_t	vertical_sync_polarity;	// Refresh timing.	long		pixel_clock;	long		horizontal_frequency;	long		vertical_frequency;} mode_table_t, *pmode_table_t;typedef struct _reg_table_t{	unsigned long	clock;	unsigned long	control;	unsigned long	fb_width;	unsigned long	horizontal_total;	unsigned long	horizontal_sync;	unsigned long	vertical_total;	unsigned long	vertical_sync;	unsigned long	width;	unsigned long	height;	display_t		display;} reg_table_t, *preg_table_t;typedef struct clock_select_t{	long	mclk;	int		divider;	int		shift;} clock_select_t, *pclock_select_t;// Perform a rounded division.long roundDiv(long num, long denom){	/* n / d + 1 / 2 = (2n + d) / 2d */	return (2 * num + denom) / (2 * denom);}// Finds clock closest to the requested.long findClock(long requested_clock, clock_select_t *clock, display_t display){	long	mclk;	int		divider, shift;	long	best_diff = 999999999;	// Try 288MHz and 336MHz clocks.	for (mclk = 288000000; mclk <= 336000000; mclk += 48000000)	{		// For CRT, try dividers 1 and 3, for panel, try divider 5 as well.		for (divider = 1; divider <= (display == PANEL ? 5 : 3);			 divider += 2)		{			// Try all 8 shift values.			for (shift = 0; shift < 8; shift++)			{				// Calculate difference with requested clock.				long diff = roundDiv(mclk, divider << shift) - requested_clock;				if (diff < 0)				{					diff = -diff;				}				// If the difference is less than the current, use it.				if (diff < best_diff)				{					// Store best difference.					best_diff = diff;					// Store clock values.					clock->mclk = mclk;					clock->divider = divider;					clock->shift = shift;				}			}		}	}	// Return best clock.	return clock->mclk / (clock->divider << clock->shift);}/* Mode table. */mode_table_t mode_table[] ={	/*----------------------------------------------------------------------------------------	 * H.	H.    H.     H.   H.        V.   V.    V.    V.   V.        Pixel     H.     V.	 * tot.	disp. sync   sync sync      tot. disp. sync  sync sinc      clock     freq.  freq.	 *      end   start  wdth polarity       end   start hght polarity	 *---------------------------------------------------------------------------------------*/	/* 640 x 480 */	{  800, 640,  656,   96,  NEGATIVE, 525, 480,  490,  2,   NEGATIVE, 25175000, 31469, 60 },	{  832, 640,  664,   40,  NEGATIVE, 520, 480,  489,  3,   NEGATIVE, 31500000, 37861, 72 },	{  840, 640,  656,   64,  NEGATIVE, 500, 480,  481,  3,   NEGATIVE, 31500000, 37500, 75 },	{  832, 640,  696,   56,  NEGATIVE, 509, 480,  481,  3,   NEGATIVE, 36000000, 43269, 85 },	/* 800 x 600 */	{ 1024, 800,  824,   72,  POSITIVE, 625, 600,  601,  2,   POSITIVE, 36000000, 35156, 56 },	{ 1056, 800,  840,  128,  POSITIVE, 628, 600,  601,  4,   POSITIVE, 40000000, 37879, 60 },	{ 1040, 800,  856,  120,  POSITIVE, 666, 600,  637,  6,   POSITIVE, 50000000, 48077, 72 },	{ 1056, 800,  816,   80,  POSITIVE, 625, 600,  601,  3,   POSITIVE, 49500000, 46875, 75 },	{ 1048, 800,  832,   64,  POSITIVE, 631, 600,  601,  3,   POSITIVE, 56250000, 53674, 85 },	/* 1024 x 768*/	{ 1376, 1024, 1072, 96,  NEGATIVE, 808, 768,  769,  3,   NEGATIVE, 65000000, 47238, 60 },	{ 1328, 1024, 1048, 136,  NEGATIVE, 806, 768,  771,  6,   NEGATIVE, 75000000, 56476, 70 },	{ 1312, 1024, 1040,  96,  POSITIVE, 800, 768,  769,  3,   POSITIVE, 78750000, 60023, 75 },	{ 1376, 1024, 1072,  96,  POSITIVE, 808, 768,  769,  3,   POSITIVE, 94500000, 68677, 85 },	/* End of table. */	{ 0, 0, 0, 0, NEGATIVE, 0, 0, 0, 0, NEGATIVE, 0, 0, 0 },};// Set DPMS state.void setDPMS(DPMS_t state){	unsigned long value;	value = regRead32(SYSTEM_CTRL);	switch (state)	{		case DPMS_ON:			value = FIELD_SET(value, SYSTEM_CTRL, DPMS, VPHP);			break;		case DPMS_STANDBY:			value = FIELD_SET(value, SYSTEM_CTRL, DPMS, VPHN);			break;		case DPMS_SUSPEND:			value = FIELD_SET(value, SYSTEM_CTRL, DPMS, VNHP);			break;		case DPMS_OFF:			value = FIELD_SET(value, SYSTEM_CTRL, DPMS, VNHN);			break;	}	regWrite32(SYSTEM_CTRL, value);}void panelWaitVSync(int vsync_count){	u_long status;	u_long timeout;	while (vsync_count-- > 0)	{		/* Wait for end of vsync */		timeout = 0;		do		{			status = FIELD_GET(regRead32(CMD_INTPR_STATUS),							   CMD_INTPR_STATUS,							   PANEL_SYNC);			if (++timeout == VSYNCTIMEOUT)				break;		}		while (status == CMD_INTPR_STATUS_PANEL_SYNC_ACTIVE);		/* Wait for start of vsync */		timeout = 0;		do		{			status = FIELD_GET(regRead32(CMD_INTPR_STATUS),							   CMD_INTPR_STATUS, 							   PANEL_SYNC);			if (++timeout == VSYNCTIMEOUT)				break;		}		while (status == CMD_INTPR_STATUS_PANEL_SYNC_INACTIVE);	}}void panelPowerSequence(int on_off, int vsync_delay){	unsigned long panelControl = regRead32(PANEL_DISPLAY_CTRL);	if (on_off == 1)	{		// Turn on FPVDDEN.		panelControl = FIELD_SET(panelControl,								 PANEL_DISPLAY_CTRL, FPVDDEN, HIGH);		regWrite32(PANEL_DISPLAY_CTRL, panelControl);		panelWaitVSync(vsync_delay);		// Turn on FPDATA.		panelControl = FIELD_SET(panelControl, 								 PANEL_DISPLAY_CTRL, DATA, ENABLE);		regWrite32(PANEL_DISPLAY_CTRL, panelControl);		panelWaitVSync(vsync_delay);		// Turn on FPVBIAS.		panelControl = FIELD_SET(panelControl, 								 PANEL_DISPLAY_CTRL, VBIASEN, HIGH);		regWrite32(PANEL_DISPLAY_CTRL, panelControl);		panelWaitVSync(vsync_delay);		// Turn on FPEN.		panelControl = FIELD_SET(panelControl, 								 PANEL_DISPLAY_CTRL, FPEN, HIGH);		regWrite32(PANEL_DISPLAY_CTRL, panelControl);	}	else	{		// Turn off FPEN.		panelControl = FIELD_SET(panelControl,								 PANEL_DISPLAY_CTRL, FPEN, LOW);		regWrite32(PANEL_DISPLAY_CTRL, panelControl);		panelWaitVSync(vsync_delay);		// Turn off FPVBIASEN.		panelControl = FIELD_SET(panelControl, 								 PANEL_DISPLAY_CTRL, VBIASEN, LOW);		regWrite32(PANEL_DISPLAY_CTRL, panelControl);		panelWaitVSync(vsync_delay);		// Turn off FPDATA.		panelControl = FIELD_SET(panelControl, 								 PANEL_DISPLAY_CTRL, DATA, DISABLE);		regWrite32(PANEL_DISPLAY_CTRL, panelControl);		panelWaitVSync(vsync_delay);		// Turn off FPVDDEN.		panelControl = FIELD_SET(panelControl, 								 PANEL_DISPLAY_CTRL, FPVDDEN, LOW);		regWrite32(PANEL_DISPLAY_CTRL, panelControl);	}}// Program new power mode.void setPower(unsigned long nGates, unsigned long Clock){	unsigned long gate_reg, clock_reg;	unsigned long control_value;	// Get current power mode.	control_value = FIELD_GET(regRead32(POWER_MODE_CTRL),							  POWER_MODE_CTRL,							  MODE);	switch (control_value)	{	case POWER_MODE_CTRL_MODE_MODE0:		// Switch from mode 0 to mode 1.		gate_reg = POWER_MODE1_GATE;		clock_reg = POWER_MODE1_CLOCK;		control_value = FIELD_SET(control_value,					  POWER_MODE_CTRL, MODE, MODE1);		break;	case POWER_MODE_CTRL_MODE_MODE1:	case POWER_MODE_CTRL_MODE_SLEEP:		// Switch from mode 1 or sleep to mode 0.		gate_reg = POWER_MODE0_GATE;		clock_reg = POWER_MODE0_CLOCK;		control_value = FIELD_SET(control_value, POWER_MODE_CTRL, MODE, MODE0);		break;	default:		// Invalid mode		return;	}	// Program new power mode.	regWrite32(gate_reg, nGates);	regWrite32(clock_reg, Clock);	regWrite32(POWER_MODE_CTRL, control_value);	// When returning from sleep, wait until finished.	while (FIELD_GET(regRead32(POWER_MODE_CTRL),					 POWER_MODE_CTRL,					 SLEEP_STATUS) == POWER_MODE_CTRL_SLEEP_STATUS_ACTIVE) ;}u_long regRead32(u_long nOffset){	#if SM501_DEBUG 		u_long ret = *(volatile unsigned long *)(sm501Reg+nOffset);		Uart_Printf("%s: %#lx --> %#lx\n", __FUNCTION__, sm501Reg+nOffset, ret);		return ret;	#else		return *(volatile unsigned long *)(sm501Reg+nOffset);	#endif}void regWrite32(u_long nOffset, u_long nData){	u_long readback;	#if SM501_DEBUG 	  	if (nOffset < 0x00080800)			Uart_Printf("%s: %#lx <-- %#lx\n", __FUNCTION__, nOffset, nData);		*(volatile unsigned long *)(sm501Reg+nOffset) = nData;		readback = *(volatile unsigned long *)(sm501Reg+nOffset);		if (readback != nData)		{			printf("Warning: read value %#lx != %#lx write value, trying again!\n", readback, nData);			error = 1;		}	#else		for(;;)		{			*(volatile unsigned long *)(sm501Reg+nOffset) = nData;			readback = *(volatile unsigned long *)(sm501Reg+nOffset);			if (readback == nData)				break;			else				Uart_Printf("Warning: read value %#lx != %#lx write value, trying again!\n", readback, nData);		}	#endif}static int sm501_detect(void){	int sm501_device_id;	int result = 0;	sm501_device_id = FIELD_GET(regRead32(DEVICE_ID), DEVICE_ID, DEVICE_ID);			if (sm501_device_id != 0x0501) {		Uart_Printf("Silicon Motion 501 not detected!ID=%x\n",sm501_device_id);		result = -1;		return result;	}	else		Uart_Printf("Silicom Motion SM501 detected\n");	return result;}// Program the mode with the registers specified.void programMode(reg_table_t *register_table){	unsigned long value, gate, clock;	unsigned long palette_ram;	unsigned long fb_size, offset;	// Get current power configuration.	gate = regRead32(CURRENT_POWER_GATE);	clock = regRead32(CURRENT_POWER_CLOCK);	// Program panel.	if (register_table->display == PANEL)	{		// Program clock, enable display controller.		gate = FIELD_SET(gate, CURRENT_POWER_GATE, DISPLAY, ENABLE);		clock &= FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_SELECT)			  &  FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_DIVIDER)			  &  FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_SHIFT);		setPower(gate, clock | register_table->clock);		// Calculate frame buffer address.		value = 0;		fb_size = register_table->fb_width * register_table->height;		if (FIELD_GET(regRead32(CRT_DISPLAY_CTRL),					  CRT_DISPLAY_CTRL,					  PLANE) == CRT_DISPLAY_CTRL_PLANE_ENABLE)		{			value = FIELD_GET(regRead32(CRT_FB_ADDRESS),							  CRT_FB_ADDRESS, 							  ADDRESS);			if (fb_size < value)			{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩午夜激情电影| 欧美乱妇23p| 欧美一级片在线观看| 国产精品久久久久久久久晋中 | 成人h动漫精品一区二| 欧美日韩极品在线观看一区| 中文字幕乱码久久午夜不卡| 免费在线观看一区| 成人av片在线观看| 欧美电视剧免费全集观看| 一区二区三区中文字幕| 成人av在线电影| 欧美日韩黄色一区二区| 亚洲人成7777| 国产v综合v亚洲欧| 欧美精品一区二区精品网| 亚洲成人免费视| 色菇凉天天综合网| 亚洲欧美在线观看| 成人av免费在线播放| 精品国产免费人成电影在线观看四季| 亚洲午夜日本在线观看| 一本大道久久a久久综合| 国产色综合久久| 国产中文字幕精品| 欧美电视剧在线看免费| 秋霞午夜鲁丝一区二区老狼| 欧美日韩三级在线| 亚洲福利电影网| 欧美午夜精品久久久| 亚洲一区二区视频| 精品国产91洋老外米糕| 日韩专区欧美专区| 欧美一区二区三区性视频| 午夜成人在线视频| 欧美日韩成人综合| 水蜜桃久久夜色精品一区的特点| 在线免费不卡电影| 一区二区三区欧美视频| 在线影院国内精品| 亚洲一区精品在线| 欧美日本免费一区二区三区| 亚洲成人777| 6080yy午夜一二三区久久| 日韩国产在线观看一区| 337p亚洲精品色噜噜| 热久久久久久久| 精品久久久久香蕉网| 久久精品99国产精品| 欧美mv日韩mv| 国产a精品视频| 亚洲天堂2016| 欧美色手机在线观看| 偷拍一区二区三区四区| 欧美一级淫片007| 精品一区二区日韩| 久久久激情视频| k8久久久一区二区三区| 亚洲欧美日韩国产综合在线| 欧美性受xxxx黑人xyx性爽| 日韩中文字幕区一区有砖一区 | 成人精品鲁一区一区二区| 中文字幕一区在线| 欧美专区亚洲专区| 日韩电影一二三区| 欧美精品一区二区久久婷婷| 处破女av一区二区| 亚洲精品videosex极品| 制服视频三区第一页精品| 精品一区二区免费视频| 国产欧美精品一区aⅴ影院| 91美女片黄在线观看91美女| 亚洲成av人片在线| 26uuu欧美| 91尤物视频在线观看| 亚洲va国产天堂va久久en| 精品福利二区三区| 91亚洲精品久久久蜜桃网站| 五月天一区二区| 久久精品亚洲精品国产欧美kt∨| 91年精品国产| 秋霞电影网一区二区| 国产欧美日韩精品a在线观看| 色综合久久综合网欧美综合网| 视频一区视频二区中文字幕| 久久蜜桃av一区精品变态类天堂| 91网站在线播放| 日韩 欧美一区二区三区| 国产色婷婷亚洲99精品小说| 欧洲视频一区二区| 国产麻豆成人精品| 亚洲国产日产av| 日本一区二区三区国色天香| 欧美午夜理伦三级在线观看| 国产乱码精品1区2区3区| 一级做a爱片久久| 精品99一区二区三区| 在线免费观看日本欧美| 国产伦精品一区二区三区视频青涩| 亚洲欧美日韩国产成人精品影院| 日韩精品最新网址| 91成人在线观看喷潮| 国产在线精品一区二区| 亚洲精品午夜久久久| 久久久亚洲午夜电影| 欧美日韩亚洲另类| 99综合电影在线视频| 久久99精品一区二区三区| 一区二区在线观看视频在线观看| 欧美tk丨vk视频| 欧美视频一区二| 99久久精品免费看| 激情久久五月天| 天堂av在线一区| 亚洲美女在线一区| 欧美高清在线视频| 欧美电影免费观看高清完整版在线 | 精彩视频一区二区三区| 一区二区三区日韩欧美| 日本一区二区成人在线| 精品国产123| 7777精品久久久大香线蕉| 91免费国产在线| 成人深夜视频在线观看| 精彩视频一区二区三区| 日韩黄色片在线观看| 亚洲一区在线观看网站| 中文字幕中文在线不卡住| 2023国产一二三区日本精品2022| 欧美酷刑日本凌虐凌虐| 在线看国产日韩| 色综合久久99| 99久久婷婷国产综合精品| 国产一区二区久久| 美女视频黄a大片欧美| 五月天激情小说综合| 亚洲与欧洲av电影| 综合久久久久久| 国产精品免费视频观看| 国产欧美日产一区| 久久婷婷国产综合精品青草 | 99久久精品免费| 高清国产一区二区| 国模娜娜一区二区三区| 精品在线亚洲视频| 久久激情五月婷婷| 日日夜夜精品视频免费| 亚洲成a人片综合在线| 一区二区三区四区乱视频| 亚洲欧美日韩综合aⅴ视频| 中文字幕日本不卡| 日韩美女啊v在线免费观看| 亚洲欧洲三级电影| 国产精品二三区| 亚洲人成电影网站色mp4| 日韩毛片在线免费观看| 1区2区3区精品视频| 亚洲欧洲精品一区二区三区| 国产精品传媒入口麻豆| 国产精品免费av| 亚洲欧美日韩精品久久久久| 亚洲天堂成人网| 亚洲欧美一区二区三区国产精品| 亚洲婷婷国产精品电影人久久| 亚洲欧美日韩国产综合在线| 亚洲人成亚洲人成在线观看图片| 亚洲欧美一区二区三区孕妇| 一区二区在线观看免费| 亚洲资源中文字幕| 午夜久久久久久久久久一区二区| 亚洲不卡av一区二区三区| 日韩成人精品在线观看| 麻豆成人在线观看| 国产高清久久久| 91日韩一区二区三区| 欧美视频在线一区二区三区| 制服.丝袜.亚洲.另类.中文| 欧美变态口味重另类| 国产亚洲欧美激情| 中文字幕欧美激情| 亚洲欧美日韩电影| 午夜精品福利视频网站| 美女在线观看视频一区二区| 国产一区二区影院| 91视频你懂的| 欧美日产国产精品| 精品人在线二区三区| 国产精品久久久久久久久免费相片 | 91精品国产免费| 久久久精品综合| 亚洲女厕所小便bbb| 日韩高清一区二区| 国产mv日韩mv欧美| 欧美性欧美巨大黑白大战| 欧美一区二区视频网站| 国产欧美日韩精品a在线观看| 一区二区三区欧美在线观看| 另类小说欧美激情| 成人免费毛片app| 欧美日精品一区视频|