S3C2440 uboot2010.06 LCD驱动移植手册
- 格式:pdf
- 大小:355.25 KB
- 文档页数:6
首先:在汇编中初始化堆栈,中断向量表,MMU,时钟,串口等,然后跳到C语言的Main 函数。
这部分代码小于4K,放在block0。
这个Main函数用来将第二段代码拷备到DRAM 中并执行。
其次:进入第二段代码。
第二段代码也是先在汇编中初始化堆栈,中断向量表等,然后跳到C语言的Main函数。
这部分代码就不用有4K限制了,具体大小由第一段代码决定,因为它本身由第一段代码来搬运。
这个Main函数用来显示开机图片以及进度条。
然后视串口接收信息运行带有USB下载NK的Eboot或是读取NK映像,启动WINCE系统。
最后:进入第三段代码。
这段代码用于通过USB将PC上的NK.nb0或NK.bin文件下载进NANDFLASH并运行。
可见,扬创公司光bootloader就分成了三个部分,即3个bin文件组成。
然后分别将这三段二进制代码下载进分别从block0,block2,block8(block12)开始的三块。
具体烧写手段采用老掉牙的giveio烧写,就是曾经大名鼎鼎的SJF2440了,相信不少嵌入式高手都用过,哈哈。
如果不小心将bootloader弄丢了,再重烧一片,得等上好几分钟,足够你到外面跑上几千米再回来这么长了。
尽管如此,我们的扬创公司仍然拿他们的代码当宝,死活不肯开源。
要知道对于买你们板子的人,都是来学习的呀!学习嵌入式系统,bootloader是最基础也是进入嵌入式行业的敲门砖,没有了代码,无疑给学习添加了很大的麻烦,而扬创官方回答却是:用户开发产品用不着修改bootloader.我看扬创没开发过东西,不了解行情。
不说这么多废话了,说多了无益,让我们一起来揭开bootloader的神秘的面纱吧!先说下我移植的bootloader的功能,以及烧录时间,和扬创的做下对比。
第一次下载bootloader到NANDFLASH的方法:方法一:通过扬创的老掉牙的方法,先在ADS1.2里面生成bootloader.bin文件,然后用SJF2440烧写工具,配合giveio将BIN文件烧写进从block0开始的块。
VBPD: 垂直同步信号的后肩,单位为1行(Line)的时间。
LINEVAL :垂直显示尺寸-1,即屏行宽-1。
HBPD:水平同步信号的后肩,单位为1VCLK的时间。
HFPD:水平同步信号的前肩,单位为1VCLK的时间。
HSPW:水平同步信号的脉宽,单位为1VCLK的时间。
HOZVAL:水平显示尺寸-1,即屏列宽-1。
由上图可知:扫描一帧所需的时间:=((VSPW+1)+(VBPD+1)+( LINEVAL+1)+(VFPD+1))个行时间。
扫描一行所所需的时间:=((HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1))个VCLK时间。
而一个VCLK时间由LCD寄存器LCDCON1内的CLKVAL决定:=HCLK/[2*(CLKVAL+1)]因此扫描一帧所需的时间:T=[(VSPW+1)+(VBPD+1)+( LINEVAL+1)+(VFPD+1)]*[(HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1)]* HCLK/[2*(CLKVAL+1)]即帧频率为:1/T注意:以上的时序图为一般TFT的时序图。
实际TFT对应的时序图时序可能不一样(比如极性,符号等)。
下文中详述。
图2东华TFT型LCD(WXCAT35)时序图//2440A寄存器参数#define MVAL (13)#define MVAL_USED (0) //0=each frame 1=rate by MVAL#define INVVDEN (1) //0=normal 1=inverted#define BSWP (0) //Byte swap control#define HWSWP (1) //Half word swap control#define PNRMODE (3) // 设置为TFT屏#define BPPMODE (12) // 设置为16bpp模式//东华屏参数#define VBPD (3-1) //12 垂直同步信号的后肩参数见东华pdf #define VFPD (14-1) //4 垂直同步信号的前肩#define VSPW (15-1) //5垂直同步信号的脉宽#define HBPD (38-1) //(22)水平同步信号的后肩#define HFPD (20-1) //(33)水平同步信号的前肩#define HSPW (30-1) //(44)水平同步信号的脉宽#define CLKVAL_TFT (6)//屏大小#define LCD_XSIZE_TFT (240)//屏实际列数#define LCD_YSIZE_TFT (320)// 屏实际行数#define SCR_XSIZE_TFT (240) //虚拟屏列数#define SCR_YSIZE_TFT (320) //虚拟屏行数#define HOZVAL_TFT (LCD_XSIZE_TFT-1)#define LINEVAL_TFT (LCD_YSIZE_TFT-1)以上有关东华屏参数设置,在PDF中如下所示:7. LCDSADDR2寄存器rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );//单位为字节一个点16bit=2字节8. LCDSADDR3寄存器rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);// 1=*16bit/半字=16/16LCD初始化程序:void Lcd_Init(void){//引脚功能初始化rGPCUP = 0x00000000;rGPCCON = 0xaaaa02a9;rGPDUP = 0x00000000;rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(PNRMODE<<5)|(BPPMODE<<1)|0;// TFT LCD panel,16bpp TFT,ENVID=off(Disable the video output and the LCD control signal) rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);rLCDCON4=(MVAL<<8)|(HSPW);rLCDCON5 = (1<<11) | (1<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3) |(BSWP<<1) | (HW //5:6:5rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );//单位为字节一个rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);// 1=*16bit/半字= rLCDINTMSK|=(3); // MASK LCD Sub InterruptrTCONSEL &= (~7) ; // Disable LPC3480rTPAL=0; // Disable Temp Palette}16BPP模式特点:内存数据格式:。
U-Boot移植(3)增加对S3C2440的⽀持昨天跟张⽼师去打乒乓球了,还没写完今天接着写。
6、S3C2440是S3C2410的改进版,它们的操作基本相似,只是在系统时钟的设置、NAND Flash控制器的操作等⽅⾯有⼀些⼩差别。
⽽下⾯我要做的就是令⼀个U-Boot⼆进制代码既可以在S3C2410上运⾏,也可以在S3C2440上运⾏。
虽说我的板也是S3C2410的,但是增加S3C2440的U-Boot练习,可以提⾼我们的能⼒,为后⾯的学习打下基础。
GSTATUS1寄存器的值:0x32410000表⽰S3C2410,0x32410002表⽰S3C2440。
S3C2410:FCLK=200MHZ;S3C2440:FCLK=400MHZ,UCLK=48MHZ;搞清楚之后,下⾯我们就可以开始了。
⾸先先在board/100ask24x0/100ask24x0.c 中的前⾯定义如下⼀些值:我的开发板输⼊时钟为12MHZ,如果你的开发板时钟和我的不⼀样的话,可以根据以前代码中的公式计算,然后修改系统时钟,这在include/configs/100ask24x0.h中的宏CONFIG_SYS_CLK_FREQ中定义。
接下来,就是使⽤不同的宏设置系统时钟,包括S3C2410、S3C2440。
7、在后⾯设置串⼝波特率时需要获得系统时钟,就是在U-Boot的第⼆个阶段,即是lib_arm/board.c中start_armboot函数调⽤serial_init函数初始化串⼝时,会调⽤get_PCLK、get_HCLK、get_PLLCLK等函数,这需要我们作相应的修改。
⾸先要在board_init函数的开关增加如下⼀⾏,才能使⽤变量gd,因为识别出S3C2410和S3C2440,设置了机器类型ID:gd->bd->bi_arch_number 。
接着在get_PLLCLK函数中增加如下:由于分频系数设置⽅法也不⼀样,get_HCLK、get_PCLK也需要修改。
第二章处理器工作模式2.1概述S3C2440采用了非常先进的ARM920T内核,它是由ARM(Advanced RISC Machines) 公司研制的。
2.2 处理工作状态从程序员的角度上看,ARM920T可以工作在下面两种工作状态下的一种:● ARM 状态:执行32位字对齐的ARM指令● THUMB 状态:执行16位半字对齐的THUMB指令。
在这种状态下,PC 寄存器的第一位来选择一个字中的哪个半字注意;这两种状态的转换不影响处理模式和寄存器的内容。
2.3 切换状态进入THUMB 状态进入THUMB 状态,可以通过执行BX指令,同时将操作数寄存器的状态位(0位)置1来实现。
当从异常(IRQ,FIQ,UNDEF,ABORT,SWI等)返回时,只要进入异常处理前处理器处于THUMB状态,也会自动进入THUMB状态。
进入ARM状态进入ARM状态,可以通过执行BX指令,并且操作数寄存器的状态位(0位)清零来实现。
当处理进入异常(IRQ,FIQ,RESET,UNDEF,ABORT,SWI等)。
这时,PC值保持在异常模式下的link寄存器中,并从异常向量地址处开始执行处理程序。
存储空间的格式ARM920T将存储器空间视为从0开始由字节组成的线性集合,字节0到3中保存了第一个字节,字节4到7中保存第二个字,以此类推,ARM920T对存储的字,可以按照小端或大端的方式对待。
大端格式:在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放2.4 指令长度指令可以是32位长度(在ARM状态下) 或16位长度(在THUMB状态) 。
数据类型ARM920T支持字节(8位),半字(16位) 和字(32位) 数据类型。
字必须按照4字节对齐,半字必须是2字节对齐。
2.5 操作模式ARM920T支持7种操作模式:● 用户模式(user模式),运行应用的普通模式● 快速中断模式(fiq模式),用于支持数据传输或通道处理● 中断模式(irq模式),用于普通中断处理● 超级用户模式(svc模式),操作系统的保护模式● 异常中断模式(abt模式),输入数据后登入或预取异常中断指令● 系统模式(sys模式),使操作系统使用的一个有特权的用户模式● 未定义模式(und模式),执行了未定义指令时进入该模式]外部中断,异常操作或软件控制都可以改变中断模式。
u-boot在S3C2440上的移植问题及解决方法集锦(四)一、移植环境∙主机:VMWare6.5--Fedora 9∙开发板:自制开发板CPU:S3C2440;SDRAM:HY57V561620FTP-H;NOR flash:SST_39VF1601(2M);NAND flash:K9F1G08U0B(128M);网卡芯片:DM9000EP∙编译器:arm-linux-gcc-4.3.2∙u-boot:u-boot-2009.08∙linux kernel:linux-2.6.30∙busybox:busybox-1.13.3二、博客地址/liuqiqi677如有错误,欢迎指正。
三、参考资料主要参考了黄刚的博客/u3/101649/,他的博客写得相当不错,将嵌入式开发各个阶段的知识以边做边学的方式,辅以图片、解释,清晰地呈现给读者,能够让读者把握主线,对嵌入式开发有整体的了解。
强烈推荐!!!四、问题及解决方法10、使用arm-linux-gcc 4.3.2 编译内核,必须启用内核中的Use the ARM EABI 选项没有选中这个选项的时候,系统启动,会出现下面的错误:Freeing init memory: 128KKernel panic - not syncing: Attempted to kill init!Backtrace:[<c00259c0>] (dump_backtrace+0x0/0x114) from [<c026d674>] (dump_stack+0x18/0x1c)r7:c5818000 r6:c5817a40 r5:c5817a40 r4:c03291c4[<c026d65c>] (dump_stack+0x0/0x1c) from [<c026d6c4>] (panic+0x4c/0x120)[<c026d678>] (panic+0x0/0x120) from [<c00406e0>](do_exit+0x70/0x58c)r3:c0313004 r2:c5817a40 r1:c5819d0c r0:c02cbdcb[<c0040670>] (do_exit+0x0/0x58c) from [<c0040c90>](do_group_exit+0x94/0xc8)[<c0040bfc>] (do_group_exit+0x0/0xc8) from [<c004ae40>] (get_signal_to_deliver+0x2ec/0x324)r7:c5293a74 r6:c5818000 r5:c5819ed4 r4:00000004[<c004ab54>] (get_signal_to_deliver+0x0/0x324) from[<c0024024>] (do_signal+0x58/0x528)[<c0023fcc>] (do_signal+0x0/0x528) from [<c0024524>](do_notify_resume+0x30/0x34)[<c00244f4>] (do_notify_resume+0x0/0x34) from [<c0021e8c>] (work_pending+0x1c/0x20)错误的原因是因为arm-linux-gcc-4.3.2 使用了EABI方式,所以这就需要内核同样配置EABI编译属性,才能支持EABI编译出来的busybox。
CPU S3C2440A 主频400MHz,最高533MHzSDRAM hy57v561620ftp-h 2片16bit 32M 串联,最高100MHz Nand Flash K9F1208U00-PCB064M ×8bit Nor Flash AM29LV160DB-90EC 2M ×16bitLCD HST-TPA3.5F 3.5英寸真彩色TFT电阻式触摸屏LCD NET CARDCS8900A-CQ3Z10M 网卡控制芯片16bit 数据传输表1实验板的主要硬件组成图1U-boot 的整体结构1Uboot 移植环境准备1.1移植平台的硬件组成硬件平台是ARM9的体系结构,ARM920T 的CPU ,SOC 芯片是三星的S3C2440,支持Nand Flash 与NorFlash 的可选启动方式,其主要硬件资源如表1所示[1]。
支持Nand Flash 与Nor Flash 启动,可以通过跳线来选择启动方式。
Nand Flash 启动时,最开始4KB 数据被硬拷贝到内部Boot Internal SRAM,且被映射到nGCS0的片选空间0x0000,0000—0x0800,0000;Nor Flash 方式启动时,它直接被映射到nGCS0的片选空间。
所以,在U -boot 移植时,要考虑将Uboot 烧写到Nor flash 上还是Nand Flash 上。
1.2Uboot 工作原理Uboot 的整体结构如图1所示。
从图1可以看出,这种分层结构的Uboot 分模块化了,给移植带来了很大的方便。
由于协议层与应用层是与目标硬件无关的,因此移植工作主要集中在物理层和驱动层上面的修改。
而Uboot 支持串口下载、网络下载,并提供了很多交互式命令。
整个Uboot 编译、连接过程如下:(1)创建编译环境在MAKEFILE 中会调用根目录下Uboot 在S3C2440上的移植卢伟,潘炼(武汉科技大学信息科学与工程学院自动化系,湖北武汉434200)摘要:通过分析Uboot 的文件结构及其启动流程,详细给出了Uboot 在基于ARM920T 开发板上的移植方案,包括编译、调试全过程,最终能够在Uboot 命令方式下加载映像文件,完成Linux 内核与yaffs 映像文件的调试,具有Bootloader 移植的通用性。
一、Uboot移植前的准备1、修改makefile、配置文件在配置文件之前,需要修改makeflie相关内容:修改如下:(1)修改编译器,这里我们的makefile已经设置为arm-linux-无需再修改,如下所示:ifeq ($(ARCH),arm)CROSS_COMPILE = arm-linux-Endif(2)添加fl2440的配置项,如下所示:fl2440_config:unconfig@$(MKCONFIG) $(@:_config=) arm arm920t fl2440 step s3c24x0注意:在添加的fl2440_config的第二行,必须以Table开头,不能有任何多余的符号,否则极易导致编译错误。
Uboot支持多种处理器和平台,在编译uboot之前需要对其进行配置,使其支持我们自己的开发平台。
在执行编译make之前,需要进行配置即make fl2440_config。
通过查看顶层目录的makeflie文件,通过以下语句:MKCONFIG := $(SRCTREE)/mkconfig得出实际执行的命令为:./mkconfig fl2440 arm arm920t fl2440 step s3c24x0执行完这句后,产生如下结果:(1)开发板名称为fl2440;(2)将include中的头文件连接到同平台相关的头文件中,这里的连接为:asm->asm-armarch->arch-s3c24x0proc->proc-armv(3)创建顶层Makefile包含的文件inclued/config.mk,该文件内容如下ARCH = armCPU = arm920tBOARD = fl2440VENDOR = stepSOC = s3c24x0(4)创建开发板相关头文件include/config.h,该文件中包含了对开发板的相关配置,如下所示:#include <configs/fl2440.h>从上面可以知道,在将uboot配置为适合自己的平台的时候,需要在路径/include/configs下添加配置头文件fl2440.h。
十四、添加LCD驱动和LOGO制作1、在drivers/video目录中新增s3c2440_fb.c,代码如下:#include <common.h>#if defined(CONFIG_VIDEO_S3C2440)#include <video_fb.h>#include "videomodes.h"#include <asm/arch/s3c24x0_cpu.h>#include <asm/io.h>/** Export Graphic Device*/GraphicDevice smi;#define VIDEO_MEM_SIZE 0x200000#define MVAL (0)#define MVAL_USED (0) //0=each frame 1=rate by MVAL#define INVVDEN (1) //0=normal 1=inverted#define BSWP (0) //Byte swap control#define HWSWP (1) //Half word swap control#define VBPD (12)#define VFPD (4)#define VSPW (10)#define HBPD (43)#define HFPD (8)#define HSPW (1)#define CLKVAL_TFT (4)void lcd_enable(void){struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();struct s3c24x0_lcd * const lcd = s3c24x0_get_base_lcd();gpio->GPGUP = gpio->GPGUP & ((~(1 << 4)) | (1 << 4));gpio->GPGCON = gpio->GPGCON & ((~( 3 << 8)) | ( 3 << 8));gpio->GPGDAT = gpio->GPGDAT | (1 << 4 );lcd->LCDCON5 = lcd->LCDCON5 & ((~( 1 << 3)) | (1 << 3)); // PWREN lcd->LCDCON5 = lcd->LCDCON5 & ((~( 1 << 5)) | (0 << 5)); // INVPWREN lcd->LCDCON1 |= 1;gpio->GPBUP = gpio->GPBUP & ((~(1 << 1)) | (1 << 1));gpio->GPBCON = gpio->GPBCON & ((~( 3 << 2)) | ( 3 << 2));gpio->GPBDAT = gpio->GPBDAT | (1 << 1 );/********************************************************************************* Init video chip with common Linux graphic modes (lilo)*/void *video_hw_init (void){struct s3c24x0_lcd * const lcd = s3c24x0_get_base_lcd();GraphicDevice *pGD = (GraphicDevice *)&smi;int videomode;int bppmode;unsigned long t1, hsynch, vsynch;char *penv;int tmp, i, bits_per_pixel;struct ctfb_res_modes *res_mode;struct ctfb_res_modes var_mode;tmp = 0;videomode = CONFIG_SYS_DEFAULT_VIDEO_MODE;/* get video mode via environment */if ((penv = getenv ("videomode")) != NULL) {/* deceide if it is a string */if (penv[0] <= '9') {videomode = (int) simple_strtoul (penv, NULL, 16);tmp = 1;}}else{tmp = 1;}if (tmp) {/* parameter are vesa modes *//* search params */for (i = 0; i < VESA_MODES_COUNT; i++) {if (vesa_modes[i].vesanr == videomode)break;}if (i == VESA_MODES_COUNT) {printf ("no VESA Mode found, switching to mode 0x%x ", CONFIG_SYS_DEFAULT_VIDEO_MODE);i = 0;res_mode = (struct ctfb_res_modes *) &res_mode_init[vesa_modes[i].resindex];bits_per_pixel = vesa_modes[i].bits_per_pixel;}else{res_mode = (struct ctfb_res_modes *) &var_mode;bits_per_pixel = video_get_params (res_mode, penv);}/* calculate hsynch and vsynch freq (info only) */t1 = (res_mode->left_margin + res_mode->xres + res_mode->right_margin + res_mode->hsync_le n) / 8;t1 *= 8;t1 *= res_mode->pixclock;t1 /= 1000;hsynch = 1000000000L / t1;t1 *= (res_mode->upper_margin + res_mode->yres + res_mode->lower_margin + res_mode->vsy nc_len);t1 /= 1000;vsynch = 1000000000L / t1;/* fill in Graphic device struct */sprintf (pGD->modeIdent, "%dx%dx%d %ldkHz %ldHz", res_mode->xres, res_mode->yres, bits_pe r_pixel, (hsynch / 1000), (vsynch / 1000));pGD->winSizeX = res_mode->xres;pGD->winSizeY = res_mode->yres;pGD->plnSizeX = res_mode->xres;pGD->plnSizeY = res_mode->yres;switch (bits_per_pixel){case 8:pGD->gdfBytesPP = 1;pGD->gdfIndex = GDF__8BIT_INDEX;bppmode = 11;break;case 16:pGD->gdfBytesPP = 2;pGD->gdfIndex = GDF_16BIT_565RGB;bppmode = 12;break;case 24:pGD->gdfBytesPP = 3;pGD->gdfIndex = GDF_24BIT_888RGB;bppmode = 13;break;}pGD->frameAdrs = LCD_VIDEO_ADDR;pGD->memSize = VIDEO_MEM_SIZE;lcd->LCDCON1 = (CLKVAL_TFT << 8) | (MVAL_USED << 7) | (3 << 5) | (bppmode << 1) | 0;lcd->LCDCON2 = (VBPD << 24) | (pGD->winSizeY-1 << 14) | (VFPD << 6) | (VSPW);lcd->LCDCON3 = (HBPD << 19) | (pGD->winSizeX-1 << 8) | (HFPD);lcd->LCDCON4 = (MVAL << 8) | (HSPW);lcd->LCDCON5 = (1 << 11) | (0 << 10) | (1 << 9) | (1 << 8) | (0 << 7) | (0 << 6) | (1 << 3) | (BSWP < < 1) | (HWSWP);lcd->LCDINTMSK |= (3);lcd->LPCSEL &= (~7);lcd->TPAL = 0x0;writel((pGD->frameAdrs >> 1), &lcd->LCDSADDR1);/* This marks the end of the frame buffer. */writel((((readl(&lcd->LCDSADDR1))&0x1fffff) + (pGD->winSizeX+0) *pGD->winSizeY), &lcd->LCDSA DDR2);writel((pGD->winSizeX & 0x7ff), &lcd->LCDSADDR3);/* Clear video memory */memset((void *)pGD->frameAdrs, 0, pGD->memSize);lcd_enable();return ((void*)&smi);}void video_set_lut (unsigned int index,/* color number */unsigned char r, /* red */unsigned char g, /* green */unsigned char b /* blue */){}#endif /* CONFIG_VIDEO_S3C2440 */修改video目录下Makefile文件COBJS-$(CONFIG_VIDEO_VCXK) += bus_vcxk.oCOBJS-$(CONFIG_VIDEO_S3C24X0) += s3c24x0_fb.o videomodes.o cfb_console.o COBJS := $(COBJS-y)2、修改include/configs/SMDK2440.h,添加下面的宏定义/* LCD settings */#define CONFIG_VIDEO#define CONFIG_VIDEO_S3C2440#define CONFIG_VIDEO_LOGO#define CONFIG_VIDEO_BMP_LOGO#define VIDEO_FB_16BPP_WORD_SWAP#define CONFIG_SYS_VIDEO_LOGO_MAX_SIZE (800*480+1024+100)#define LCD_VIDEO_ADDR 0x33d00000#define CONFIG_CMD_BMP#define CONFIG_CFB_CONSOLE#define CONFIG_SYS_CONSOLE_INFO_QUIET/* for PC-keyboard */#define VIDEO_KBD_INIT_FCT 0#define VIDEO_TSTC_FCT serial_tstc#define VIDEO_GETC_FCT serial_getc3、修改drivers/video/videomodes.c{0x31A, RES_MODE_1280x1024, 16},{0x31B, RES_MODE_1280x1024, 24},{0x213, RES_MODE_800x480, 16},};RES_MODE_800x480前的数据0x213与前面的不同即可。