返回列表 发帖

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

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

本帖最后由 dglwx 于 2011-6-16 16:47 编辑
# l% ~8 {: [$ d8 |2 V/ b# F本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。mcuos.com) f: ?: i; y2 h" R+ ~
1, H-JTAG烧录bootloader:mcuos.com( e9 ^( S( m5 d

! p+ Q6 P, D7 K: [: o# J嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习, d$ }6 L0 V+ g7 L- j$ r
说明:嵌入式开发联盟: A. F: q$ Z% p# Q+ C, x
附件中图片提到的L200使用的是w90p710,带有8M的Norflash(S29GL064N),如果大家使用其他型号的Flash,请作相应的修改:
# q/ S4 s+ _) l* K8 r( P嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习1, 如果是4M的Norflash,则需将w90p710.hfc中的
$ i* A# M3 s4 ]( I% w" ymcuos.comSetmem+32-Bit+0xFFF01004+0xFE0500846 A+ K' k9 A( ^9 j& q2 K" a* E
改为嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习8 n9 h" L. w7 _. c  R
Setmem+32-Bit+0xFFF01004+0xFE040084. A9 a9 d9 A, Z* w/ u, C
嵌入式开发联盟; E9 X9 e3 x% N, r5 t, Q
另外,在H-Flasher里选择相应的flash.
4 a+ K2 ~# l) a; s5 f7 ^( T( h; f( R- 嵌入式底层驱动开发技术学习网站2 s) d' k# {. o3 A
2,H-JTAG官方的w90p710的配置Norflash的起始地址为0xFF000000,这里我改为了0x7F000000(应该是这个值吧,参考 0xFFF01004(ROM/FLASH(ROMCON) Control Register  )的值的配置。嵌入式开发联盟. h  A- X0 B& C) |5 o
其中的bootloader.bin编译后在这个路径下:WBLv1_1\image\bootloader\little\bootloader.bin
9 F, X# R9 T2 |. m, g- 嵌入式底层驱动开发技术学习网站
/ _: Q. I! L  z3 ~嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习
; |8 `1 X  X( V$ l* e$ ]嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习2.   以前使用ADS烧录的方法参考附件:   嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习% ?6 S6 j0 P5 G1 Q, E8 ~2 V) @
- 嵌入式底层驱动开发技术学习网站9 y+ M* I6 z! Y' q

  ?) U: h! e: ^1 z3 h) }; C- 嵌入式底层驱动开发技术学习网站
5 y% v+ d& n) c) s7 [# i嵌入式开发联盟, u1 d" l1 k4 f+ q6 v- y! Q

% ~2 q& x6 q# P3, 在bootloader里升级bootloader5 m4 |( a& d: |: J, Z2 e
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习" S9 K* E% F- t6 Y; R7 M; s2 S
以前,在bootloader里升级bootloader时,可以使用使用下面两个命令来实现:
* U" \4 s+ p' w( H7 e3 Y! `+ K嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习

1.
  A. @/ b$ }4 W8 N3 Wmcuos.com在bootloader的命令提示符下输入mt 0x8000,该命令用来将ADS编译出来的updater.bin下载到内存的0x8000处:

     bootloader>mt 0x8000

- 嵌入式底层驱动开发技术学习网站+ p  z* |5 ?  q0 M5 x  s


( P* J0 T$ g3 S5 }; s5 f3 _) [6 I本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。

2.- 嵌入式底层驱动开发技术学习网站% N2 L/ j1 R: A. {
在PC windows的命令提示符下使用tftp命令上传updater.bin文件到L200的内存中去:

      winxp_cmd> tftp -i 192.168.1.218 put updater.bin


! c' l* E% I$ T  _: f6 B嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习

3.
2 {8 P& c. t: N4 b. Y嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习使用g命令运行下载下来的updater.bin文件:

     bootloader>g 0x8000

嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习4 l+ u9 W, z% {3 t

4.本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。2 c% ]' B: K- q) c
等updater.bin程序运行一会后,按几下回车键。这时bootloader升级OK。

- 嵌入式底层驱动开发技术学习网站- G5 v; d1 m2 i: s- z
) }# h( o6 j0 @' `4 d- ]
4, 为什么在bootloader里能使用updater.bin来升级bootloader?
* s' y7 J" n# P9 h* i5 }" v' M- 嵌入式底层驱动开发技术学习网站嵌入式开发联盟6 b: {% F$ n( q+ D5 q1 H# |" |. _8 a
以前一直没搞命令updater.bin究竟是怎么回事。最近认真阅读了一下代码才发现,确实设计挺巧妙的:+ k5 @1 w  A0 ~0 M* q

: ~3 ]8 w! T% o我们来看updater/updater.c的main():嵌入式开发联盟% L2 m+ s% m$ O8 D, {. M9 W) J6 N8 I
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。7 b, G9 M9 p9 l

1 ?6 O5 D. E5 m# U* w. P嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习
  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;}
复制代码

. l, G* y0 g; |# [2 g5 c9 amcuos.commcuos.com7 x* n6 F0 Q2 D, A
在上面的源码中我们可以看到,要烧录的文件的起始地址为bin_entry(&bootloader_entry),终止地址为bin_tail(即&bootloader_tail),而文件的大小为: size=(int)((unsigned int)bin_tail-(unsigned int)bin_entry);
& l: L1 {* m4 \! Z: pmcuos.com
8 a$ [' ^2 t" D

1 h) U8 {( I* k$ v' \' Z2 M  P本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。- 嵌入式底层驱动开发技术学习网站9 D+ A# u- C) ]
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。. B" f7 u- @. m+ S, I7 p6 E
我们在使用ADS调试updater.axf时,烧录的文件究竟从哪里来呢?这样,我们跟踪bootloader_entry和bootloader_tail的定义:' }1 f1 x9 e9 F/ l! ]% k& ^
- 嵌入式底层驱动开发技术学习网站0 E* p1 P; q# m' A. D9 T
在updater/bin.s中有如下代码:
% x$ `" }% p& a) V# d% Z% B4 Emcuos.com    EXPORT  bootrom_entry本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。1 ^( w8 ?0 L8 d$ Q3 v" r- W: B
    EXPORT  bootrom_tail嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习4 ]1 o% q, I8 i0 R$ ]) |
    EXPORT  bootloader_entry嵌入式开发联盟$ ?% `* \2 |! M- X* z" ^
    EXPORT  bootloader_tail
1 [; o: k9 O& e, d0 w: F5 r. i, ~6 `5 G9 Y0 g' [, c6 F2 u7 x
    AREA bin_section, CODE, READONLY
& c  n) \5 e" j0 J% v, s嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习bootrom_entry
9 H/ {, i% t7 e# [1 c- 嵌入式底层驱动开发技术学习网站 IF {ENDIAN} = "little"
8 {1 s  N) l9 P! n! W本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。;   INCBIN  ..\WBRv1_1\image\bootrom\little\bootrom.bin- 嵌入式底层驱动开发技术学习网站, m! D5 Q% u  W5 I7 C  D
ELSE
4 o, B; ~9 f9 C1 t2 H- R嵌入式开发联盟;   INCBIN  ..\WBRv1_1\image\bootrom\big\bootrom.bin嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习5 m7 f1 C+ E: j# L0 k3 o
ENDIF
" F8 i0 R* U0 P1 T7 n/ o0 z; h- 嵌入式底层驱动开发技术学习网站bootrom_tail- 嵌入式底层驱动开发技术学习网站# {+ r" W* F. y4 E
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习$ E5 h  q& H) E; f/ g, {
嵌入式开发联盟4 p  y/ j5 H# }1 }3 A
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习& l8 S# R" @- C$ z9 x. A
bootloader_entry
. G5 k  s4 T7 n/ @* S嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习 IF {ENDIAN} = "little"
; a+ z2 c! O4 ?% U8 v0 E7 U, r本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。    INCBIN  ..\WBLv1_1\image\bootloader\little\bootloader.bin: \/ n, x- i2 G; r- ?1 X
;   INCBIN  E:\image\bootloader\little\bootloader.bin嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习. u, o1 ~( u3 v( w, s
ELSE
/ g4 j1 c; H, x+ }3 `8 `+ r. m本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。    INCBIN  ..\WBLv1_1\image\bootloader\big\bootloader.bin
' @+ M4 D: L# U- 嵌入式底层驱动开发技术学习网站;   INCBIN  E:\image\bootloader\big\bootloader.bin
0 P, R. U) ?; k$ }: H- 嵌入式底层驱动开发技术学习网站 ENDIF
2 l" U. s0 V9 S; O6 R本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。bootloader_tail本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。7 Q4 t  N4 W3 I# C! s! k

1 K3 \6 g' k# _嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习
' ^# B! o8 q2 b嵌入式开发联盟- 嵌入式底层驱动开发技术学习网站  e) ^9 \1 m5 u3 W
原来updater.bin是在bin.s中把bootloader.bin包含在自己的image中,并导出bootloader.bin的起始地址和结束地址。然后,在我们在运行updater.bin,并按任意键时,他将bootloader.bin烧录到Norflash的0x7F000000地址上了。
) L, \8 Z) B' {( g& c0 X嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习 if( flash_raw_write(bin_entry, (void *)0x7F000000, size) == 0 )
7 D8 O% z, P  B) V. n本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
  q& G  h- o- t- d! C. V" u- 嵌入式底层驱动开发技术学习网站本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。  s2 j; [# d% K3 J
根据上面的这个分析,也就知道怎么使用H-JTAG烧录w90p710的bootloader了。
附件: 您需要登录才可以下载或查看附件。没有帐号?本站只开放邀请码注册,QQ:82475491,索要邀请码

好帖,置顶!加精!

TOP

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