QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

热搜: eCos linux goAhead
搜索
发新帖

34

主题

0

听众

242

积分

超级版主

Rank: 8Rank: 8Rank: 8Rank: 8

该用户从未签到

最后登录
2013-1-6
威望
0
金钱
198
贡献
0
注册时间
2012-5-1
积分
242
帖子
39
主题
34
精华
1
UID
2

[网络转贴] mini2440支持ecos3.0

发表于 2012-12-1 23:35:32 |显示全部楼层
更多
本帖最后由 reille 于 2012-12-1 23:43 编辑

由于ecos3.0现在已经支持了smdk2410开发板,往mini2440上移植是非常简单的,基本不用大的改动。经过一个多礼拜阅读ecos的html手册,对ecos有了一个大概的了解。

http://ecos.sourceware.org/getstart.html下载ecos-3.0源码包和arm-eabi-gcc交叉编译包。

安装一个stdc++库:
  1. sudo apt-get install libstdc++5
  2. mkdir -p /opt/ecos
  3. cd /opt/ecos
  4. sudo cp /home/lzd/ecos* .
  5. bunzip2 < ecos-1.3.1.tar.bz2 | tar xvf -
  6. bunzip2 < ecoscentric-gnutools-arm-eabi-20081213-sw.i386linux.tar.bz2 | tar xvf -
复制代码
移植时,先调试redboot,redboot是ecos的一部分,也可以单独使用。把他调试好了,ecos就可以运行在mini2440上了。下面开始移植。

在~/.bashrc中加入下面内容:
  1. PATH=/opt/ecos/ecos-3.0/tools/bin/:$PATH
  2. PATH=/home/lzd/gnutools/arm-eabi/bin/:$PATH
  3. export PATH
  4. export ECOS_REPOSITORY=/opt/ecos/ecos-3.0/packages
  5. export TARGET=smdk2410
  6. export ARCH_DIR=arm
  7. export PLATFORM_DIR=arm9/smdk2410
  8. export REDBOOT_CFG=smdk2410_redboot_ROMRAM
  9. export VERSION=v3_0
复制代码
生成redboot步骤:

1)mkdir /tmp/${REDBOOT_CFG} //随便找个地儿都可以
2)cd /tmp/${REDBOOT_CFG}
3)ecosconfig new ${TARGET} redboot
4)ecosconfig import ${ECOS_REPOSITORY}/hal/${ARCH_DIR}/${PLATFORM_DIR}/${VERSION}/misc/${REDBOOT_CFG}.ecm
5)ecosconfig tree
6)make

which ecosconfig
/opt/ecos/ecos-3.0/tools/bin/ecosconfig
ecosconfig new ${TARGET} redboot
U CYGPKG_HAL_ARM_ARM9_ARM920T, new inferred value 1
U CYGSEM_HAL_USE_ROM_MONITOR, new inferred value 0
U CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK, new inferred value 0

都很顺利,但make的时候出了错误:
  1. /bin/sh: tclsh: not found
复制代码
没有tclsh,这是个什么东西?Tclsh是一个 shell 类应用程序,从它的标准输入或一个文件读 Tcl 命令并对其求值(evaluate)。
  1. sudo apt-get install tcl8.5
复制代码

make 后成功生成了./install/bin下的文件
当然,上面生成的bin文件肯定不适合2440。下面是需要修改的内容:

1. 首先调试vectors.S文件,它位于hal层的arch下面(所有的arm平台都是用的这个启动文件)。有这样一个宏:
  1. reset_vector:
  2.     PLATFORM_SETUP1         // Early stage platform initialization
  3.     // which can set DRAM size at 0x40
  4.     // see <cyg/hal/hal_platform_setup.h>
复制代码
PLATFORM_SETUP1,位置在cyg/hal/hal_platform_setup.h,找到它,因为它有点问题。
在最前面加入:
  1. #elif (CYGNUM_HAL_ARM_SMDK2410_CPU_CLOCK == 400000000) //real value is 400M
  2. #define M_MDIV      92                  // Fin=12.0MHz Fout=200.0MHz,92=0x5c
  3. #define M_PDIV      1
  4. #define M_SDIV      1
复制代码
因为我要用2440的400M cpu,全贴过来吧,好像这里改的最多了。
  1. .macro RAW_LED_MACRO x
  2.         ldr     r0,=GPBDAT
  3.         ldr     r1,[r0]
  4.         bic     r1,r1,#(0xf<<5)
  5.         orr     r1,r1,#((0xf & ~(\x))<<5)
  6.         str     r1, [r0]
  7.         .endm

  8.         // Configure GPF[4:7] as Output & pull-up turned off
  9.         .macro RAW_LED_PORT_INIT_MACRO
  10.         ldr     r0,=GPBUP
  11.         ldr     r1,[r0]
  12.         orr     r1,r1,#((1<<7)|(1<<6)|(1<<5)|(1<<8))
  13.         str     r1,[r0]
  14.         RAW_LED_MACRO 0
  15.         ldr     r0,=GPBCON
  16.         ldr     r1,[r0]
  17.         orr     r1,r1,#((1<<14)|(1<<12)|(1<<10)|(1<<16))
  18.         str     r1,[r0]
  19.         .endm
  20. // This macro represents the initial startup code for the platform        
  21.         .macro _platform_setup1
  22. #ifndef CYG_HAL_STARTUP_RAM
  23.         ldr    r0,=WTCON            // watch dog disable
  24.         ldr    r1,=0x0         
  25.         str    r1,[r0]
  26. #endif
  27.         RAW_LED_PORT_INIT_MACRO
  28. #ifndef CYG_HAL_STARTUP_RAM
  29.         ldr    r0,=INTMSK
  30.         ldr    r1,=0xffffffff       // all interrupt disable
  31.         str    r1,[r0]
  32.         ldr    r0,=INTSUBMSK
  33.         ldr    r1,=0x7ff            // all sub interrupt disable
  34.         str    r1,[r0]
  35.         RAW_LED_MACRO 1
  36.         // Disable and clear caches
  37.         mrc p15,0,r0,c1,c0,0
  38.         bic r0,r0,#0x1000              // disable ICache
  39.         bic r0,r0,#0x000f              // disable DCache, write buffer,
  40.                                         // MMU and alignment faults
  41.         mcr p15,0,r0,c1,c0,0
  42.         nop
  43.         nop
  44.         mov r0,#0
  45.         mcr p15,0,r0,c7,c6,0           // clear data cache
  46. #if 0
  47.         mrc p15,0,r0,c15,c1,0          // disable streaming
  48.         orr r0,r0,#0x80
  49.         mcr p15,0,r0,c15,c1,0
  50. #endif
  51.         // To reduce PLL lock time, adjust the LOCKTIME register.
  52.         ldr    r0,=LOCKTIME
  53.         ldr    r1,=0xffffff
  54.         str    r1,[r0]
  55.         // We must set ratios, set memctl, then change FCLK.
  56.         ldr     r0,=CLKDIVN     // Set ratios 1:4:8 for FCLK:HCLK:PCLK
  57.         ldr     r1,=(5)
  58.         str     r1,[r0]
  59.         // MMU_SetAsyncBusMode //Must select, since we're setting HDIVN=1
  60. #define R1_iA   (1<<31)
  61. #define R1_nF   (1<<30)
  62.         mrc     p15,0,r0,c1,c0,0
  63.         orr     r0,r0,#(R1_nF|R1_iA)
  64.         mcr     p15,0,r0,c1,c0,0

  65.         // Set memory control registers
  66.         adr    r0,1f
  67.         ldr    r1,=BWSCON           // BWSCON Address
  68.         add    r2, r0, #52          // End address of SMRDATA
  69. 0:
  70.         ldr    r3, [r0], #4   
  71.         str    r3, [r1], #4   
  72.         cmp    r2, r0        
  73.         bne    0b
  74.         b      2f
  75. 1:
  76. // Memory configuration should be optimized for best performance
  77. // The following parameter is not optimized.                     
  78. // Memory access cycle parameter strategy
  79. // 1) The memory settings is safe parameters even at HCLK=75Mhz.
  80. // 2) SDRAM refresh period is for HCLK=75Mhz.
  81.         .long (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
  82.         .long ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))   //GCS0
  83.         .long ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))   //GCS1
  84.         .long ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))   //GCS2
  85.         .long ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))   //GCS3
  86.         .long ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))   //GCS4
  87.         .long ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))   //GCS5
  88.         .long ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    //GCS6
  89.         .long ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))    //GCS7
  90.         .long ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)   
  91.         .long 0x32                    // SCLK power saving mode, BANKSIZE 128M/128M
  92.         .long 0x30                    // MRSR6 CL=3clk
  93.         .long 0x30                    // MRSR7
  94. //        .long 0x20                    // MRSR6 CL=2clk
  95. //        .long 0x20                    // MRSR7
  96. 2:
  97.         RAW_LED_MACRO 2
  98.         // Configure MPLL
  99.         ldr    r0,=MPLLCON         
  100.         ldr    r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) // Fin=12MHz,Fout=50MHz
  101.         str    r1,[r0]
  102.     //we need sometimes to get ready
  103.     nop
  104.     nop
  105.     nop
  106.     nop
  107.     nop
  108.     nop
  109.     nop
  110.     nop
  111.     nop
  112.     nop
  113.     nop
  114.     nop
  115.     nop
  116.     nop
  117.     nop
  118.     nop
  119.     nop
  120.     nop
  121.     nop
  122.     nop
  123.     nop
  124.     nop
  125.     nop
  126.     nop
  127. #endif /* !CYG_HAL_STARTUP_RAM */
  128.         // Set up a stack [for calling C code]
  129.         ldr     r1,=__startup_stack
  130.         ldr     r2,=SMDK2410_SDRAM_PHYS_BASE
  131.         orr     sp,r1,r2
  132.         // Create MMU tables
  133.         RAW_LED_MACRO 3
  134.         bl      hal_mmu_init
  135.         RAW_LED_MACRO 4
  136.         // Enable MMU
  137.         ldr     r2,=10f
  138. #ifdef CYG_HAL_STARTUP_ROMRAM
  139.         ldr     r1,=__exception_handlers
  140.         ldr r9,=0x80000000
  141.         sub     r1,r2,r1
  142.         add     r2,r9,r1        // r9 has ROM offset
  143. #endif        
  144.         ldr        r1,=MMU_Control_Init|MMU_Control_M
  145.         mcr        MMU_CP,0,r1,MMU_Control,c0
  146.         mov        pc,r2    /* Change address spaces */
  147.         nop
  148.         nop
  149.         nop
  150. 10:
  151.         RAW_LED_MACRO 5 //here still in flash
  152.         
  153. #ifdef CYG_HAL_STARTUP_ROMRAM
  154.         mov     r0,r9                     // Relocate FLASH/ROM to RAM
  155.         ldr     r1,=__exception_handlers // ram base & length
  156.         ldr     r2,=__rom_data_end
  157. 20:     ldr     r3,[r0],#4
  158.         str     r3,[r1],#4
  159.         cmp     r1,r2
  160.         bne     20b
  161.         ldr     r0,=30f
  162.         mov     pc,r0 //here wo in the ram space now ^_^
  163.         nop
  164.         nop
  165.         nop
  166.         nop
  167. 30:            
  168. #endif
  169.         RAW_LED_MACRO 6
  170.         .endm
  171.         
  172. #else // defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
  173. #define PLATFORM_SETUP1
  174. #endif
复制代码
主要是sdram的正确配置,led的点亮,cpu频率的正确配置。其他部分没有问题。

修改smdk2410_misc.c文件:
  1. //dont touch my gpb port,leds reley on it
  2.     //HAL_WRITE_UINT32(GPBCON, 0x044555);
  3.     //HAL_WRITE_UINT32(GPBUP, 0x7ff);      // The pull up function is disabled GPB[10:0]
复制代码
注释掉上面两句,因为在cyg_start的调试过程中会用到led(因为那时候串口乱码,得分析原因)

如果现在你把redboot镜像烧到nor的话,串口会乱码。
修改hal_dial.c,因为现在的pclk用的400/8=50M hz。
  1. //UART baud divider register
  2.     HAL_WRITE_UINT32(base+OFS_UBRDIV, (cyg_uint32)((FCLK/8)/(16*CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD))-1);
复制代码
好了,编译一下,串口就通了,是默认的38400 8N1 哦。

现在让redboot支持sst39vf1601,因为smdk2410的flash是amd的,需要手术。
修改ecos.db这个数据库:
  1. target smdk2410 {
  2.         alias { "Samsung ARM9/SMDK2410 development board" s3c2410x }
  3.         packages { CYGPKG_HAL_ARM
  4.                    CYGPKG_HAL_ARM_ARM9
  5.                    CYGPKG_HAL_ARM_ARM9_SMDK2410
  6.                    CYGPKG_IO_SERIAL_ARM_SMDK2410
  7.                    CYGPKG_DEVS_FLASH_ARM_SMDK2410
  8.                    CYGPKG_DEVS_FLASH_AMD_AM29XXXXX
  9.         }
  10.         description "
  11.         The SMDK2410 target provides the packages needed to run eCos on
  12.         Samsung S3c2410x (ARM920T) based development boards (SMDK2410)."
  13. }
  14. to something like this:
  15. target smdk2410 {
  16.         alias { "Samsung ARM9/SMDK2410 development board" s3c2410x }
  17.         packages { CYGPKG_HAL_ARM
  18.                    CYGPKG_HAL_ARM_ARM9
  19.                    CYGPKG_HAL_ARM_ARM9_SMDK2410
  20.                    CYGPKG_IO_SERIAL_ARM_SMDK2410
  21.                    CYGPKG_DEVS_FLASH_ARM_SMDK2410
  22.                    CYGPKG_DEVS_FLASH_SST_39VFXXX (这里变了)
  23.         }
  24.         description "
  25.         The SMDK2410 target provides the packages needed to run eCos on
  26.         Samsung S3c2410x (ARM920T) based development boards (SMDK2410)."
  27. }
复制代码
然后修改CYGPKG_DEVS_FLASH_ARM_SMDK2410这个包的cdl描述:
  1. cdl_package CYGPKG_DEVS_FLASH_ARM_SMDK2410 {
  2.     display       "FLASH support for Samsung S3c2410x based boards"
  3.     description   "FLASH memory device support for Samsung S3c2410x based
  4.                    development boards"
  5.     parent        CYGPKG_IO_FLASH
  6.     active_if     CYGPKG_IO_FLASH
  7.     requires      CYGPKG_HAL_ARM_ARM9_SMDK2410
  8.     compile       -library=libextras.a smdk2410_flash.c 这里很重要,不然你的flash驱动不会被编译到redboot中。
  9.     # Arguably this should do in the generic package
  10.     # but then there is a logic loop so you can never enable it.
  11.     cdl_interface CYGINT_DEVS_FLASH_SST_39VFXXX_REQUIRED {
  12.         display   "Generic SST SSTVF1601 driver required"
  13.     }
  14.     implements    CYGINT_DEVS_FLASH_SST_39VFXXX_REQUIRED
  15. }
  16. CYGPKG_DEVS_FLASH_SST_39VFXXX这个cdl描述不用动
  17. cdl_package CYGPKG_DEVS_FLASH_SST_39VFXXX {
  18.     display       "SST 39VFXXX FLASH memory support"
  19.     description   "FLASH memory device support for SST 39VFXXX"
  20.     parent        CYGPKG_IO_FLASH
  21.     active_if      CYGPKG_IO_FLASH
  22.     active_if     CYGINT_DEVS_FLASH_SST_39VFXXX_REQUIRED
  23.     implements    CYGHWR_IO_FLASH_DEVICE
  24.     implements    CYGHWR_IO_FLASH_DEVICE_NEEDS_CACHE_HANDLED
  25.     include_dir   cyg/io
  26. }
  27. 在/dev/flash/arm/smdk2410中,修改驱动文件。修改后像这样
  28. // Device properties
  29. #include <pkgconf/devs_flash_sst_39vfxxx.h>
  30. #define CYGPKG_DEVS_FLASH_SST_39VF1601
  31. // A AMD29LV800BB is equipped with the SMDK2410 platform.
  32. #define CYGNUM_FLASH_INTERLEAVE (1)
  33. #define CYGNUM_FLASH_SERIES     (1)
  34. #define CYGNUM_FLASH_WIDTH      (16)
  35. #define CYGNUM_FLASH_BASE       (0x80000000u)
  36. // #define CYGHWR_FLASH_AM29XXXXX_NO_WRITE_PROTECT
  37. //--------------------------------------------------------------------------
  38. // Now include the driver code
  39. #include "cyg/io/flash_sst_39vfxxx.inl"
  40. static const cyg_flash_block_info_t cyg_flash_sst_block_info[1] = {
  41.     { FLASH_BLOCK_SIZE, FLASH_NUM_REGIONS * CYGNUM_FLASH_SERIES }
  42. };
  43. CYG_FLASH_DRIVER(cyg_flash_sst_flashdev,
  44.                  &cyg_sst_funs,
  45.                  0,                     // Flags
  46.                  CYGNUM_FLASH_BASE,     // Start
  47.                  CYGNUM_FLASH_BASE + (FLASH_BLOCK_SIZE * FLASH_NUM_REGIONS * CYGNUM_FLASH_SERIES) - 1,    // End
  48.                  1,                     // Number of block infos
  49.                  cyg_flash_sst_block_info,
  50.                  NULL                   // priv
  51.     );
  52. // ------------------------------------------------------------------------
  53. // EOF smdk2410_flash.c
复制代码
这样就支持nor了,可以用fis erase等命令写数据到nor。
redboot到这里就算完毕了,如果想支持网络功能,回头在研究了。

现在来生成ecos内核。
生成ecos内核(也就是libtartet.a库),现在这个阶段,这个是给monitor(redboot)调试用的。
  1. //ecosconfig new <target>
  2. ecosconfig new ${TARGET}
  3. ecosconfig tree
  4. ecosconfig check
  5. ecosconfig resolve
  6. make
  7. make tests
复制代码
下面调试的代码是在example目录里的hello.c程序。
  1. file hello
  2. hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
  3. 就是一个elf格式的文件a
  4. arm-eabi-gdb -b 38400 -nw hello
  5. GNU gdb (eCosCentric GNU tools 4.3.2-sw) 6.8.50.20080706
  6. Copyright (C) 2008 Free Software Foundation, Inc.

  7. For bug reporting instructions, please see:
  8. <http://bugs.ecos.sourceware.org/>...
  9. (gdb) target remote /dev/ttyS0
  10. Remote debugging using /dev/ttyS0
  11. 0x0000d524 in ?? ()
  12. (gdb) load
  13. Loading section .rom_vectors, size 0x40 lma 0x40000
  14. Loading section .text, size 0x74cc lma 0x40040
  15. Loading section .rodata, size 0x2d4 lma 0x4750c
  16. Loading section .data, size 0x300 lma 0x477e0
  17. Start address 0x40040, load size 31456
  18. Transfer rate: 3 KB/sec, 305 bytes/write.
  19. (gdb) continue
  20. Continuing.
  21. Hello, eCos world!
  22. Program received signal SIGINT, Interrupt.
  23. [Switching to Thread 2]
  24. 0x00010f2c in ?? ()
  25. (gdb)
复制代码
如果你用objdump去看上面的hello.c的话,会发现他的起始地址是0x00040000,而这个地址是在redboot经过mmu重映射之后的可用sdram空间。
也就是用于gdb调试用的,而且不包含redboot已经完成的启动代码部分,也就是没有连接vectors.S。

现在来生成ecos内核(也就是libtartet.a库),这个是给发布用的应用程序用的。
  1. //ecosconfig new <target>
  2. ecosconfig new ${TARGET}
复制代码
在这里修改ecos.ecc文件,查找CYG_HAL_STARTUP,把他的数值改成ROMRAM方式:
  1. # >
  2. # Startup type
  3. # When targetting the SMDK2410 evaluation board it is possible to build
  4. # the system for either RAM bootstrap or ROM bootstrap(s). Select
  5. # 'ram' when building programs to load into RAM using eCos GDB stubs.
  6. # Select 'rom' when building a stand-alone application which will be
  7. # put into ROM, or for the special case of building the eCos GDB stubs
  8. # themselves.
  9. #
  10. cdl_component CYG_HAL_STARTUP {
  11.     # Flavor: data
  12.     user_value ROMRAM
  13.     # value_source user
复制代码
这样,重修编译这个libtarget.a库:
  1. ecosconfig tree
  2. ecosconfig check
  3. ecosconfig resolve
  4. make
  5. make tests
复制代码
编译ecos3.0的example目录的文件:
  1. arm-eabi-objcopy -O binary -S twothreads twothreads.bin
复制代码
烧到sst39vf1601中,会有下面的内容:

Press CTRL-A Z for help on special keys                    
                                                                          
Entering twothreads' cyg_user_start() function                           
Beginning execution; thread data is 0                                    
Beginning execution; thread data is 1                                    
Thread 0: and now a delay of 239 clock ticks                              
Thread 1: and now a delay of 230 clock ticks                              
Thread 1: and now a delay of 221 clock ticks                              
Thread 0: and now a delay of 214 clock ticks                              
Thread 1: and now a delay of 224 clock ticks                              
Thread 0: and now a delay of 243 clock ticks
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

无觅相关文章插件

申请友链|手机版|关于本站|eCos技术网 ( 粤ICP备12094833号-1 )   

GMT+8, 2013-1-7 04:17 , Processed in 0.071343 second(s), 34 queries .

Powered by Discuz!2.5 X2.5

© 2001-2012 Comsenz Inc.

回顶部