AT91SAM9263 WinCE6.0 PB Builder
上面是开发的硬件平台跟软件平台
ATmel公司官方提供的BSP中,默认设置eboot的大小为192K。在官方的评估套件中,所采用的LCD是3.5寸屏幕,320*240的尺寸。该BSP对于开机Logo的处理是把logo信息转化为一个数组,并将该数据编译进整个eboot。而公司自己做的9263评估套件LCD采用了800*480的屏幕,在处理开机logo的时候就出现了一些问题。800*480 ,一个像素用一个字节来表示的话,也得384000个字节,375K,仅仅是这个数据的大小便已经超过了原来eboot的大小。所以当前必须要做的就是增大eboot。下面简述把eboot增大到512所需要修改的地方。
《第一步》
C:/WINCE600/PLATFORM/AT91SAM9263EK/FILES目录下config.bib文件
内存空间必须重新分配
; Copyright (c) 2005 Adeneo. All rights reserved.
;
;
; Memory Map
; ----------
; 8000.0000 -+
; -----------|
; -----------| RESERVED (used by the bootloader. This section can be regained by using pNKEnumExtensionDRAM)
; -----------|
; 8005.8000 -+
; | Ethernet Buffer (76KB)
; 8006.b000 -+
; | drivers global (4KB)
; 8006.c000 -+
; |
; | OS (NK) Code (1MB)
; |
; 8015.E000 -+ if (AUTOSIZE = ON) then this thresold will change depending of the image's content.
; |
; | OS (NK) RAM (13.6 MB)
; |
; 80f0.0000 -+
; | Video Memory (1 MB)
; 8100.0000 -+
;
MEMORY
; Name Start Size Type
; ------- -------- -------- ----
BLDR 80000000 00180000 RESERVED
EMACBUF 80180000 00013000 RESERVED
DRVGLOB 80193000 00001000 RESERVED
NK 80194000 00200000 RAMIMAGE
RAM 80394000 03A6C000 RAM
VIDEOMEM 83e00000 00200000 RESERVED
CONFIG
AUTOSIZE=ON
KERNELFIXUPS=ON
; @CESYSGEN IF !NK_NKNOCOMP
COMPRESSION=ON
; @CESYSGEN ENDIF !NK_NKNOCOMP
; @CESYSGEN IF NK_NKNOCOMP
COMPRESSION=OFF
; @CESYSGEN ENDIF NK_NKNOCOMP
IF IMGPROFILER
PROFILE=ON
ELSE
PROFILE=OFF
ENDIF
;
; ROMFLAGS is a bitmask of options for the kernel
; ROMFLAGS 0x0001 Disallow Paging
; ROMFLAGS 0x0002 Not all KMode
; ROMFLAGS 0x0010 Trust Module only
;
IF IMGTRUSTROMONLY
IF IMGNOTALLKMODE
ROMFLAGS=12
ELSE
ROMFLAGS=10
ENDIF
ELSE
IF IMGNOTALLKMODE
ROMFLAGS=02
ELSE
ROMFLAGS=00
ENDIF
ENDIF
ROMSTART=80194000 ;ROMSTART项对应上面的 NK 80194000 00200000 RAMIMAGE 起始地址
ROMWIDTH=32
ROMSIZE=01C00000
《第二步》
C:/WINCE600/PLATFORM/AT91SAM9263EK/SRC/BOOTLOADER/EBOOT目录下eboot.bin
;
; Copyright (c) 2005 Adeneo. All rights reserved.
;
;
; TITLE: EBOOT.BIB
;
; Ethernet Boot Loader Source Module
;
; Memory Map
; ----------
;
; 8000.0000 -+
; | Bootloader Code (256KB)
; 8004.0000 -+
; | Bootloader RAM (=data section) (64KB)
; 8005.0000 -+
; | Bootloader pseudo-HEAP (custom code) (32KB)
; 8005.8000 -+
; | Ethernet Buffer (76KB)
; 8006.b000 -+
; | drivers global (4KB)
; 8006.c000 -+
; -----------|
; -----------|
; -----------|
; -----------|
; -----------| Reserved AREA (65180 KB = 63.65 MB)
; -----------|
; -----------|
; -----------|
; -----------|
; 8400.0000 -+
;
;
;******************************************************************************
MEMORY
; Name Start Size Type
; ------- -------- -------- ----
EBOOT 80000000 00080000 RAMIMAGE
RAM 80080000 00080000 RAM
PSHEAP 80100000 00080000 RESERVED
EMACBUF 80180000 00013000 RESERVED
DRVGLOB 80193000 00001000 RESERVED
CONFIG
AUTOSIZE=OFF
COMPRESSION=OFF
PROFILE=OFF
KERNELFIXUPS=ON
ROMSTART=80000000
ROMWIDTH=32
ROMSIZE=00080000;190ko do not change ! 指定生成的eboot大小为512K字节
;size of the generated eboot.nb0,eboot.nb1,...
;size of the EBOOT section, limited by the internal SRAM. The size must be 80ko to be upadatable by FirstBoot
MODULES
; Name Path Memory Type
; ------ ---------------------------------------------- -----------
nk.exe $(_TARGETPLATROOT)/target/$(_TGTCPU)/$(WINCEDEBUG)/eboot.exe EBOOT
《第三步》
C:/WINCE600/PLATFORM/AT91SAM9263EK/SRC/INC 目录下三个.h文件的修改
at91sam9263EK.h修改的地方如下
/#define VIDEOMEM_DEFAULT_IN_SDRAM
// Make sure this match up with the def in config.bib (except that here, we're using the physical address)
#define DRIVER_GLOBALS_PHYSICAL_MEMORY_START 0x20193000
#define DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE 0x1000 // 4K
/ Make sure this match up with the def in config.bib
#define AT91SAM9263EK_BASE_BLDRIMAGE 0x80000000
#define AT91SAM9263EK_BLDR_RESERVEDAREA_SIZE 0x00180000
bsp_cfg.h
#define EBOOT_MAX_SIZE 0x00080000 //190ko
bootloader_cfg.h
#define EBOOT_MAX_SIZE 0x00080000
以上修改的主要是控制eboot生成的部分,还有一个重要的地方在
C:/WINCE600/PLATFORM/AT91SAM9263EK/SRC/BOOTLOADER/FirstBoot目录下main.c文件中
FIRSTBOOT_StartBoot函数内,有如下语句
//SizeToDownload = 258*1024;//EBOOT_MAX_SIZE;
SizeToDownload = 600*1024;//EBOOT_MAX_SIZE;
//DbgPrint("Load CE-BOOT from Flash to SDRAM/n/r");
if (SizeToDownload == 0)
{
while(1);
}
该处语句控制拷贝到内存的eboot的大小,现在eboot增大到512K了,所以所需要拷贝的部分自然而然的也要增大好多了。呵呵。
不要丢了这个地方。
!!!!!!!
{第一次编译完成以后,我就没有写文档,觉得这个过程没有想象的复杂,我都记住了,可是后来,我再一次去修改的时候,完全是按照记忆去做的,却忘记了上面的这一条,血一样的教训啊,三天,三天的时间来尝自己种的苦果子,⊙﹏⊙b汗}
重新编译,应该就可以了。
下面就是修改跟开机画面有关的代码了。在Atmel提供的官方BSP中,也包含了相关代码的支持。主要目录为
C:/WINCE600/PLATFORM/AT91SAM9263EK/SRC/BOOTLOADER/SplashScreen
主要文件为两个:
ScrConf.h
#define SCREEN_WIDTH 0x0320
#define SCREEN_HEIGHT 0x01E0
#define SCREEN_RES 0x08
#define FORCED_RGB 0x00
#define CACHED_VRAM 0x00
#define VRAM_WIDTH 0x00000320
#define VRAM_HEIGHT 0x000001E0
#define VRAM_ADDRESS 0x23E00000
#define MARGIN_UPPER 0x0016
#define MARGIN_LOWER 0x0084
#define MARGIN_LEFT 0x002D
#define MARGIN_RIGHT 0x00D2
#define VSYNC 0x01
#define HSYNC 0x01
#define PIXEL_CLOCK 0x500000
修改为自己lCD屏幕的参数设置
// Setting the Control signals
#define SCR_IO_VSYNC_CTRLR AT91C_BASE_PIOC
#define SCR_IO_VSYNC_PIN 0
#define SCR_IO_VSYNC_PERIPH PIO_PERIPH_A
不知道什么原因,BSP代码中上面的这个垂直同步信号脚 居然被配置为了输出模式,改过来,配置成外设A的功能既可
SplashScreen.c中,函数void IOConfig(PEBOOTSCREENDESC pScrDef)中
// Setting the Control signals
// gpio_set_gpio(SCR_IO_VSYNC_CTRLR, SCR_IO_VSYNC_PIN, 1, SCR_IO_VSYNC_PERIPH); // VSync
gpio_set_periph(SCR_IO_VSYNC_CTRLR, SCR_IO_VSYNC_PIN, 0, SCR_IO_VSYNC_PERIPH); // VSync
这个垂直信号的设置也存在问题,改过来
C:/WINCE600/PLATFORM/COMMON/SRC/SOC/ATMEL/AT91SAM9263/BOOTLOADER/SplashScreenEBOOT
该目录下没有需要修改的文件。看看即可
C:/WINCE600/PLATFORM/COMMON/SRC/SOC/ATMEL/COMMON/BOOTLOADER/SplashScreenEBOOT
该目录下主要修改的文件只有一个,BitMap.h
用GIMP 2工具可以将一个位图转化为 以数据进行索引的256色的数组。具体使用方法,随BSP安装包一起下载的文档AT91SAM9263EK CE6.0 TDD v1.3.0 A.pdf中有详细的介绍。仔细学习该文档,许多问题可以迎刃而解的。
按照上述步骤修改后,不出什么以为的话,开机Logo应该可以出现了。
另外一个问题:
仅仅是增大eboot的大小,把eboot增大到512K,不会发现什么问题,eboot下载NK也没有遇到什么问题。可是......................
增加开机Logo,改动相关设置以后,却出现问题了,
1: eboot下载NK的时候网络断断续续,经常出现
ng buffers, status = 60
bForceTX
Sent Frame error
这样的错误,严重的时候会一直卡着,知道看门狗动作,复位.郁闷。
2:跟严重的时候在eboot下发送
Sent BOOTME to 255.255.255.255
Sent BOOTME to 255.255.255.255
命令的时候就会出现网络问题。现象差不多同上,意思就是缓冲区溢出或者什么什么的
一点一点的找问题。最终发现问题在一个地方
ScrConf.h文件中
#define PIXEL_CLOCK 0x500000
这个宏定义的定义。
一般情况下,对于800*480的屏幕,该宏定义一般为0x15f9000 (800*480*60)
但是如果这么大,Sent BOOTME to 255.255.255.255的时候就会出错。
把该值减小到0xA00000的时候Sent BOOTME to 255.255.255.255没错了,但是下载的时候有问题....
再把该值继续减小,到0x500000的时候,下载好想就比较顺畅了,一般出现的次数比较少,没有之前那么那么的频繁了。
同时配合下载选项的设置
Target--Connetivity Options---Download--Settings中 那个TFTP block size in bytes
默认为512K,把它减小 256 128 64 32都有不错的效果
why会出现如此的问题,至今还不了解。等待Ing
之后我又对这个现象做了测试,把问题进行了进一步的定位,跟上面所说的地方时一样的。
就是像素时钟这个宏定义的值。But I dot know why?
转自:http://blog.163.com/qiu_zhi2008/blog/static/60140977201051763221811/
出于某种原因,跟官方提供的BSP相比,我把eboot的大小从192K,增加到了512K。之前呢,也没有注意有什么问题,最近几日,应客户的要求在定制开机logo的时候,发现了一个问题。
刚刚烧写玩eboot的时候,上电,logo非常干净,没有什么问题。在eboot下设置一些参数以后,保存,再次启动,却发现logo上多了一些黑色的点跟线条,疑惑ing.
问题解决了,非常简单,是一个遗留问题。早在扩展eboot大小的时候就把问题埋下伏笔了。
在bootloader_cfg.h 头文件中,有如下宏定义:
#define DATAFLASH_BOOTLOADER_SETTINGS_LOGICAL_OFFSET 0x00035000
如上宏定义定义了bootloader参数在DataFlash中存储的位置偏移。
如今我把eboot大小改变为512K ,所以从5000 --- 8500的区域都是eboot的区域。如果还是按照如上的定义去保存参数,那么参数刚好存在了eboot的区域,且恰好是logo的区域。
#define DATAFLASH_BOOTLOADER_CODE_LOGICAL_OFFSET 0x00005000
#define DATAFLASH_IMAGE_FLASH_OFFSET 0x00020000
所以呢,解决方法比较简单,更改如下定义既可以了
#define DATAFLASH_BOOTLOADER_SETTINGS_LOGICAL_OFFSET 0x00085000
转自:http://blog.163.com/qiu_zhi2008/blog/static/60140977201061311253203/