打印

紧急求助!W90P950 bootloader的编译设置问题

[复制链接]
3292|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huzixian|  楼主 | 2010-8-18 22:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位爷,指点一二啊!

新做了块W90P950的板子,用于工业实时控制上,不跑Linux操作系统,跑eCOS.仅有USB HOST接口,没有使用 USB HOST/DEVICE接口.

电路板正在调试,出现了一个大问题:
,编译出来的测试文件下载到板上后运行,程序从0x8000开始运行,连续运行不到1秒钟就跑到了0xffff0010处后停下,在AXD的Debug Log中显示: Program terminated normally.
在Disassembly中显示:
ffff0000        [0xea000017]   b        0xffff0064
ffff0004        [0xe59ff018]   ldr      pc,0xffff0024 ; = #0xffff0570
ffff0008        [0xe59ff018]   ldr      pc,0xffff0028 ; = #0xffff05dc
ffff000c        [0xe59ff018]   ldr      pc,0xffff002c ; = #0xffff0570
ffff0010        [0xe59ff018]   ldr      pc,0xffff0030 ; = #0xffff0570
ffff0014        [0x20080905]   andcs    r0,r8,r5,lsl #18
ffff0018        [0xe59ff018]   ldr      pc,0xffff0038 ; = #0xffff0558
ffff001c        [0xe59ff018]   ldr      pc,0xffff003c ; = #0xffff0050

PC指在ffff0010        [0xe59ff018]   ldr      pc,0xffff0030 ; = #0xffff0570上.
所有程序都一样,包括例子程序也是同样的结果.

用AXD透过J-Link接上电路板,可以在memory中修改CPU的各个寄存器.通过修改寄存器的方式手工操作,检查NOR Flash(4MB)和SDRAM(32MB),完全正常,没有发现有问题.
初步怀疑是开发环境的设置上有问题. 相比于W90P710, ADS1.2 的编译环境中除了Processor类型从ARM7TDMI修改成ARM926EJ-S外,还需要修改哪些项目才能让Updater.axf运行正常? 也有可能是启动代码
俺必须重新编译Bootloader,因为俺用的Flash是W19B320BBT,原来的Nuvoton提供的bootloader二进制文件不支持这颗Flash,必须要重新编译才行。郁闷的,Nuvoton自己的程序出厂代码居然不支持自己的Flash芯片。

另外,还有一个很奇怪的现象:CPU reset之后,其内部的寄存器值应该是缺省值,但俺从AXD 的Memory中间插,发现ROMCON、EBICON、SDCONF0/1等都不是W90P950CDG
32-bit Microcontroller Product Data Sheet  V A2版中的缺省值, Why???

相关帖子

沙发
6019赵文| | 2010-8-19 20:26 | 只看该作者
问题问的太罗嗦,没看懂。

使用特权

评论回复
板凳
huzixian|  楼主 | 2010-8-19 22:08 | 只看该作者
根据出错的代码和出错时候寄存器的值来看,出错的原因是向一个不可写的地址写入12个字节的内容:
[0x28a51084]   stmcsia  r5!,{r2,r7,r12}
在这个位置,实际上是没有物理内存的出错的地方是ARM C运行库初始化代码, 这部分代码的主要内容是初始化C运行库的内存环境.
出现这个现象的可能的原因是ADS1.2的编译环境中,如果把processor设为ARM926EJ-S,就认为编译出来的程序在开启了MMU的平台上运行,因此,初始化C 运行库 的时候会有一个假设:MMU必须是已经开启了的。
而实际上,在我编译出来的W90P950代码中,包括bootloader的update工程中,都没有开启MMU的代码。这样问题就出现了。
那么,现在的解决办法是在进入ARM C运行库初始化代码之前,用ASM把MMU打开
有可以参考的代码么?或者提供一个类似W90P710上的init.axf文件?

使用特权

评论回复
地板
xsgy123| | 2010-8-20 12:08 | 只看该作者
只能说问得很想当的乱,楼主能现整理一下你的思路不:dizzy:

使用特权

评论回复
5
nusummit| | 2010-8-24 16:25 | 只看该作者
下面这段code,启动一一对应的MMU!你对照MMU说明文档,应该比较容易能看懂


#define ARM_MMU_FIRST_LEVEL_DESCRIPTOR_ADDRESS(ttb_base, table_index) \
   (unsigned long *)((unsigned long)(ttb_base) + ((table_index) << 2))

#define ARM_FIRST_LEVEL_PAGE_TABLE_SIZE 0x4000

#define ARM_MMU_SECTION(ttb_base, actual_base, virtual_base,              \
                        cacheable, bufferable, perm)                      \
    CYG_MACRO_START                                                       \
        register union ARM_MMU_FIRST_LEVEL_DESCRIPTOR desc;               \
                                                                          \
        desc.word = 0;                                                    \
        desc.section.id = ARM_MMU_FIRST_LEVEL_SECTION_ID;                 \
        desc.section.imp = 1;                                             \
        desc.section.domain = 0;                                          \
        desc.section.c = (cacheable);                                     \
        desc.section.b = (bufferable);                                    \
        desc.section.ap = (perm);                                         \
        desc.section.base_address = (actual_base);                        \
        *ARM_MMU_FIRST_LEVEL_DESCRIPTOR_ADDRESS(ttb_base, (virtual_base)) \
                            = desc.word;                                  \
    CYG_MACRO_END

#define X_ARM_MMU_SECTION(abase,vbase,size,cache,buff,access)      \
    { int i; int j = abase; int k = vbase;                         \
      for (i = size; i > 0 ; i--,j++,k++)                          \
      {                                                            \
        ARM_MMU_SECTION(ttb_base, j, k, cache, buff, access);      \
      }                                                            \
    }
   
#define ARM_MMU_FINE(ttb_base, actual_base, virtual_base)                 \
    CYG_MACRO_START                                                       \
        register union ARM_MMU_FIRST_LEVEL_DESCRIPTOR desc;               \
                                                                          \
        desc.word = 0;                                                    \
        desc.fine.id   = ARM_MMU_FIRST_LEVEL_FINE_ID;                     \
        desc.fine.sbz0 = 0;                                               \
        desc.fine.imp  = 1;                                               \
        desc.fine.domain = 0;                                             \
        desc.fine.sbz1 = 0;                                               \
        desc.fine.base_address = (actual_base);                           \
        *ARM_MMU_FIRST_LEVEL_DESCRIPTOR_ADDRESS(ttb_base, (virtual_base)) \
                            = desc.word;                                  \
    CYG_MACRO_END
   
#define X_ARM_MMU_FINE(abase,vbase,size)                           \
    { int i; int j = abase; int k = vbase;                         \
      for (i = size; i > 0 ; i--,j++,k++)                          \
      {                                                            \
        ARM_MMU_FINE(ttb_base, j, k);                              \
      }                                                            \
    }


void hal_mmu_init(void)
{

    unsigned long ttb_base  = (unsigned long)__TTB_BASE_W55VA91;
    unsigned long page_base = (unsigned long)__MM_PAGE_DESC;
    unsigned long i;
   
        memset((void*)ttb_base, 0, 0x4000);
    // Set the TTB register
    asm volatile ("mcr  p15,0,%0,c2,c0,0" : : "r"(ttb_base) /*:*/);

    // Set the Domain Access Control Register
    i = ARM_ACCESS_TYPE_CLIENT(0)    |
        ARM_ACCESS_TYPE_NO_ACCESS(1)  |
        ARM_ACCESS_TYPE_NO_ACCESS(2)  |
        ARM_ACCESS_TYPE_NO_ACCESS(3)  |
        ARM_ACCESS_TYPE_NO_ACCESS(4)  |
        ARM_ACCESS_TYPE_NO_ACCESS(5)  |
        ARM_ACCESS_TYPE_NO_ACCESS(6)  |
        ARM_ACCESS_TYPE_NO_ACCESS(7)  |
        ARM_ACCESS_TYPE_NO_ACCESS(8)  |
        ARM_ACCESS_TYPE_NO_ACCESS(9)  |
        ARM_ACCESS_TYPE_NO_ACCESS(10) |
        ARM_ACCESS_TYPE_NO_ACCESS(11) |
        ARM_ACCESS_TYPE_NO_ACCESS(12) |
        ARM_ACCESS_TYPE_NO_ACCESS(13) |
        ARM_ACCESS_TYPE_NO_ACCESS(14) |
        ARM_ACCESS_TYPE_NO_ACCESS(15);
    asm volatile ("mcr  p15,0,%0,c3,c0,0" : : "r"(i) /*:*/);

    // First clear all TT entries - ie Set them to Faulting
    //memset((void *)ttb_base, 0, ARM_FIRST_LEVEL_PAGE_TABLE_SIZE);
   
/*                              Actual             Virtual                  Size              Attributes                 Function  */
/*                                        Base               Base                     MB            cached?   buffered?       access permissions                 */

#if 0
    X_ARM_MMU_SECTION(SEC_NON_CACHEABLE_PHYS_ALL,SEC_NON_CACHEABLE_VIRT_ALL,SEC_NON_CACHEABLE_SIZE_ALL,
                                                ARM_UNCACHEABLE,ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); //available all, :-(  because I don't know nor flash access which address
                                                
    X_ARM_MMU_SECTION(SEC_CACHEABLE_SDRAM_PHYS_BASE_0,SEC_CACHEABLE_SDRAM_VIRT_BASE_0,SEC_CACHEABLE_SDRAM_SIZE_0,  
                                                ARM_CACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // cacheable SDRAM 0

    X_ARM_MMU_SECTION(SEC_CACHEABLE_SDRAM_PHYS_BASE_1,SEC_CACHEABLE_SDRAM_VIRT_BASE_1,SEC_CACHEABLE_SDRAM_SIZE_1,  
                                                ARM_CACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // cacheable SDRAM 1

    X_ARM_MMU_SECTION(SEC_CACHEABLE_ROMFLASH_PHYS_BASE,SEC_CACHEABLE_ROMFLASH_VIRT_BASE,SEC_CACHEABLE_ROMFLASH_SIZE,  
                                                ARM_CACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // cacheable ROM/FLASH

    X_ARM_MMU_SECTION(SEC_CACHEABLE_EXTIO_PHYS_BASE,SEC_CACHEABLE_EXTIO_VIRT_BASE,SEC_CACHEABLE_EXTIO_SIZE,  
                                                ARM_CACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // cacheable EXTIO I/O

    //------------------------------------------------------------------------------------------------

    X_ARM_MMU_SECTION(SEC_NON_CACHEABLE_SDRAM_PHYS_BASE_0,SEC_NON_CACHEABLE_SDRAM_VIRT_BASE_0,SEC_NON_CACHEABLE_SDRAM_SIZE_0,  
                                                ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // NON-cacheable SDRAM 0

    X_ARM_MMU_SECTION(SEC_NON_CACHEABLE_SDRAM_PHYS_BASE_1,SEC_NON_CACHEABLE_SDRAM_VIRT_BASE_1,SEC_NON_CACHEABLE_SDRAM_SIZE_1,  
                                                ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // NON-cacheable SDRAM 1

    X_ARM_MMU_SECTION(SEC_NON_CACHEABLE_ROMFLASH_PHYS_BASE,SEC_NON_CACHEABLE_ROMFLASH_VIRT_BASE,SEC_NON_CACHEABLE_ROMFLASH_SIZE,  
                                                ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // NON-cacheable ROM/FLASH

    X_ARM_MMU_SECTION(SEC_NON_CACHEABLE_EXTIO_PHYS_BASE,SEC_NON_CACHEABLE_EXTIO_VIRT_BASE,SEC_NON_CACHEABLE_EXTIO_SIZE,  
                                                ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // NON-cacheable EXTIO I/O

    //--------------------------------------------------------------------------------------------------
                                                
    X_ARM_MMU_SECTION(SEC_LINE_BUF_RAM_PHYS_BASE,SEC_LINE_BUF_RAM_VIRT_BASE,SEC_LINE_BUF_RAM_SIZE,  
                                                ARM_UNCACHEABLE,ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // line buffer RAM
                                                
    //X_ARM_MMU_SECTION(SAT_PALLET_RAM_PHYS_BASE,SAT_PALLET_RAM_VIRT_BASE,SAT_PALLET_RAM_SIZE,  
    //                                            ARM_UNCACHEABLE,ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // SAT or Pallet RAM   
   
    //X_ARM_MMU_SECTION(ONCHIP_RAM_PHYS_BASE,ONCHIP_RAM_VIRT_BASE,ONCHIP_RAM_SIZE,
    //                                            ARM_UNCACHEABLE,ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // on-chip RAM

    X_ARM_MMU_SECTION(SEC_ONCHIP_AHB_PHYS_BASE,SEC_ONCHIP_AHB_VIRT_BASE,SEC_ONCHIP_AHB_SIZE,
                                                ARM_UNCACHEABLE,ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // on-chip AHB
                                                
    X_ARM_MMU_SECTION(SEC_NON_CACHEABLE_NOR0_PHYS_BASE,SEC_NON_CACHEABLE_NOR0_VIRT_BASE,SEC_NON_CACHEABLE_NOR0_SIZE,
                                                ARM_UNCACHEABLE,ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // nor0
    /*                                            
    X_ARM_MMU_SECTION(SEC_NON_CACHEABLE_NOR1_PHYS_BASE,SEC_NON_CACHEABLE_NOR1_VIRT_BASE,SEC_NON_CACHEABLE_NOR1_SIZE,
                                                ARM_UNCACHEABLE,ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // nor1
                                                
    X_ARM_MMU_SECTION(SEC_NON_CACHEABLE_NOR2_PHYS_BASE,SEC_NON_CACHEABLE_NOR2_VIRT_BASE,SEC_NON_CACHEABLE_NOR2_SIZE,
                                                ARM_UNCACHEABLE,ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // nor2    */                                                                                                                                   

    //X_ARM_MMU_SECTION(ONCHIP_APB_PHYS_BASE,ONCHIP_APB_VIRT_BASE,ONCHIP_APB_SIZE,
    //                                            ARM_UNCACHEABLE,ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); // on-chip APB
   
    /*MMU reserved addr space for stack overflow detection*/   
    page_base >>=12;                                          
    X_ARM_MMU_FINE(page_base,SEC_MMU_RESERVED_VIRT_BASE,SEC_MMU_RESERVED_VIRT_SIZE);

#else
        X_ARM_MMU_SECTION(0x0,0x0,0x7FE00000>>20, ARM_CACHEABLE,ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW);//cache region
        X_ARM_MMU_SECTION(0x0,0x80000000>>20,0x7FE00000>>20, ARM_UNCACHEABLE,ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW);//non-cache region
        X_ARM_MMU_SECTION(0xFFE00000>>20,0xFFE00000>>20,0x200000>>20, ARM_UNCACHEABLE,ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW);//non-cache region
#endif
}

使用特权

评论回复
6
yuanruibing| | 2010-11-26 14:49 | 只看该作者
楼上发的东西是我讲过的最多东西的帖子,牛b!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

262

主题

1534

帖子

2

粉丝