返回列表 发帖

[开发工具] 使用H-JTAG烧录W90P710的bootloader的方法

[开发工具] 使用H-JTAG烧录W90P710的bootloader的方法

本帖最后由 dglwx 于 2011-6-16 16:47 编辑
& I# J) V1 u- F/ O7 K' Mmcuos.com
4 m* a) Q% \. V! U. b本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。1, H-JTAG烧录bootloader:mcuos.com" D. a/ {  ]2 ]' p: K* o. K( T) t

# x0 @1 ~- @/ b0 W+ @  o) j8 O本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
( l9 {4 ?7 ?& j嵌入式开发联盟说明:
2 J* p! }$ ^3 i( p( _嵌入式开发联盟附件中图片提到的L200使用的是w90p710,带有8M的Norflash(S29GL064N),如果大家使用其他型号的Flash,请作相应的修改:mcuos.com  D3 W2 P. H, Z6 J2 b
1, 如果是4M的Norflash,则需将w90p710.hfc中的嵌入式开发联盟, I' Q/ K9 _. l$ \7 x
Setmem+32-Bit+0xFFF01004+0xFE050084
, \- |; }' }1 s6 d改为
$ M  d/ y% h) s. d/ a, Mmcuos.comSetmem+32-Bit+0xFFF01004+0xFE040084& o: _/ C; e$ x

1 j0 s: S5 t' F3 j! z- t0 P$ Q5 {' M- 嵌入式底层驱动开发技术学习网站另外,在H-Flasher里选择相应的flash.嵌入式开发联盟4 w% D' c) d! b' [
- 嵌入式底层驱动开发技术学习网站5 u5 S* N7 c* I/ f, v0 ]. B8 K! Z$ r
2,H-JTAG官方的w90p710的配置Norflash的起始地址为0xFF000000,这里我改为了0x7F000000(应该是这个值吧,参考 0xFFF01004(ROM/FLASH(ROMCON) Control Register  )的值的配置。
7 p% }; v  V- L! d0 F嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习其中的bootloader.bin编译后在这个路径下:WBLv1_1\image\bootloader\little\bootloader.bin
* _1 u+ V# n# c  D; I0 ^$ X4 d嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习mcuos.com8 t) o5 [% C% O1 h
, f" Y/ q, {, A8 T
2.   以前使用ADS烧录的方法参考附件:   - 嵌入式底层驱动开发技术学习网站% |7 D) c: ^6 w) @* ]
! k0 n- D) X2 Z, ]3 E$ b3 b
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。4 Z8 j4 I& Z# v: S* E4 ?' v2 q
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习: D% l7 U) g5 {8 q+ z& ~% i
- 嵌入式底层驱动开发技术学习网站1 w# x  t5 x8 ]9 H2 n' y
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。# `7 [, E, @0 k) c
3, 在bootloader里升级bootloader
' m9 w% S: i9 N7 K本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。- 嵌入式底层驱动开发技术学习网站8 Z, B  e1 ^$ D5 P( v
以前,在bootloader里升级bootloader时,可以使用使用下面两个命令来实现:嵌入式开发联盟, \: D  d% q! i5 |0 A1 d2 D

1.
5 D% Z4 g! t: M本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。在bootloader的命令提示符下输入mt 0x8000,该命令用来将ADS编译出来的updater.bin下载到内存的0x8000处:

     bootloader>mt 0x8000


4 r/ r" V* a- r0 N1 B( R5 [# J/ Z2 e- 嵌入式底层驱动开发技术学习网站

- 嵌入式底层驱动开发技术学习网站8 [9 u; j6 o; Y: @6 x; C

2.嵌入式开发联盟: D0 K8 v) V, h3 Z, M- p# T
在PC windows的命令提示符下使用tftp命令上传updater.bin文件到L200的内存中去:

      winxp_cmd> tftp -i 192.168.1.218 put updater.bin

- 嵌入式底层驱动开发技术学习网站* y( r7 w- s1 ]( ]/ ]) i

3.
" O6 M' R. ~% }5 t本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。使用g命令运行下载下来的updater.bin文件:

     bootloader>g 0x8000


3 B4 \7 d+ u& P0 c6 X* B6 _- 嵌入式底层驱动开发技术学习网站

4.
& ?5 m: C3 a# M, C, S! [6 emcuos.com等updater.bin程序运行一会后,按几下回车键。这时bootloader升级OK。


0 |/ `& ~/ d; {mcuos.com: I# h; N6 V+ g: P: \) z
4, 为什么在bootloader里能使用updater.bin来升级bootloader?mcuos.com, \  n: `9 l- e7 u" w

$ s0 s8 i" H  R4 e3 P$ w- 嵌入式底层驱动开发技术学习网站以前一直没搞命令updater.bin究竟是怎么回事。最近认真阅读了一下代码才发现,确实设计挺巧妙的:
5 O, R3 e1 m- \' k8 t+ L本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
  X* `: q4 J6 ^  ^mcuos.com我们来看updater/updater.c的main():mcuos.com5 _/ t0 W/ Y+ h( w( M" R0 r- H

* N8 g- s8 s9 I; M2 n+ p8 Y+ g嵌入式开发联盟mcuos.com5 @& i8 c4 |9 n) H
  1. int main(){    int size;    void * bin_entry, * bin_tail;#ifdef DEBUG    uprintf("Checksum: 0x%08x\n",cal_checksum((void *)0x8000,16));#endif
  2.     init_serial(0, ARM_BAUD_115200);    PrgInfo();    uprintf("The ROM code version in this update image : \n");    uprintf("\tW90p710 Boot Loader - Version 2.1\n");    uprintf("\n");    // check if boot rom environment    if( ((ROMCON&0xFF000000) == 0xFC000000) && ((int)&bootrom_entry != (int)&bootrom_entry) )    {        // check if the flash in EXTIO3 ? (double check )        if( (EXT3CON&0xFF000000) == 0xFE000000 )        {            uprintf("W90P710 platform is Found\n");            uprintf("WARNING: Re-configure the External I/O 3 to avoid conflict.\n");            EXT3CON=0x0;            uprintf("WARNING: Re-configure the ROMCON to update ROM code.\n");            ROMCON=ROMCON+0x2000000UL;            uprintf("WARNING: W90P710 Boot ROM will be updated!\n");            bin_entry=&bootrom_entry;            bin_tail=&bootrom_tail;        }        else        {            uprintf("ERROR: Unknown board configuraion!\n");            return -1;        }
  3.     }    else // Singel flash environment    {        // check if really the single flash environment (double check)        if( (ROMCON&0xFF000000) == 0xFE000000 )        {            uprintf("W90P710 board is Found\n");            bin_entry=&bootloader_entry;            bin_tail=&bootloader_tail;            uprintf("WARNING: W90P710 Boot Loader will be updated!\n");        }        else        {            uprintf("ERROR: Unknown board configuration!\n");            return -1;        }    }
  4.     uprintf("\n -- Press any key to continue -- \n");    if( ugetchar()=='b' ) // key char given,     {        uprintf("Key character detected! Press key 'r' to update WBR, 'l' to update WBL\n");        switch(ugetchar())        {            case 'r':                uprintf("WARNING: Force to update W90P710 Boot ROM!!\n");                bin_entry=&bootrom_entry;                bin_tail=&bootrom_tail;                break;            case 'l':                uprintf("WARNING: Force to update W90P710 Boot Loader!!\n");                bin_entry=&bootloader_entry;                bin_tail=&bootloader_tail;                break;            default:                break;        }    }    size=(int)((unsigned int)bin_tail-(unsigned int)bin_entry);    if( flash_raw_write(bin_entry, (void *)0x7F000000, size) == 0 )    {        uprintf("ROM code update successed!\n");    }    else    {        uprintf("ROM code update failed!\n");        return -1;    }
  5.     uprintf("\n -- Press any key to reboot -- \n");    ugetchar();    CLKSEL=CLKSEL|0x1;
  6.     while(1); /* Avoid semihosted exit caused error */    return 0;}
复制代码
- 嵌入式底层驱动开发技术学习网站8 h$ f' T6 L0 ?% J: X
  P% h+ S6 Y. v+ C5 `3 k  w$ D
在上面的源码中我们可以看到,要烧录的文件的起始地址为bin_entry(&bootloader_entry),终止地址为bin_tail(即&bootloader_tail),而文件的大小为: size=(int)((unsigned int)bin_tail-(unsigned int)bin_entry);
3 x6 g+ u) T) N1 w  U嵌入式开发联盟
1 O1 P: D- n  T5 {
& @7 w) W: b9 V) _

: \% ^$ T5 e' c. A0 d嵌入式开发联盟
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习4 ]8 V9 k  c! Q/ b6 \1 ]" N
我们在使用ADS调试updater.axf时,烧录的文件究竟从哪里来呢?这样,我们跟踪bootloader_entry和bootloader_tail的定义:
8 o! }* v) C8 @  x8 S嵌入式开发联盟mcuos.com+ F1 Q: s3 \2 |( X3 u6 n2 N
在updater/bin.s中有如下代码:
  e* d; V; H' J嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习    EXPORT  bootrom_entry
* g: N3 j: R! w1 `  _& q& S! Q8 A本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。    EXPORT  bootrom_tail
, U  q4 i& @& S# T8 L" O: Z3 w# u本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。    EXPORT  bootloader_entry
. ?9 S& [% Y4 ]5 J# s: `: j$ v嵌入式开发联盟    EXPORT  bootloader_tail- 嵌入式底层驱动开发技术学习网站' ~6 v4 Z+ @' F% o/ C
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。; V( J$ C' b, J; D- B3 ~1 w6 j
    AREA bin_section, CODE, READONLY
4 q0 T; |6 z0 F. h# W+ N嵌入式开发联盟bootrom_entry
* N" V2 m$ h1 x" d5 i+ J" S& X# l嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习 IF {ENDIAN} = "little"本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。) V( U1 g" G2 C' p1 z5 d# @3 g
;   INCBIN  ..\WBRv1_1\image\bootrom\little\bootrom.bin嵌入式开发联盟: ^6 D0 |1 A; b* ]
ELSEmcuos.com$ Q9 [6 z4 q2 {
;   INCBIN  ..\WBRv1_1\image\bootrom\big\bootrom.bin- 嵌入式底层驱动开发技术学习网站% c% t, _% t- C% Q. x
ENDIF嵌入式开发联盟8 `0 e* D- d9 q, y
bootrom_tail本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。  [- w4 h: O6 R: a$ G6 n1 k
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。/ P, A/ n6 V, b: o% L; |
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。6 k0 H+ q% N4 s/ S7 O9 |6 j. h7 G

( E! L3 e' J; P, ]mcuos.combootloader_entry  g; t  f/ @5 F1 w* Q5 S# ~
IF {ENDIAN} = "little"mcuos.com  _. D/ Q3 O1 L! ?, p
    INCBIN  ..\WBLv1_1\image\bootloader\little\bootloader.bin
) p9 k$ u' U# S% l8 @- 嵌入式底层驱动开发技术学习网站;   INCBIN  E:\image\bootloader\little\bootloader.bin嵌入式开发联盟: T6 {9 d7 b. n
ELSE
' }8 W: H+ K. m8 G; e+ G2 r+ n! _嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习    INCBIN  ..\WBLv1_1\image\bootloader\big\bootloader.bin6 r3 w& O3 y7 M9 I1 i; _
;   INCBIN  E:\image\bootloader\big\bootloader.bin本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。# @4 g. o1 o3 P; Y- t1 i8 t( F* D& H9 u
ENDIF
( O0 B; S- u1 N. s嵌入式开发联盟bootloader_tail
2 P' C2 _, L, e7 s6 d7 D5 u, I本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
: O* P$ O) r+ P) G% D6 G) c% r7 b
: n1 w( h) [# T# ~3 ?) O9 V/ b- 嵌入式底层驱动开发技术学习网站
" h1 N) |! k+ N) ]$ x+ J$ x* _嵌入式开发联盟原来updater.bin是在bin.s中把bootloader.bin包含在自己的image中,并导出bootloader.bin的起始地址和结束地址。然后,在我们在运行updater.bin,并按任意键时,他将bootloader.bin烧录到Norflash的0x7F000000地址上了。本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。* A! o0 o  d9 f0 [' i# x
if( flash_raw_write(bin_entry, (void *)0x7F000000, size) == 0 )- 嵌入式底层驱动开发技术学习网站8 m7 t0 S' c; f- s
嵌入式开发联盟6 o2 s0 z) S1 M! j
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。: T8 F  G* c$ C9 n  ]5 y, \
根据上面的这个分析,也就知道怎么使用H-JTAG烧录w90p710的bootloader了。
附件: 您需要登录才可以下载或查看附件。没有帐号?本站只开放邀请码注册,QQ:82475491,索要邀请码

好帖,置顶!加精!

TOP

返回列表
网页右侧QQ悬浮滚动在线客服
网页右侧QQ悬浮滚动在线客服