返回列表 发帖

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

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

本帖最后由 dglwx 于 2011-6-16 16:47 编辑 - 嵌入式底层驱动开发技术学习网站5 Z+ ]  m3 _! U& c

$ T; I. n6 B# X6 r: v1, H-JTAG烧录bootloader:
: f5 {# x2 c  x4 p+ ^( O- 嵌入式底层驱动开发技术学习网站- 嵌入式底层驱动开发技术学习网站: `+ s. @7 T# v  P
mcuos.com( Z# C) [+ {/ Z. T
说明:
/ ]% t7 x- t, p% B, n$ Z嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习附件中图片提到的L200使用的是w90p710,带有8M的Norflash(S29GL064N),如果大家使用其他型号的Flash,请作相应的修改:嵌入式开发联盟) g, y0 i8 Z" a( I7 |9 O2 k
1, 如果是4M的Norflash,则需将w90p710.hfc中的mcuos.com1 m" B1 d" j6 {2 `- c# t* `
Setmem+32-Bit+0xFFF01004+0xFE050084% M& ~8 A# q2 ?# @& L0 b% A4 _$ F
改为- 嵌入式底层驱动开发技术学习网站! ]7 G5 y3 D* U& P) C
Setmem+32-Bit+0xFFF01004+0xFE040084
' V3 i2 [) J# U1 J9 D- y, P$ r- xmcuos.com本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。$ e1 G* y; U* E5 ]1 y& U
另外,在H-Flasher里选择相应的flash.
; [! n' u- S" y9 T% k% ~( V+ O  b: O嵌入式开发联盟嵌入式开发联盟8 F% h* Z) i0 |; c% T" T
2,H-JTAG官方的w90p710的配置Norflash的起始地址为0xFF000000,这里我改为了0x7F000000(应该是这个值吧,参考 0xFFF01004(ROM/FLASH(ROMCON) Control Register  )的值的配置。- 嵌入式底层驱动开发技术学习网站6 v2 j! F9 K" P0 K* _' a
其中的bootloader.bin编译后在这个路径下:WBLv1_1\image\bootloader\little\bootloader.bin  F' F4 A* {! N7 M( p1 h
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。" f7 p: g/ U& E7 J

: V4 w! G! @, Z2.   以前使用ADS烧录的方法参考附件:   本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。, `% T1 ?, P7 E
- 嵌入式底层驱动开发技术学习网站* E9 r$ ^+ _* A- j9 g4 @$ k+ Q6 i

, o5 P' I7 H$ Y/ `嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习- 嵌入式底层驱动开发技术学习网站  }$ I! c# J! s
嵌入式开发联盟/ J1 T2 G  S# T+ P  n# Y

3 c( `! y3 _. W. O) k嵌入式开发联盟3, 在bootloader里升级bootloader
# H& J8 R2 }$ T7 `) A7 F- 嵌入式底层驱动开发技术学习网站1 }8 |) p3 Y  C6 j  {. u; i
以前,在bootloader里升级bootloader时,可以使用使用下面两个命令来实现:- 嵌入式底层驱动开发技术学习网站2 K  }* u. B& r3 h

1.
9 ?( u  h( a1 z5 j" ?+ B# y5 ^嵌入式开发联盟在bootloader的命令提示符下输入mt 0x8000,该命令用来将ADS编译出来的updater.bin下载到内存的0x8000处:

     bootloader>mt 0x8000

- 嵌入式底层驱动开发技术学习网站/ K  E' J' V9 z8 w0 K1 t8 ]# F

嵌入式开发联盟7 T+ h! w6 n* o! X" q8 C

2.
6 M* a1 @$ A0 e( X' B  m" a: |* l嵌入式开发联盟在PC windows的命令提示符下使用tftp命令上传updater.bin文件到L200的内存中去:

      winxp_cmd> tftp -i 192.168.1.218 put updater.bin


+ q) Z1 D2 I) j

3.嵌入式开发联盟$ V1 s. ^7 ?2 }* I) w8 X# c- g
使用g命令运行下载下来的updater.bin文件:

     bootloader>g 0x8000

本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。4 a1 B7 q2 R- F- |  f8 ?( ~8 U

4.
2 I5 d  n4 R. P/ S本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。等updater.bin程序运行一会后,按几下回车键。这时bootloader升级OK。


6 {+ @4 B' w* n3 @
' K2 u# I6 }$ W) P' h) h嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习4, 为什么在bootloader里能使用updater.bin来升级bootloader?- 嵌入式底层驱动开发技术学习网站0 C3 S% z7 o- C! u& {6 a6 L6 n/ {. z3 Y
mcuos.com0 M0 r8 G/ r; X* v# M, \3 \! n
以前一直没搞命令updater.bin究竟是怎么回事。最近认真阅读了一下代码才发现,确实设计挺巧妙的:本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。! |. a, k, t+ {
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。; Z# n, b4 m5 F3 r# n1 t  R) p! E7 |
我们来看updater/updater.c的main():嵌入式开发联盟3 r4 I' o, Z+ f, [( d7 x7 e* o

/ F  x$ Z) l. B0 R/ u& Z0 rmcuos.commcuos.com4 Q$ |) A6 ?; j  j7 U
  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;}
复制代码
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习( p6 z- {$ j& \7 c8 X
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习. X+ C+ O2 @& m: m) N* V
在上面的源码中我们可以看到,要烧录的文件的起始地址为bin_entry(&bootloader_entry),终止地址为bin_tail(即&bootloader_tail),而文件的大小为: size=(int)((unsigned int)bin_tail-(unsigned int)bin_entry);8 u  y+ T9 w8 b# p4 D  E
- 嵌入式底层驱动开发技术学习网站% H+ ^/ S# S& e9 v0 k1 P
# N! x0 O  {, Q) c* r& V
mcuos.com; ]6 n+ O0 Q- ~% M) c

. N. ?2 X, T) H! L0 e% n  D嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习我们在使用ADS调试updater.axf时,烧录的文件究竟从哪里来呢?这样,我们跟踪bootloader_entry和bootloader_tail的定义:
; q* w1 \$ o+ Z2 Omcuos.com嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习- k# `: i& n. Q; D/ ?: L
在updater/bin.s中有如下代码:
8 N( ?4 j( ~8 ^) {& [/ gmcuos.com    EXPORT  bootrom_entry
; c" G2 x0 X6 ]8 S- 嵌入式底层驱动开发技术学习网站    EXPORT  bootrom_tail
% |/ o- X, D6 b" C" J" U    EXPORT  bootloader_entry
9 [$ Q3 N# ~+ _1 o% F+ |) ]6 b嵌入式开发联盟    EXPORT  bootloader_tail
6 O  L. G0 ]. C% t
; ?! m7 \! r: N% u' U' I- 嵌入式底层驱动开发技术学习网站    AREA bin_section, CODE, READONLY嵌入式开发联盟8 V- f+ l% r) {
bootrom_entry- 嵌入式底层驱动开发技术学习网站0 v9 |1 `# s' B
IF {ENDIAN} = "little"
  ^* U3 Z+ P' X, r+ F9 t+ d嵌入式开发联盟;   INCBIN  ..\WBRv1_1\image\bootrom\little\bootrom.bin
: Q) F3 m5 _) R% X( J ELSE6 M! j/ \( k5 j# U; M. M( l
;   INCBIN  ..\WBRv1_1\image\bootrom\big\bootrom.bin
6 D; l/ k3 V7 J4 G9 C* g: e- u嵌入式开发联盟 ENDIF
$ l9 L+ a' A  D) X  v嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习bootrom_tail- 嵌入式底层驱动开发技术学习网站6 [; i2 x( k8 P
嵌入式开发联盟) ~. B7 d. ^: N% y; }6 g

  Q! V. b$ C) S5 m0 U4 t9 ymcuos.com
4 O4 x* g2 t" o. _6 ]mcuos.combootloader_entry
1 i' T  W; [* ?* N3 `. n嵌入式开发联盟 IF {ENDIAN} = "little"
; N$ l- h3 n$ b8 g6 S: a* c0 P嵌入式开发联盟    INCBIN  ..\WBLv1_1\image\bootloader\little\bootloader.bin嵌入式开发联盟' B6 P" E( {' i9 R! N3 Y
;   INCBIN  E:\image\bootloader\little\bootloader.bin
0 D1 s/ i6 c' ]) H嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习 ELSE
! @% N! n- ^5 {4 O8 N$ E$ [- 嵌入式底层驱动开发技术学习网站    INCBIN  ..\WBLv1_1\image\bootloader\big\bootloader.bin
) l- z8 M0 y+ a- N, m( bmcuos.com;   INCBIN  E:\image\bootloader\big\bootloader.bin
9 [, F; O+ |& z嵌入式开发联盟 ENDIF
/ Z5 u4 `+ W: m" Gmcuos.combootloader_tail. a( x/ f* B% y' d; Y: J6 `8 k

9 M5 q2 U' {% M( b: l  J" s本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。# g6 @: ?; S5 [* {9 [
- 嵌入式底层驱动开发技术学习网站! e7 {$ {8 N7 v8 G% W1 I% a
原来updater.bin是在bin.s中把bootloader.bin包含在自己的image中,并导出bootloader.bin的起始地址和结束地址。然后,在我们在运行updater.bin,并按任意键时,他将bootloader.bin烧录到Norflash的0x7F000000地址上了。嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习/ {' Y$ m9 g- y. e2 E* M; E- q  }( s
if( flash_raw_write(bin_entry, (void *)0x7F000000, size) == 0 )
5 w% e  o9 J5 O: y1 U! S嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习3 S/ `: d' D. M3 W# s/ S# }; g! R

( k7 z$ Q5 l* L9 a- 嵌入式底层驱动开发技术学习网站根据上面的这个分析,也就知道怎么使用H-JTAG烧录w90p710的bootloader了。
附件: 您需要登录才可以下载或查看附件。没有帐号?本站只开放邀请码注册,QQ:82475491,索要邀请码

好帖,置顶!加精!

TOP

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