4525|6

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教下 pxa270 + Wince5.0 eboot flash 擦写失败问题。。 望大家指教。。。 [复制链接]

板子是自己做的cpu最小开发板,只有CPU+RAM+FLASH。。
CPU是 PXA270, flash芯片是intel的 28F128J3A, 接到 nSC0片选。
内存情况:
      内存:64MByte SDRAM(2片16位的SDRAM芯片组成32位接口)
      NOR Flash:32MByte内存(2片intel 28F128J3A 组成32位接口)
测试BSP是 wince 5.0 提供的:MAINSTONEII

EBOOT.bin 内容是
;******************************************************************************
; TITLE:        EBOOT.BIB
;
; Ethernet Boot Loader Source Module
;
; Memory Map
; ----------
;
; 8000.0000 -+
;            | Bootloader Stack (64KB)
; 8001.0000 -+
;            | Bootloader RAM (64KB)
; 8002.0000 -+
;            | Bootloader Code (256KB)
; 8006.0000 -+
;            | GAP (reserved for future)
; 800F.F000 -+
;            | ARGS (4KB)
; 8010.0000 -+
;            |
;            | OS (NK) Code (48MB)
;            |
; 8310.0000 -+   **auto-size**
;            |
;            | OS (NK) RAM (15MB)
;            |
; 8400.0000 -+
;
;******************************************************************************

MEMORY

;   Name     Start     Size      Type
;   -------  --------  --------  ----
    STACK    80000000  00010000  RESERVED
    RAM      80010000  00010000  RAM
    EBOOT    80020000  00040000  RAMIMAGE
    RSVD     80060000  0009F000  RESERVED
    ARGS     80FF0000  00001000  RESERVED


CONFIG

    AUTOSIZE=OFF
        COMPRESSION=OFF
        PROFILE=OFF
        KERNELFIXUPS=ON
   
        ROMSTART=80020000
        ROMWIDTH=32
        ROMSIZE=00040000

    ; The bootloader is fixed up to run from RAM, but is stored in flash.  ROMOFFSET
    ; adjusts the .bin file record headers to that they lie in flash (this tells the
    ; bootloader already on the device to store the image in flash).
    ROMOFFSET=3C9E0000

MODULES

;   Name    Path                                                    Memory Type
;   ------  ----------------------------------------------          -----------
    nk.exe  $(_TARGETPLATROOT)\target\$(_TGTCPU)\$(WINCEDEBUG)\eboot.exe  EBOOT


MSC0之类的寄存器配置如下:
xlli_CCCR_value      EQU     (0x00000290)  ; Bulverde (HW reset value to start)

; MEMORY CONTROLLER SETTINGS FOR XSBASE270_G
xlli_MDCNFG_value  EQU   (0x00001AC1)   ;SDRAM Config Reg                        0x4800_0000
xlli_MDREFR_value  EQU   (0x0091C01D)        ;SDRAM Refresh Control register                0x4800_0004
xlli_MSC0_value    EQU   (0x243964f0)   ;0x243932C0 Static Memory Control register 0        0x4800_0008
xlli_MSC1_value    EQU   (0x00002661)        ;Static Memory Control register 1        0x4800_000C
xlli_MSC2_value    EQU   (0x3ee97559)        ;Static Memory Control register 2        0x4800_0010
xlli_MECR_value    EQU   (0x00000001)        ;Expansion Memory (PC Card/CompactFlash)
                                        ;Bus Configuration register                0x4800_0014
;                                        reserved                                0x4800_0018       
xlli_SXCNFG_value  EQU   (0x00000000)        ;Syn Static Mem Configuration reg         0x4800_001C
xlli_FLYCNFG_value EQU   (0x00000000)        ;FLYCNFG Fly-by DMA DVAL<1:0> polarities 0x4800_0020
;                                        reserved                                0x4800_0024       
xlli_MCMEM0_value  EQU   (0x00004204)        ;PC Card Interface Common Memory Space
;                                        Socket 0 Timing Configuration register        0x4800_0028
xlli_MCMEM1_value  EQU   (0x00000000)
xlli_MCATT0_value  EQU   (0x00010504)        ;PC Card Interface Attribute Space
;                                        Socket 0 Timing Configuration register        0x4800_0030
xlli_MCATT1_value  EQU   (0x00000000)       
xlli_MCIO0_value   EQU   (0x00008407)        ;PC Card Interface I/O Space Socket 0         0x4800_0038
;                                        Timing Configuration register
xlli_MCIO1_value   EQU   (0x00000000)
xlli_MDMRS_value   EQU   (0x00020002)   ; SDRAM Mode Reg Set Config Reg                0x4800_0040

;xlli_MDMRSLP_value EQU   (0x0000C008)
;xlli_SXCNFG_value  EQU   (0x40044004)   ; Default value at boot up


此帖出自WindowsCE论坛

最新回复

呵呵,虽然这个问题已经是08年的了 但是我还是想问一下楼主 在 *pFlash = 0x00600060; *pFlash = 0x00d000d0; 前面添加 clear status register 后面添加 read status register 指令后就运行通过 也正常擦写。 是怎么个意思, 我也遇到这样的问题了, 我的是两片32MB的norflash,当我擦除的时候,发现,在第一个佛如循环中 for (j = 0; j < num_blocks_to_erase; j++) { EdbgOutputDebugString("INFO: pFlash = %x.\r\n", pFlash); *pFlash = 0x00600060; *pFlash = 0x00d000d0; i = 0; while ((i & 0x00800080) != 0x00800080) { i = *pFlash; } 每次到32MB以后的地址后,i 的值便不是0x0080 0080了,一直没找着原因,希望大侠指点一下,小弟感激不尽!  详情 回复 发表于 2010-12-23 15:04
点赞 关注
 

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

虚拟地址分配如下:
ALIGN
g_oalAddressTable

        DCD     0x80000000, 0xA0000000, 64      ; SDRAM (64MB).
        DCD     0x84000000, 0x5C000000,  1      ; BULVERDE: Internal SRAM (64KB bank 0).
        DCD     0x84100000, 0x58000000,  1      ; BULVERDE: Internal memory PM registers.
        DCD     0x84200000, 0x4C000000,  1      ; BULVERDE: USB host controller.
        DCD     0x84300000, 0x48000000,  1      ; BULVERDE: Memory controller.
        DCD     0x84400000, 0x44000000,  1      ; BULVERDE: LCD controller.
        DCD     0x84500000, 0x40000000, 32      ; BULVERDE: Memory-mapped registers (peripherals).
;        DCD     0x86500000, 0x3C000000, 64      ; BULVERDE: PCMCIA S1 common memory space.
;        DCD     0x8A500000, 0x38000000, 32      ; BULVERDE: PCMCIA S1 attribute memory space.
;        DCD     0x8C500000, 0x30000000, 32      ; BULVERDE: PCMCIA S1 I/O space.
        DCD     0x8E500000, 0x2C000000, 64      ; BULVERDE: PCMCIA S0 common memory space.
        DCD     0x92500000, 0x28000000, 32      ; BULVERDE: PCMCIA S0 attribute memory space.
        DCD     0x94500000, 0x20000000, 32      ; BULVERDE: PCMCIA S0 I/O space.
        DCD     0x96500000, 0xE0000000,  1      ; Zero-bank (in reserved slot - no physical memory required).
        DCD     0x96600000, 0x14000000,  1      ; nCS5: SMSC CS8900A Ethernet controller.
        DCD     0x9A600000, 0x10000000,  1      ; nCS4: USB2.0/IDE controller.
        DCD     0x9A700000, 0x0C000000,  1      ; nCS3:
        DCD     0x9A800000, 0x0A000000,  1      ; nCS2
        DCD     0x9A900000, 0x04000000,  1      ; nCS1:
        DCD     0x86500000, 0x00000000, 32      ; nCS0: Boot Flash (32MB).
;       DCD     0x9F900000, 0x50000000,  1      ; BULVERDE: Camera peripheral interface.
        DCD     0x9FA00000, 0x10200000,  1      ;
        
        DCD     0x00000000, 0x00000000,  0      ; end of table

运行擦写测试结果如下:
UART Init OK!
INFO: DetectFlashDevice: flash type is J3.
INFO: LoadEBootCFG: load default eboot config.

Microsoft Windows CE Ethernet Bootloader Common Library Version 1.1 Built Jul  7
2008 12:31:49
Microsoft Windows CE Ethernet Bootloader 1.7 for the DADI PXA270 Development Pla
tform Built Jul 15 2008

Press [ENTER] to download now or [SPACE] to cancel.

Initiating image download in -1 seconds.

Ethernet Boot Loader Configuration:

0) IP address: 192.168.0.44
1) Subnet mask: 255.255.255.0
2) Boot delay: 5 seconds
3) DHCP: (Disabled)
4) Reset to factory default configuration
5) Download new image at startup
6) Boot device order: SMSC -> CF
7) Program SMSC MAC address
D) Download image now
L) Launch existing flash resident image now
E) FlashErase Test


Enter your selection: e

Enter Erase start address: 0x40000
Enter Erase flash lenght: 0x100

nStartAddr = 0x40000, nLenght = 0x100

INFO: FlashErase flash_start_address=0xA6500000 FlashStart=0xA6540000 , Length=0
x100 .
INFO: FlashErase: num_blocks_to_erase=1.
INFO: pFlash = A6540000.
ERROR: FlashErase: command sequence error ... lower flash.
ERROR: FlashErase: command sequence error ... upper flash.
ERROR: FlashErase: clear lock bits error ... lower flash.
ERROR: FlashErase: clear lock bits error ... upper flash.
ERROR: FlashErase: status register returned 0x00B000B0
ERROR: FlashErase: unrecoverable failure encountered while erasing flash.  Syste
m halted!


此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
擦除函数内容:
BOOL FlashErase(UINT32 FlashStart, UINT32 FlashLength)
{
    UINT32 i,j;
    UINT32 num_blocks;
    UINT32 num_blocks_to_erase;
    UINT32 num_l3_blocks_to_erase = 0;
    UINT32 num_l3_blocks_erased;
    UINT32 flash_start_address = (UINT32) OALPAtoVA(XSBASE270_G_BASE_PA_BOOT_FLASH, FALSE);
    volatile UINT32 *pFlash;
    UINT32 status;
    UINT32 BLOCK_SIZE = (FLASH_SIZE / ERASE_BLOCKS); //256kb/per block

    // Make sure we know what kind of flash part we have.
    //
    EdbgOutputDebugString("INFO: FlashErase flash_start_address=0x%x FlashStart=0x%x , Length=0x%x .\r\n", flash_start_address, FlashStart, FlashLength);
   
    if (g_FlashDeviceType == NONE)
    {
        EdbgOutputDebugString("ERROR: FlashErase: unrecognized flash part.\r\n");
        return(FALSE);
    }

    // Determine the number of blocks to erase.
    num_blocks = (FlashLength / (BLOCK_SIZE));
    if (FlashLength % (BLOCK_SIZE))
    {
        num_blocks++;
    }

    if (num_blocks < 1)
    {
        num_blocks = 1;
        EdbgOutputDebugString("WARNING: FlashErase: calculation error.  Erase blocks = %d\n\r", num_blocks);
    }

    else if (num_blocks > 128)
    {
        num_blocks = 128;
        EdbgOutputDebugString("WARNING: FlashErase: calculation error.  Erase blocks = %d\n\r", num_blocks);
    }

    // If Tyax flash, need to change block count based on if we're in the first 4 blocks
    // as the first 4 blocks are 16KWords (vs. 64KWords/block)
    if ((g_FlashDeviceType == L18) || (g_FlashDeviceType == L30))
    {
        // Is start address within the first 4 blocks.  As there are 2 devices in parallel,
        // are we within the first 128KWords (2 x 64KWords)?  If so, we need to account for
        // increased number of blocks - which is the first 256K of addy range
        if ((FlashStart >= flash_start_address) && (FlashStart < (flash_start_address + 0x40000)))
        {
            // If we're within the first 128K words (256K), we need to treat the block as a special case
            num_l3_blocks_to_erase = 4;
            num_blocks--; // Decrease the num_blocks count, as it assumes the first block is 64K

            // Now add the # of L3 blocks to the # blocks calc.'ed at the beginning to get total
            // # of blocks to erase on a given L3 device INCLUDING the first 4 16kWord blocks
            num_blocks = num_blocks + num_l3_blocks_to_erase;
        }
    }

    pFlash = (volatile UINT32 *)(FlashStart);

    // Issue the clear lock bits and confirm command.
    if (g_FlashDeviceType == J3)
    {
        // For J3 FLASH, unlock all blocks at once with one command
        num_blocks_to_erase = 1;
    }
    else if ((g_FlashDeviceType == K3) || (g_FlashDeviceType == K18)|| (g_FlashDeviceType == L18) || (g_FlashDeviceType == L30)||(g_FlashDeviceType == P30))
    {
        // For K3/K18 FLASH, unlock individual blocks one at a time
        num_blocks_to_erase = num_blocks;
    }

    // For L3, need to set for use within the FOR loop
    num_l3_blocks_erased = num_l3_blocks_to_erase;
   EdbgOutputDebugString("INFO: FlashErase: num_blocks_to_erase=%d.\r\n", num_blocks_to_erase );
    for (j = 0; j < num_blocks_to_erase; j++)
    {
            EdbgOutputDebugString("INFO: pFlash = %x.\r\n", pFlash);
        *pFlash = 0x00600060;
        *pFlash = 0x00d000d0;

        i = 0;
        while ((i & 0x00800080) != 0x00800080)
        {
            i = *pFlash;
        }

        if ((i & 0x00000008) )
            EdbgOutputDebugString("ERROR: FlashErase: voltage range error ... lower flash.\r\n");
        if ((i & 0x00080000) )
            EdbgOutputDebugString("ERROR: FlashErase: voltage range error ... upper flash.\r\n");

        if ((i & 0x00000030) )
            EdbgOutputDebugString("ERROR: FlashErase: command sequence error ... lower flash.\r\n");
        if ((i & 0x00300000) )
            EdbgOutputDebugString("ERROR: FlashErase: command sequence error ... upper flash.\r\n");

        if ((i & 0x00000020) )
            EdbgOutputDebugString("ERROR: FlashErase: clear lock bits error ... lower flash.\r\n");
        if ((i & 0x00200000) )
            EdbgOutputDebugString("ERROR: FlashErase: clear lock bits error ... upper flash.\r\n");

        if (i != 0x00800080)
        {
            EdbgOutputDebugString("ERROR: FlashErase: status register returned 0x%X\r\n", i);
            EdbgOutputDebugString("ERROR: FlashErase: unrecoverable failure encountered while erasing flash.  System halted!\r\n");
            return(FALSE);
        }
}

   //erase部分省略。。。
    return(TRUE);
}

执行到 clear lock bit 就过不去了。返回值是 0x00B000B0 而不是正常的 0x00800080返回值..
可以读取数据,就是clear lock bits 失败,望帮忙看看,谢谢。。

同样的gpio,msc0之类寄存器配置的 uboot是可以正常擦写flash
此帖出自WindowsCE论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
怎么不见:
NK        ********  ********     NANDIMAGE
此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

宇宙尘埃

5
 
Intel的NOR需要有个UNLOCK步骤,然后才可以erase。
你的FLASH START地址打印出来对吗?
怎么没看到UNLOCK的语句? Write(xx, 0x60), Write(xx, 0xD0);这样就UNLOCK所有BLOCK的Lock-Bits了。

Intel的Flash部门已经出售了,现在是Numonyx。这个型号已经不推了,小心后面的供货问题。
此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
问题已经自己解决了。。


        *pFlash = 0x00600060;
        *pFlash = 0x00d000d0;
前面添加 clear status register
后面添加 read status register 指令后就运行通过
也正常擦写。
此帖出自WindowsCE论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

7
 
呵呵,虽然这个问题已经是08年的了 但是我还是想问一下楼主

*pFlash = 0x00600060;
*pFlash = 0x00d000d0;
前面添加 clear status register
后面添加 read status register 指令后就运行通过
也正常擦写。
是怎么个意思, 我也遇到这样的问题了, 我的是两片32MB的norflash,当我擦除的时候,发现,在第一个佛如循环中
for (j = 0; j < num_blocks_to_erase; j++)
{
EdbgOutputDebugString("INFO: pFlash = %x.\r\n", pFlash);
*pFlash = 0x00600060;
*pFlash = 0x00d000d0;

i = 0;
while ((i & 0x00800080) != 0x00800080)
{
i = *pFlash;
}
每次到32MB以后的地址后,i 的值便不是0x0080 0080了,一直没找着原因,希望大侠指点一下,小弟感激不尽!
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表