SMDK2440 移植

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

 

 

你可能感兴趣的:(c,image,Flash,buffer,hex,WinCE)