返回列表 发帖

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

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

本帖最后由 dglwx 于 2011-6-16 16:47 编辑
: J, L3 S' Y$ m, h7 B1 xmcuos.com嵌入式开发联盟7 I# W/ H9 O( t3 m" h
1, H-JTAG烧录bootloader:本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。$ V) J) O6 j( I+ F" j2 R

. S0 ]! D) I8 m' Q/ W4 y% z8 X" r嵌入式开发联盟
$ }) u: d) K6 P& E6 ]说明:
2 U, t# d( f/ [, H  x* Z" N" l嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习附件中图片提到的L200使用的是w90p710,带有8M的Norflash(S29GL064N),如果大家使用其他型号的Flash,请作相应的修改:
  R& x! L7 G% {6 o  X) W本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。1, 如果是4M的Norflash,则需将w90p710.hfc中的
# E: B6 q, b# A+ C- 嵌入式底层驱动开发技术学习网站Setmem+32-Bit+0xFFF01004+0xFE050084
; V7 {9 U, o! B, i2 O3 \6 e3 G本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。改为
9 a/ F) [9 u% O- E; P7 X3 N6 U4 ESetmem+32-Bit+0xFFF01004+0xFE040084
5 B0 ~5 {" r1 O. m- 嵌入式底层驱动开发技术学习网站
- l, h; a  k" k. h; I- 嵌入式底层驱动开发技术学习网站另外,在H-Flasher里选择相应的flash.
; L+ t% Y! D, M# z3 \% M
& J9 k+ ]' c; j8 J$ S嵌入式开发联盟2,H-JTAG官方的w90p710的配置Norflash的起始地址为0xFF000000,这里我改为了0x7F000000(应该是这个值吧,参考 0xFFF01004(ROM/FLASH(ROMCON) Control Register  )的值的配置。/ X# q# J; i6 k, Y7 y4 H; _  I2 d0 c
其中的bootloader.bin编译后在这个路径下:WBLv1_1\image\bootloader\little\bootloader.bin本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。8 o. e4 x3 g% V) v* {

( B5 D: H/ u: ]% \5 Kmcuos.com本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。+ e. Y* K- ~6 b- Q
2.   以前使用ADS烧录的方法参考附件:   
6 Q1 Q: U5 P0 H( zmcuos.com
6 ]2 Q- M7 R8 x  M- 嵌入式底层驱动开发技术学习网站
4 T4 e3 o& }9 F& B, t. |0 y3 e嵌入式开发联盟嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习' `. M, ~8 b4 P. |+ d

4 F2 [2 {- q8 G/ R( B; Zmcuos.com
& f) W' c4 I; b$ [  W; n5 _本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。3, 在bootloader里升级bootloader" P  p, a9 R! Y$ m1 C# w- w5 y) Z
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习9 _0 w* o5 f4 o& q7 t# ]
以前,在bootloader里升级bootloader时,可以使用使用下面两个命令来实现:本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。8 h; B) ]/ I$ b

1.
7 o2 x( e0 x8 K+ ~3 S: a+ N嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习在bootloader的命令提示符下输入mt 0x8000,该命令用来将ADS编译出来的updater.bin下载到内存的0x8000处:

     bootloader>mt 0x8000


; {/ p2 j. U. b0 c1 l9 z嵌入式开发联盟


, f% y, ^6 \1 W! o/ s* t" h- 嵌入式底层驱动开发技术学习网站

2.$ W) n! n/ v4 U& z& h8 C( a
在PC windows的命令提示符下使用tftp命令上传updater.bin文件到L200的内存中去:

      winxp_cmd> tftp -i 192.168.1.218 put updater.bin


7 g  W; h/ C. H- 嵌入式底层驱动开发技术学习网站

3.
/ v6 i' n. i$ f/ O本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。使用g命令运行下载下来的updater.bin文件:

     bootloader>g 0x8000

mcuos.com! U0 P, y5 ]: p5 h: Q5 u) l* |

4.本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。# n3 `8 o1 e( k: @% F4 t- x
等updater.bin程序运行一会后,按几下回车键。这时bootloader升级OK。

: y6 P7 {4 z. \3 m3 i# q
- 嵌入式底层驱动开发技术学习网站. ^& m  Y3 r6 \
4, 为什么在bootloader里能使用updater.bin来升级bootloader?
7 ]# j3 M5 n4 i4 E4 _嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习mcuos.com, Q5 M) t" A+ k8 I
以前一直没搞命令updater.bin究竟是怎么回事。最近认真阅读了一下代码才发现,确实设计挺巧妙的:
$ z$ W, ]) ^  ~: O' R* n- 嵌入式底层驱动开发技术学习网站本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。! z/ Z7 g  H6 V, j
我们来看updater/updater.c的main():
2 z6 L; h% ?0 `/ V, A$ @嵌入式开发联盟
! g- j) }/ x0 @  e$ N9 \- 嵌入式底层驱动开发技术学习网站: q/ f; [5 B2 l3 |2 H3 R
  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  E, l8 v1 [9 j% m" s; @
- 嵌入式底层驱动开发技术学习网站, j4 E, r6 ^8 g# J$ n0 Y0 @( B
在上面的源码中我们可以看到,要烧录的文件的起始地址为bin_entry(&bootloader_entry),终止地址为bin_tail(即&bootloader_tail),而文件的大小为: size=(int)((unsigned int)bin_tail-(unsigned int)bin_entry);
$ e$ v& M! b3 [6 R嵌入式开发联盟
  ^! a, w9 i% y% S; ?嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习
嵌入式开发联盟$ Z4 e$ R* B0 Q& Y( h; |- ^

0 g' L, l1 p9 W5 D* I嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习
; ?1 h% t% w! c7 [& E: Y2 v% M
我们在使用ADS调试updater.axf时,烧录的文件究竟从哪里来呢?这样,我们跟踪bootloader_entry和bootloader_tail的定义:mcuos.com, I; l) J/ B4 c6 S* b6 E
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习- r' F: x2 M. |7 o) x' Z0 l
在updater/bin.s中有如下代码:嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习8 U8 T% y( ~4 J; C
    EXPORT  bootrom_entry- 嵌入式底层驱动开发技术学习网站7 }! T3 c- c$ E0 g6 K: u1 \
    EXPORT  bootrom_tail
) x2 t; j, K1 n; s- 嵌入式底层驱动开发技术学习网站    EXPORT  bootloader_entry嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习9 z2 V: I8 j% l7 |' d' {
    EXPORT  bootloader_tail嵌入式开发联盟1 r- X: l4 u8 X) I' I/ r5 e

8 ~/ ^, F  N+ Y嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习    AREA bin_section, CODE, READONLY嵌入式开发联盟, P* _1 C# D  h
bootrom_entry+ ?- r' h: o1 b3 N$ K/ j
IF {ENDIAN} = "little"
* K# W& K( C2 w5 g9 x1 _mcuos.com;   INCBIN  ..\WBRv1_1\image\bootrom\little\bootrom.bin4 B7 _( o! j' G
ELSE- 嵌入式底层驱动开发技术学习网站" c$ [  A3 m; l: e( R
;   INCBIN  ..\WBRv1_1\image\bootrom\big\bootrom.binmcuos.com  I+ e! J3 z( C
ENDIF; ]8 A+ k( |& W+ X+ u
bootrom_tail
' N  H  B4 R  D2 U本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
1 ]' n/ z" \4 u7 C本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。; j5 P, }7 e8 R$ H9 ~9 E

& L6 s6 c1 c& s( ?  _mcuos.combootloader_entry
% N7 p0 f7 W7 C2 W( M0 {mcuos.com IF {ENDIAN} = "little"
' J' l0 I& q& ^5 x% J7 |本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。    INCBIN  ..\WBLv1_1\image\bootloader\little\bootloader.binmcuos.com- Z5 y5 F; M, z8 b" C1 h# E
;   INCBIN  E:\image\bootloader\little\bootloader.bin嵌入式开发联盟: q) g3 t, |& \% B* b: ~/ R2 `; e- S
ELSE
  L% R; i7 i: d嵌入式开发联盟    INCBIN  ..\WBLv1_1\image\bootloader\big\bootloader.bin本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。# F- Z2 M% V6 e' j- `0 {/ a- z/ Q; g
;   INCBIN  E:\image\bootloader\big\bootloader.bin
' m- l  F0 {7 ]6 N5 x2 z$ v5 D嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习 ENDIF嵌入式开发联盟/ I& i: I# M$ c8 G  V
bootloader_tail嵌入式开发联盟, @7 d9 o: j, _6 {- t

' H4 S8 y; ~8 f4 u! H5 o9 xmcuos.com
1 `* m4 o8 @1 r  r嵌入式开发联盟mcuos.com* W7 \& i% C3 K4 }
原来updater.bin是在bin.s中把bootloader.bin包含在自己的image中,并导出bootloader.bin的起始地址和结束地址。然后,在我们在运行updater.bin,并按任意键时,他将bootloader.bin烧录到Norflash的0x7F000000地址上了。
: X8 ]0 Y! y7 {1 r3 t0 u( G嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习 if( flash_raw_write(bin_entry, (void *)0x7F000000, size) == 0 )嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习# E- n7 T. M$ M3 P+ G
* ?3 g& p( s( f; ~* h7 ?  q) p

/ A% J9 L' Q1 G嵌入式开发联盟根据上面的这个分析,也就知道怎么使用H-JTAG烧录w90p710的bootloader了。
附件: 您需要登录才可以下载或查看附件。没有帐号?本站只开放邀请码注册,QQ:82475491,索要邀请码

好帖,置顶!加精!

TOP

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