0. 资源:S3C2440,SST36VF160,K9F2G08U0B,UDA1334,AT070TN83(LCD,800x480 TFT),USB Host,USB Device,UARTx2
1. 网上下到一个BSP,据说是官方的,下面开始。
a. 解压BSP包到PLATFORM,加入smdk2440a.cec文件,新建工程
b. Platform Setting里边只保留“IMAGEBOOT = 1”,sysgen工程
c. 编译到"drivers/AtapiRomi"时,ERROR提示缺少"storeapi.lib"文件,添加BINFS,FATFS等特性后正常
2.
a. 修改"kernel/oal/debug.c"文件,使其将串口0作为调试串口,同时修改OEMWriteDebugLED函数对应的LED灯
b. 修改后调试串口乱码,修改"src/inc/bsp_cfg.h"的内容如下,使CPU在405Mhz工作
#define S3C2440A_FCLK 405000000 // 405Mhz
#define S3C2440A_HCLK (S3C2440A_FCLK/4)
#define S3C2440A_PCLK (S3C2440A_HCLK/2)
同时修改Bootloader/Eboot/Startup.s中的CLK时钟配置,如下:
MPLLVAL EQU (((0x7F << 12) + (0x02 << 4) + 0x1)) ; 405MHZ
UPLLVAL EQU (((0x38 << 12) + (0x02 << 4) + 0x2)) ; 48MHZ
UPLLVAL_H EQU (((0x38 << 12) + (0x01 << 4) + 0x1)) ; 128MHZ
CLKDIVNVAL EQU (((0x00 << 3 ) + (0x02 << 1) + 0x1)) ; UCLK:UPLL/1 HCLK:FCLK/4 PCLK:HCLK/2
......
ldr r0, = CLKDIVN
ldr r1, = CLKDIVNVAL
str r1, [r0]
ands r1, r1, #0xe ; set AsyncBusMode
beq %F10
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #R1_nF:OR:R1_iA
mcr p15, 0, r0, c1, c0, 0
10
ldr r0, = LOCKTIME ; To reduce PLL lock time, adjust the LOCKTIME register.
ldr r1, = 0xffffff
str r1, [r0]
ldr r0, = CAMDIVN
ldr r1, = 0
str r1, [r0]
ldr r0, = MPLLCON ; Configure MPLL
; Fin=12MHz, Fout=405MHz
ldr r1, = MPLLVAL
str r1, [r0]
mov r0, #0x2000
20
subs r0, r0, #1
bne %B20
ldr r0, = UPLLCON ; Fin=16MHz, Fout=48MHz
ldr r1, = UPLLVAL ;Fin=12MHz, Fout=48MHz
; ldr r1, = ((0x3c << 12) + (0x4 << 4) + 0x2) ; 16Mhz
; ldr r1, = ((0x38 << 12) + (0x2 << 4) + 0x2) ; 12Mhz
str r1, [r0]
修改后调试串口正常
3.
a. 由于本开发板使用GPB1作为NANDFlash(K9F2G08U0B)的写保护控制,故先将其设为高电平,等调试Flash驱动时在修改其为可控状态
在"Eboot/Bootloader/main.c"中OEMPlatformInit函数开始的时候加入:
volatile S3C2440A_IOPORT_REG *s2440IOP = (S3C2440A_IOPORT_REG *)OALPAtoVA (S3C2440A_BASE_REG_PA_IOPORT, FALSE);
// nand flash WP disable
s2440IOP->GPBCON &= ~(0x03<<2);
s2440IOP->GPBCON |= (0x1<<2);
s2440IOP->GPBDAT |= (0x01<<1);
后可以格式化NANDFlash
4.
a. USB下载不能使用,这是因为我从网上下载的BSP的EBOOT没有对IRQ模式的堆栈进行初始化,在EBOOT/Bootloader/Startup.s中加入:
........
MOV R0,#0xD2
MSR CPSR_c, R0 ; switch to irq mode
LDR SP, =0x80034000
NOP
NOP
NOP
MOV R0,#0xD3
MSR CPSR_c, R0 ; switch to svc mode
MOV R0,#0x53
MSR CPSR_c, R0 ; switch to svc mode,enable irq
mov sp, #0x80000000
add sp, sp, #0x30000 ; arbitrary initial super-page stack pointer
b main
在Boot.bib中加入
ARGS 80020800 00000800 RESERVED
RAM 80026000 00006000 RAM
STACK 8002c000 00004000 RESERVED
IRQSTK 80030000 00004000 RESERVED ;这是加入的一行,为IRQ保留栈空间
EBOOT 80038000 00040000 RAMIMAGE
BINFS 80080000 00021000 RESERVED
编译后,可以下载.bin文件,但是有时候会识别不到USB Device,这是需要重新插拔一下。
注意:重新插拔USB Device可能造成PC机蓝屏,网上的解决方法如下:
(1) 插入USB Device连接线,电脑提示找到新硬件
(2) 拔下USB Device连接线,然后选择驱动的安装位置,点击NEXT后,系统找到2个驱动,这时选择第二个进行安装
(3) 重新插上USB线,这时就可以下载内核了
5.
a. DNW下载内核,我是直接下载SDRAM中进行调试的。因为SAMSUNG给的Eboot在内核下载后再进行分区,保存NK.bin(实际上是解压后的,也就是NK.nb0)
的BINFS分区大小和NK的大小一样,这就导致了我们下载较大的内核时必须重新低格Flash。
b. 我的Release版内核运行到INFO: CReg2440Uart::CReg2440Uart using processor frequency reported by the OAL (50625000).就停住了,这是因为
UART0作为调试串口,现在又把它作为系统的串口,二者冲突,
将注册表"project.reg"内容:
IF BSP_NOUART0 !
IF BSP_KITL != SERIAL_UART0
;=============== UART0 (physical COM1 connector P1) (Serial) ===============
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/Serial]
"DeviceArrayIndex"=dword:0
"Irq"=dword:17 ; 修改
"MemBase"=dword:50004000 ; 修改 2010-12-13
"MemLen"=dword:2C
"InterruptBitsShift"=dword:3 ; UART 1 Interrupt Sub Register shift bit.
"ISTTimeouts"=dword:200 ; every 512 ticks checking Modem status.
"Prefix"="COM"
"Index"=dword:1
"Dll"="serial_smdk2440.dll"
"Order"=dword:0
"Priority"=dword:0
"Port"="COM1:"
"DeviceType"=dword:0
"FriendlyName"=LOC_DISPLAYNAME_COM1
"Tsp"="unimodem.dll"
"IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
ENDIF
ENDIF
修改完后要重新sysgen,如果不想sysgen,就把release目录下的project.reg文件中的相应内容也该过来,MAKE就可以了。
6.
a. 到现在我们还没有添加屏幕的驱动程序,我的屏幕是群创的AT070TN83,800*480的七寸TFT屏幕,这个屏的参数可以现在前后台程序中调通。
(1) 修改src/inc/s3c2440a_lcd.h:
#define LCD_XSIZE_TFT (800)
#define LCD_YSIZE_TFT (480)
......
(2) 修改EBoot/main.c中的InitDisplay函数,
s2440LCD->TCONSEL = 0x00; /* Disable LPC3600 mode */
s2440LCD->TPAL = (0x0 << 24); /* Disable temporary palette */
s2440LCD->LCDINTMSK = 0x07;
s2440LCD->LCDCON1 |= 1;
这时候Eboot就可以再屏幕上显示一个乱起八糟的图片了。
OK,我们不要这个图片,先填充一个单色看看,
memset((void *)IMAGE_FRAMEBUFFER_UA_BASE, 0xAA, LCD_ARRAY_SIZE_TFT_16BIT);
显示为粉红色,继续。
7. a. 再回到内核来,调试串口答应出很多烦人的
I2C_IST[2, 2]: ACK NOT received , 我们来删除一些东西吧
删除掉IIC、camera、CS8900、BACKLight、atapi、CF、pccard
从新sysgen,
这时我还修改了LCD驱动程序,主要就是屏的大小:
m_nScreenWidth = 800;
m_nScreenHeight = 480;
m_colorDepth = 16;
m_cxPhysicalScreen = 800;
m_cyPhysicalScreen = 480;
还要删除OAL的init.c的InitDisplay函数中对屏的初始化内容,因为我们已经在Eboot中初始化过了,在该函数中可以对屏幕填充另外一种颜色。
好了,现在应该可以看到桌面了!
9. a. 修改内存分配如下:
;0x8000 0000 - 0x8400 0000 SDRAM SPACE
;
;+-0x8000 0000
;| 130KB 1st PTs
;+-0x8002 0800
;| 2KB ARGS
;+-0x8002 1000
;| 16KB Reserved
;+-0x8002 6000
;| 24KB RAM(Eboot)
;+-0x8002 C000
;| 16KB STACK(Eboot)
;+-0x8003 0000
;| 16KB IRQSTK(Eboot)
;+-0x8003 4000
;| 16KB Reserved
;+-0x8003 8000
;| 256KB Code(Eboot)
;+-0x8007 8000
;| 32KB Reserved
;+-0x8008 0000
;| 132KB BinFS
;+-0x800A 1000
;| 380KB Reserved
;+-0x8010 0000
;| 1MB Display Buffer(NK)
;+-0x8020 0000
;| 30MB Code(NK)
;+-0x8200 0000
;| 32MB RAM(MK)
;+-0x8400 0000
10 a. 可以进入系统,可以通过读写寄存器来查看CPU的运行状况,CPU只跑到299MHZ左右,查看OAL的startup.s中
有对时钟的重新配置,删除掉该段代码,同时要删除common目录下的startup.s中的时钟配置代码,这样只有
Eboot对CPU时钟做配置。
11 a.修改Eboot,增加分区,固定Wince镜像存储区大小,增加图片下载,增加加载进度条等
12 a.修改声卡驱动程序,IIS时钟改用PCLK