返回列表 发帖

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

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

本帖最后由 dglwx 于 2011-6-16 16:47 编辑 - 嵌入式底层驱动开发技术学习网站, _: N( x" G+ W2 x

3 J5 q) w8 G, E, v1 j嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习1, H-JTAG烧录bootloader:
  n6 [+ F9 U" D7 Q. ^8 A6 @嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习
- i0 [4 x& H& C: ?2 g" E) }- 嵌入式底层驱动开发技术学习网站0 E% S7 C7 p3 R9 A4 ?
说明:
" B( o' q( R- w( L附件中图片提到的L200使用的是w90p710,带有8M的Norflash(S29GL064N),如果大家使用其他型号的Flash,请作相应的修改:
6 D+ H2 ]0 G) D5 f# ]mcuos.com1, 如果是4M的Norflash,则需将w90p710.hfc中的0 t! ~3 X- P: H
Setmem+32-Bit+0xFFF01004+0xFE050084嵌入式开发联盟% l4 X* |- N% d: S
改为
) E$ P* |3 h: l& A& {1 P嵌入式开发联盟Setmem+32-Bit+0xFFF01004+0xFE040084
7 u' {: Q0 v' m5 R& j& p! {( `mcuos.com
4 y  b" O; n) l- c% |mcuos.com另外,在H-Flasher里选择相应的flash.本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。+ H5 q5 _2 i+ h) U/ F. b6 K

6 _, Y" k# c7 ~# @5 S2,H-JTAG官方的w90p710的配置Norflash的起始地址为0xFF000000,这里我改为了0x7F000000(应该是这个值吧,参考 0xFFF01004(ROM/FLASH(ROMCON) Control Register  )的值的配置。mcuos.com1 d8 M: E- ?0 D& |* M& d1 C) F
其中的bootloader.bin编译后在这个路径下:WBLv1_1\image\bootloader\little\bootloader.bin
6 r" T' H9 B8 W# [8 W9 U- 嵌入式底层驱动开发技术学习网站- 嵌入式底层驱动开发技术学习网站8 b; M. l* Z: Z5 ^0 |8 @

! S" f6 ~" \' U2.   以前使用ADS烧录的方法参考附件:   
4 C6 t8 E* q9 D; h" x* B; K) u8 L4 [9 O

4 l/ l" C; ~! B# f+ L  jmcuos.com
/ n4 V* p. y  g$ W5 {( M) K- 嵌入式底层驱动开发技术学习网站- 嵌入式底层驱动开发技术学习网站4 D0 F" G5 l# o5 X6 c& t, P) I
mcuos.com+ P% |! d5 l* c9 D0 W
3, 在bootloader里升级bootloader
% g+ y* L# a# lmcuos.com嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习2 o: J" U7 Z2 t6 Z, X4 `! {; F
以前,在bootloader里升级bootloader时,可以使用使用下面两个命令来实现:mcuos.com/ @: x* n- X9 j0 X* H9 D5 ^  W2 g

1.本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。# @# d6 P4 u% ?  B% |! `. B7 i" U1 K9 E8 G
在bootloader的命令提示符下输入mt 0x8000,该命令用来将ADS编译出来的updater.bin下载到内存的0x8000处:

     bootloader>mt 0x8000


/ w, a4 X4 b& [mcuos.com


2 v" F# t  g) V2 ~4 u本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。

2.
+ g4 K$ T# z6 |# I  Y+ F嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习在PC windows的命令提示符下使用tftp命令上传updater.bin文件到L200的内存中去:

      winxp_cmd> tftp -i 192.168.1.218 put updater.bin


* T6 e+ f+ |- z0 L$ g嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习

3.
: O( }+ X3 l# B; t/ G" ?8 p2 T本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。使用g命令运行下载下来的updater.bin文件:

     bootloader>g 0x8000


6 q. Z% g! J  @嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习

4.mcuos.com1 b: c+ F3 g$ C! W( V+ Q
等updater.bin程序运行一会后,按几下回车键。这时bootloader升级OK。


: U& u8 H+ E2 M& ^3 U/ N% r. L- 嵌入式底层驱动开发技术学习网站mcuos.com5 ]- g1 u' F4 o5 u2 q# y
4, 为什么在bootloader里能使用updater.bin来升级bootloader?
/ [- o% m) c1 M% Q9 }6 d" H& Jmcuos.com本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。" S& C+ K  k) h0 `. y% n' D- J
以前一直没搞命令updater.bin究竟是怎么回事。最近认真阅读了一下代码才发现,确实设计挺巧妙的:
3 ]* r% P: |3 \  H4 amcuos.com- 嵌入式底层驱动开发技术学习网站5 p% |7 B# p# ~& q) o/ M
我们来看updater/updater.c的main():
9 c5 M$ L$ D! j' Q# q/ \mcuos.com
) o" ^2 i; @* G& Hmcuos.com) I) N' ~# k  r+ e. z  a8 i# y
  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;}
复制代码

% C% R0 r4 E" u" o8 m% M& ]mcuos.com
( G( K5 H, w% B5 ?! w- 嵌入式底层驱动开发技术学习网站在上面的源码中我们可以看到,要烧录的文件的起始地址为bin_entry(&bootloader_entry),终止地址为bin_tail(即&bootloader_tail),而文件的大小为: size=(int)((unsigned int)bin_tail-(unsigned int)bin_entry);本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。) \6 O/ \. N& B3 ~* w; b5 _+ W# ^+ s

3 t' o  l, K; t! j5 G本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
0 j7 I7 \% ?$ q/ \+ l
4 k+ L# l) v8 T1 a
嵌入式开发联盟- u* Q! n5 o: I: C8 S2 R) S
我们在使用ADS调试updater.axf时,烧录的文件究竟从哪里来呢?这样,我们跟踪bootloader_entry和bootloader_tail的定义:- 嵌入式底层驱动开发技术学习网站% d; l2 o/ A/ V2 @! ^) w
嵌入式开发联盟1 \6 t8 S* c8 T* ]( `, G/ D
在updater/bin.s中有如下代码:
, d! d/ \* w' {" B: n* z; e7 ]+ Gmcuos.com    EXPORT  bootrom_entry
3 A6 u% U6 ?4 s& p" ?嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习    EXPORT  bootrom_tail
. M2 Y# k. H/ W8 M% ?1 l- 嵌入式底层驱动开发技术学习网站    EXPORT  bootloader_entry
+ F, X7 Y( O1 W$ h* E) V8 r, ]mcuos.com    EXPORT  bootloader_tail- 嵌入式底层驱动开发技术学习网站; A: W" ]4 u3 c" f4 O6 p& ]

6 ^) K, [" @2 d; P( I. }- hmcuos.com    AREA bin_section, CODE, READONLY
  S( r( N" r: j3 C; z! G0 V嵌入式开发联盟bootrom_entry本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。( T2 x' _* B; }4 @
IF {ENDIAN} = "little"
, U) l# a" g; ^8 W' `/ r) G7 D- 嵌入式底层驱动开发技术学习网站;   INCBIN  ..\WBRv1_1\image\bootrom\little\bootrom.bin) ?+ a9 }) e/ k: x! t
ELSE本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。0 A- v6 [! @3 O* f5 r
;   INCBIN  ..\WBRv1_1\image\bootrom\big\bootrom.bin嵌入式开发联盟  X& Y( B& _3 d# M* C  z: T
ENDIF
7 f; D' z( \$ w) R2 H本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。bootrom_tail
; }; P5 _- P+ H- 嵌入式底层驱动开发技术学习网站
9 O) n1 g9 {; }8 ?9 }  w, Y0 {本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。# ]6 m" I! \/ |! f

4 G0 e/ L  a/ g- G0 D* z; F嵌入式开发联盟bootloader_entry
8 @1 T9 m8 b9 \* R4 ^+ {8 C. \ IF {ENDIAN} = "little"
9 L$ s$ P' [, Z& t# p' X嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习    INCBIN  ..\WBLv1_1\image\bootloader\little\bootloader.bin
- t- Y' \; c3 f) X# x2 w- Dmcuos.com;   INCBIN  E:\image\bootloader\little\bootloader.bin
" E' S  ~  g0 s$ W6 R: T& T- a本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。 ELSE
, R3 Z; v. A2 b5 r; K6 K嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习    INCBIN  ..\WBLv1_1\image\bootloader\big\bootloader.bin- 嵌入式底层驱动开发技术学习网站' M6 o4 I6 W. P* {8 \$ s
;   INCBIN  E:\image\bootloader\big\bootloader.bin本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。* p0 [6 ]2 q: N
ENDIF
9 F4 ?5 ]+ H: g' c8 M6 M6 Qbootloader_tail嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习: p) g9 I$ q0 t: D
- 嵌入式底层驱动开发技术学习网站; b) ?% b' w8 Z- N

  d9 ?6 ?& p& \- |2 r0 O  ]本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
. B9 R' A# Q/ N原来updater.bin是在bin.s中把bootloader.bin包含在自己的image中,并导出bootloader.bin的起始地址和结束地址。然后,在我们在运行updater.bin,并按任意键时,他将bootloader.bin烧录到Norflash的0x7F000000地址上了。
% r* R" [3 b9 S8 ~1 z嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习 if( flash_raw_write(bin_entry, (void *)0x7F000000, size) == 0 )
# t0 |1 s+ A) Y6 R  c& O' u$ ~2 l# m5 p* S! w
- 嵌入式底层驱动开发技术学习网站& a4 @9 g% P( B) n
根据上面的这个分析,也就知道怎么使用H-JTAG烧录w90p710的bootloader了。
附件: 您需要登录才可以下载或查看附件。没有帐号?本站只开放邀请码注册,QQ:82475491,索要邀请码

好帖,置顶!加精!

TOP

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