修改eboot使ok6410a(128m内存+256mnand)支持hdmi高清显示(代码片段)

Mr-Bruce Mr-Bruce     2022-10-22     653

关键词:

        之前一直使用OK6410A(256M内存+2GNand)(WinCE6.0系统),买了块HDMI高清显示,跟飞凌技术要了资料,按照所给的资料说明,对Eboot做了修改后,就可以正常使用HDMI高清显示了。最近为了节省几十块RMB,老板决定更换板子使用128M内存+256MNand的板子,拿到手准备把高清部分加进去,可是发现Eboot不太一样呀,编译出错。问了飞凌技术,人家告诉我他们没有准备在这个板子上使用HDMI的资料说明。那怎么办呢,只能按照之前的资料来自己尝试解决了。好在现在解决了,下面来看看是怎么做的。

      首先,应该修改main.c下的函数使其支持HDMI的选择,因为默认的没有这个选项。主要是两个函数:BOOL MainMenu(PBOOT_CFG pBootCfg)和void InitializeDisplay(void)函数。

在MainMenu函数中的下面一段switch-case中添加LCD_VGA1024_RGB选项,

switch(pBootCfg->ConfigFlags&LCD_TYPE_MASK)

	case LCD_HUA350_RGB:
        	EdbgOutputDebugString ( "(320x240)\\r\\n");
		break;
	case LCD_HUA430_RGB:
        	EdbgOutputDebugString ( "(480x272)\\r\\n");
		break;
	case LCD_HUA560_RGB:
        	EdbgOutputDebugString ( "(640x480)\\r\\n");
		break;
	case LCD_QUN700_RGB:
        	EdbgOutputDebugString ( "(800x480)\\r\\n");
		break;
	case LCD_VGA800_RGB:
        	EdbgOutputDebugString ( "(800x600)\\r\\n");
		break;

	case LCD_VGA1024_RGB:
        	EdbgOutputDebugString ( "(1024x768)\\r\\n");
		break;

        default:
                EdbgOutputDebugString ( "(unknown)\\r\\n");
                break;

继续查看这个函数,当选择'S'即选择设置LCD时,调用了SetLcd(pBootCfg);,在 SetLcd(PBOOT_CFG pBootCfg)函数下,修改如下

static void SetLcd(PBOOT_CFG pBootCfg)

    USHORT InChar = 0;
	
    EdbgOutputDebugString("\\r\\n");
    EdbgOutputDebugString("0)3.5'LCD	320X240 \\r\\n");
    EdbgOutputDebugString("1)4.3'LCD	480X272 \\r\\n");
    EdbgOutputDebugString("2)5.6'LCD	640X480 \\r\\n");
    EdbgOutputDebugString("3)7.0'LCD	800X480 \\r\\n");
    EdbgOutputDebugString("4)VGA 		800X600 \\r\\n");
    EdbgOutputDebugString("5)HDMI		1024X768 \\r\\n");
	
    EdbgOutputDebugString("\\r\\nSelect Lcd Resolution [0-5]: ");
    while(!((InChar == 0x0d) || (InChar == 0x0a)))
    
        InChar = OEMReadDebugByte();
        if (InChar != OEM_DEBUG_COM_ERROR && InChar != OEM_DEBUG_READ_NODATA)
        
            // If it's a number or a period, add it to the string.
            //
            if ((InChar >= '0' && InChar <= '5'))
            
            	OEMWriteDebugByte((BYTE)InChar);
            	pBootCfg->ConfigFlags&=~LCD_TYPE_MASK;
            	switch(InChar)
					case '0':
						pBootCfg->ConfigFlags|=LCD_HUA350_RGB;
						break;
					case '1':
						pBootCfg->ConfigFlags|=LCD_HUA430_RGB;
						break;
					case '2':
						pBootCfg->ConfigFlags|=LCD_HUA560_RGB;
						break;
					case '3':
						pBootCfg->ConfigFlags|=LCD_QUN700_RGB;
						break;
					case '4':
						pBootCfg->ConfigFlags|=LCD_VGA800_RGB;
						break;
					case '5':
						pBootCfg->ConfigFlags|=LCD_VGA1024_RGB;
						break;
					default:
						break;
            	
				break;
            
        
    


下面来修改 InitializeDisplay()函数,将其中选择LCD模式的switch-case修改如下:

switch(g_pBootCfg->ConfigFlags&LCD_TYPE_MASK)
		case LCD_HUA350_RGB:
			LcdType = LDI_HUA350_RGB;
			g_dwLcdWidth = 320;
			g_dwLcdHeight = 240;
			g_dwLcdBpp = 16;
			break;
		case LCD_HUA430_RGB:
			LcdType = LDI_HUA430_RGB;
			g_dwLcdWidth = 480;
			g_dwLcdHeight = 272;
			g_dwLcdBpp = 16;
			break;
		case LCD_HUA560_RGB:
			LcdType = LDI_HUA560_RGB;
			g_dwLcdWidth = 640;
			g_dwLcdHeight = 480;
			g_dwLcdBpp = 16;
			break;
		case LCD_QUN700_RGB:
			LcdType = LDI_QUN700_RGB;
			g_dwLcdWidth = 800;
			g_dwLcdHeight = 480;
			g_dwLcdBpp = 16;
			break;
		case LCD_VGA800_RGB:
			LcdType = LDI_VGA800_RGB;
			g_dwLcdWidth = 800;
			g_dwLcdHeight = 600;
			g_dwLcdBpp = 16;
			break;
		case LCD_VGA1024_RGB:
			LcdType = LDI_VGA1024_RGB;
			g_dwLcdWidth = 1024;
			g_dwLcdHeight = 768;
			g_dwLcdBpp = 16;
			break;
		default:
			LcdType = LDI_HUA350_RGB;
			g_dwLcdWidth = 320;
			g_dwLcdHeight = 240;
			g_dwLcdBpp = 16;
			break;
	

        到这里就基本上修改完了,已经可以支持选择HDMI了,但是仅仅是支持选择,并不能真正实现HDMI高清显示,考虑到在之前所给的资料中有个7033.lib还没有使用,我比对了资料中的main.c 和 当前EBOOT中的 main.c,发现其调用了一个来自7033.lib的函数init_7033。于是仿照资料中的main.c做如下修改,主要是修改 InitializeVGA函数:

extern void init_7033(void);
//add by phantom
static void InitializeVGA(LDI_LCD_MODULE_TYPE LcdType)

	
    unsigned int  i;
	//EdbgOutputDebugString("[Eboot] ++InitializeVGA LcdType %d\\r\\n",LcdType);
    //IIC_Write   //CH7026 write address = 0xec
    if(LcdType==LDI_HUA560_RGB)	
    
    	EdbgOutputDebugString("[Eboot] +++InitializeVGA 640X480()\\r\\n");
    	IIC_Open(2000);
		for (i = 0; i < CH7026_REG_NUM_VGA_640; i++) 
			
			if(!IIC_Write(0xEC, CH7026_REGS_VGA_640[i].subaddr, CH7026_REGS_VGA_640[i].value))
			
				EdbgOutputDebugString("[Eboot] ---InitializeVGA ERROR!!!\\r\\n");
				IIC_Close();
				return;
			
		
		IIC_Write(0xEC,0x4,0x0);
		IIC_Close();
    	EdbgOutputDebugString("[Eboot] ---InitializeVGA 640X480()\\r\\n");
    
	else if(LcdType==LDI_VGA800_RGB)
	
    	EdbgOutputDebugString("[Eboot] +++InitializeVGA 800X600()\\r\\n");
		IIC_Open(2000);
		for (i = 0; i < CH7026_REG_NUM_VGA_800; i++) 
			if(!IIC_Write(0xEC, CH7026_REGS_VGA_800[i].subaddr, CH7026_REGS_VGA_800[i].value))
			
				EdbgOutputDebugString("[Eboot] ---InitializeVGA ERROR!!!\\r\\n");
				IIC_Close();
				return;			
			
		
		IIC_Write(0xEC,0x4,0x0);
		IIC_Close();
    	EdbgOutputDebugString("[Eboot] ---InitializeVGA 800X600()\\r\\n");
	
	else if(LcdType==LDI_VGA1024_RGB)
	
		/* add by alexlee*/
		EdbgOutputDebugString("[Eboot] +++InitializeHDMI 1024X768()\\r\\n");
		init_7033();
		EdbgOutputDebugString("[Eboot] ---InitializeHDMI 1024X768()\\r\\n");
	
	
         然后还有将7033.lib添加到Eboot的链接选项中,这个在资料中有说明,照做即可。完成这些工作后,还没有最终完成,因为此时在编译Eboot时会出现编译错误,这个主要是因为在库7033.lib中调用了一些函数,而这些函数还 没有。比对了资料所给的usb.h、usb.c、ch7026.h,对当前Eboot下的文件进行了修改:

usb.h中添加:

BOOL IIC_Read(u8 cSlaveAddr,u8 cAddr,u8 *cData);

usb.c中添加:

void IIC_SetRead(  u8 cSlaveAddr,  u8 *pData, u32 uDataLen)

	u32 uTmp2;
	u32 uTmp3;
	
	uTmp2= Input32(rIICSTAT0);
	while(uTmp2&(1<<5))		//	Wait until IIC bus is free.
		uTmp2 = Input32(rIICSTAT0);			

	g_PcIIC_BUFFER	=	pData;
	g_uIIC_PT		=	0;
	g_uIIC_DATALEN	=	uDataLen;

	uTmp3 = Input32(rIICCON0);
	uTmp3 |= (1<<7);
	Outp32(rIICCON0,uTmp3);				//	Ack generation Enable
	Outp32(rIICDS0,cSlaveAddr);
	Outp32(rIICSTAT0,0xB0);				//	Master Rx Start.

BOOL IIC_Read(u8 cSlaveAddr,u8 cAddr,u8 *cData)

	IIC_SetWrite( cSlaveAddr, &cAddr, 1);			// following EEPROM random address access procedure
	IIC_SetRead( cSlaveAddr, cData, 1);
	IIC_Wait();								//	Waiting for read complete.


将ch7026.h直接拷贝过来,覆盖原有的ch7026.h文件,因为资料中的这个文件中添加了一个CH7033_RegTable[][2]。

         至此,就完成了修改工作了,此时重新编译,然后生成映像。但是选择了HDMI高清后,系统启动到中间就停下来了,DNW上打印如下:

[Eboot] ++InitializeDisplay()

就是说在这个地方无法继续往下执行了。我查找了这个语句,其是在InitializeDisplay()函数中打印的,进一步查找发现是下面的循环导致启动中断的:

        for (i=0; i<g_dwLcdWidth*g_dwLcdHeight; i++)
            *pFB++ = 0x0000;//0x001F;        // Blue
这个循环是在初始LOGO中的,本身这个循环没有什么问题,我怀疑是否是由于越界导致的呢,看了下pFB指针,

  unsigned short *pFB;
        pFB = (unsigned short *)EBOOT_FRAMEBUFFER_UA_START;
进一步搜索EBOOT_FRAMEBUFFER_UA_START,在image_cfg.h中定义的,如下:

// Eboot Display Frame Buffer
// 2MB
#define EBOOT_FRAMEBUFFER_OFFSET        (0x07F00000) 
#define EBOOT_FRAMEBUFFER_PA_START      (DRAM_BASE_PA_START+EBOOT_FRAMEBUFFER_OFFSET)
#define EBOOT_FRAMEBUFFER_UA_START      (DRAM_BASE_UA_START+EBOOT_FRAMEBUFFER_OFFSET)
#define EBOOT_FRAMEBUFFER_SIZE          (0x00100000)
将EBOOT_FRAMEBUFFER_OFFSET的值改为0x07E00000。

      再次重新编译,生成映像。此时选择HDMI高清就可以正常显示了。所有工作也完成了,目前尚未发现有什么异常,不过有待进一步观察。。。。





修改飞凌ok6410的默认lcd显示设备(代码片段)

...NW来配置为高清显示驱动,比较麻烦,所以我打算修改一下eboot的程序,使其烧入系统后的默认 查看详情

装箱问题

...后更新:2017年8月15日23:25  时间限制:1000ms  内存限制:128M描述有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数)。要求n个物品中,任取若干个装入箱内,使... 查看详情

rocketmq内存分布

参考技术A最大内存:JVM堆(1G)+元数据空间(128M)+Netty堆外(2G)+RocketMQ堆外(2G)=5.125G新生代内存(EC):544M老年代内存(OC):480M最大元数据空间(MCMX):144M、最大压缩类空间(CCSMX):120M当前元数据空间(CCSC):25M、... 查看详情

应用pmdk修改wal操作使之适配持久化内存

应用PMDK修改WAL操作使之适配持久化内存这几个补丁能够通过使用PMDK对存储在持久化内存PMEM上的WAL日志进行读写。PMEM是下一代存储介质,具有一系列特性:快速、字节寻址、非易失。Pgbench是PG的通用benchmark,使用benchmark进行测... 查看详情

zabbix修改templateoslinux模版使已使用内存(usedmemory)更准确

可用内存:Availablememory=free+buffers+cached,即2021=235+394+1392已使用内存:Usedmemory=used-buffers-cached,即30217=32003-394-1392而在用zabbix自身的TemplateOSLinux模版监控服务器时,发现Usedmemory都偏高。这是因为zabbix通过vm.memory.size[used 查看详情

eclipse的安卓虚拟机如何把手机内存调大一点?

...256m-Dosgi.bundlefile.limit=100参考技术A打开AVDManager,选中你要修改的模拟器,点击旁边的Edit,对话框中有一栏 查看详情

intellijidea修改内存大小并展示

...n\dea.vmoptions选择对应的版本,或者双击shift,搜索vmoption修改-Xms和-Xmx参数,如下:-Xms:最小内存-Xmx:最大内存设置完成后,重启idea,然后idea右下角看到的最大内存便是新设置的-Xmx内存大小。这里的内存设置是指单个窗口的内存... 查看详情

怎么调整eclipse的内存大小

...DefaultVMArguments:框中输入-Xms128m-Xmx512m,这样设置Java拟虚机内存使用最小是128M,最大是512M,再单击“OK”关闭EditJRE对话框,再单击“OK”关闭Preferences对话框,Eclipse一下子就运行快了起来方法二:javaproject可以右击工程RunAS-->选最... 查看详情

获取android系统默认给每个app分配的内存上限

ActivityManageractivityManager=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);intmemorySize=activityManager.getMemoryClass();测试结果:华为mate7:192m小米4:128m红米:128m三星SM-N7508v:96mAndroid4.0以后,可以 查看详情

如果使在linux中修改的数据不回写到磁盘?

如题,我想在使用Linux过程中,对磁盘进行的修改并不回写到磁盘,而是对于写请求,重定向到内存或其它什么地方保存,读请求的话,首先检查内存中是否有,没有的话再向磁盘申请读。最后如果重启的话,则所有修改的数据... 查看详情

数据库i/o:cmphibernate

...运行的时候点击“Suspend”将虚拟OS挂起,它会把整个虚拟内存的内容保存到磁盘上,譬如你为虚拟OS分配了128M的运行内存,那挂起以后你会在虚拟OS所在的目录下找到一个同样是128M的文件,这就是虚拟OS内存的完整镜像!这种内... 查看详情

如何解决用于actionscript3.0编译的java虚拟机内存不足

增加Java虚拟机的内存限制:在启动animate时,使用"-Xmx"选项增加可用的内存量。例如,"-Xmx1024m"表示最多可分配1024MB的内存。减小Actionscript3.0编译的文件大小:减小编译文件的大小可以减少内存需求。可以考虑删除... 查看详情

北京day1下午

....in输出文件名bit.outcalculation.outpath.out每个测试点时限1s2s1s内存限制128M128M128M测试点数目101010每个测试点分值101010结果比较方式全文比较(过滤行末空格及文末回车)题目类型传统&n 查看详情

汇编实验二

实验内容(1)使用e指令修改内存内容使用a指令输入书上的内容使用t逐步执行命令,ax内存从0021→2200;ds→0021;ss→2200;ax偏移地址为6462;pushax指令使sp→00fesp-2;pushbx指令使sp→00fcsp-2;popax指令使sp→6c6a;popbx指令使sp→6462;p... 查看详情

交换分区

推荐交换分区的大小应当与系统物理内存的大小保持线性比例关系。不过在小于2GB物理内存的系统中,交换分区大小应该设置为内存大小的两倍;如果内存大小多于2GB,交换分区大小应该是物理内存大小加上2GB。其原因在于,系... 查看详情

idea2020开启内存显示

...n\dea.vmoptions选择对应的版本,或者双击shift,搜索vmoption修改-Xms和-Xmx参数,如下:-Xms:最小内存-Xmx:最大内存设置完成后,重启idea,然后idea右下角看到的最大内存便是新设置的-Xmx内存大小。这里的内存设置是指单个窗口的内存... 查看详情

虚拟内存

 虚拟内存这个概念,大家都不会陌生。有人会说虚拟内存还不简单,不就是在内存不够的时候,就把外存当内存来使用,这种说法有一定的道理,但显然不准确。 在最开始内存只有128M或者256M时,内存显然是不够的,在... 查看详情

我的电脑属性里不显示硬件信息

...理器。  参考技术A如何用最简单的方法在一台电脑上修改系统所显示的以下几个硬件的参数:1.在“我的电脑”---“属性”中和“设备管理器”中修改系统所显示的CPU的参数。如:显示为P42.0修改为P42.8。及将“赛扬”改为P4... 查看详情