返回列表 发帖

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

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

本帖最后由 dglwx 于 2011-6-16 16:47 编辑 嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习) ?2 Z9 r% W7 I* ]# V
5 [7 }/ U" Y6 y  B1 o
1, H-JTAG烧录bootloader:嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习2 W, H  L$ `' C8 N5 l0 _2 r( R
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。; D6 r' x3 Z; G

& T" `5 o9 g! Q) D$ [" i# p- K+ \# o8 ^说明:本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。9 t, Q; x7 R& r9 V% Y
附件中图片提到的L200使用的是w90p710,带有8M的Norflash(S29GL064N),如果大家使用其他型号的Flash,请作相应的修改:嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习/ f2 n% T. K3 x. p
1, 如果是4M的Norflash,则需将w90p710.hfc中的
0 C% t7 ]1 W  F/ ?( S" U5 kSetmem+32-Bit+0xFFF01004+0xFE050084
+ K. u7 A4 S& g+ A" a) X" a- 嵌入式底层驱动开发技术学习网站改为嵌入式开发联盟# n5 U" k  B3 w! ^
Setmem+32-Bit+0xFFF01004+0xFE040084嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习0 G  t/ h; Z9 h+ d8 }& ~
- 嵌入式底层驱动开发技术学习网站& \6 O* A, O" D6 W6 I
另外,在H-Flasher里选择相应的flash.嵌入式开发联盟/ v& e# r( ]% d
mcuos.com( ]) a2 C6 |, ]1 j
2,H-JTAG官方的w90p710的配置Norflash的起始地址为0xFF000000,这里我改为了0x7F000000(应该是这个值吧,参考 0xFFF01004(ROM/FLASH(ROMCON) Control Register  )的值的配置。
( R( p2 E+ V. ~" L! B, T其中的bootloader.bin编译后在这个路径下:WBLv1_1\image\bootloader\little\bootloader.bin
$ v* ]. h0 _2 i+ I1 Y1 c4 Q- y# Zmcuos.com6 f0 q6 c8 a9 _9 [7 A+ N3 L8 w

7 ?# X" p7 }; ]! \( H! I3 V& Zmcuos.com2.   以前使用ADS烧录的方法参考附件:   - 嵌入式底层驱动开发技术学习网站1 T  q* V9 B0 Z0 m) ?* b

  F- z7 j- D4 E! a  N; i+ F嵌入式开发联盟
1 W$ y: K1 ~& ~+ I4 g, |& cmcuos.commcuos.com; C$ c" Y; ~; `0 s# j# C/ ^' ~
mcuos.com. S+ v  @& v1 @

3 {* }' M! e/ u, `9 Q9 ~4 O; S- 嵌入式底层驱动开发技术学习网站3, 在bootloader里升级bootloader嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习7 X' P* U, J! ^" k

% h$ m1 J" g: ?! m0 d嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习以前,在bootloader里升级bootloader时,可以使用使用下面两个命令来实现:嵌入式开发联盟  U% n' m/ N$ [# w* k

1.* D/ s7 s" P. ~& B+ I
在bootloader的命令提示符下输入mt 0x8000,该命令用来将ADS编译出来的updater.bin下载到内存的0x8000处:

     bootloader>mt 0x8000


# a. L5 V+ L" d9 r. Qmcuos.com

本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。. h/ j" t, P" p8 }; E# O. I

2.
% P' h, N4 o9 {' G/ O: i嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习在PC windows的命令提示符下使用tftp命令上传updater.bin文件到L200的内存中去:

      winxp_cmd> tftp -i 192.168.1.218 put updater.bin

嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习8 R; _+ U( E2 A& M: J, ~- Y0 g

3.嵌入式开发联盟; I& c5 Q" |$ o+ [
使用g命令运行下载下来的updater.bin文件:

     bootloader>g 0x8000


% [* T& a! b+ Pmcuos.com

4.
4 v( B& j8 _2 C嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习等updater.bin程序运行一会后,按几下回车键。这时bootloader升级OK。


1 S6 O0 M$ q( s* W$ l- 嵌入式底层驱动开发技术学习网站* n% {% }: l0 v, z
4, 为什么在bootloader里能使用updater.bin来升级bootloader?- 嵌入式底层驱动开发技术学习网站% e* }  B1 t9 O
, ]: O2 o0 m6 {
以前一直没搞命令updater.bin究竟是怎么回事。最近认真阅读了一下代码才发现,确实设计挺巧妙的:- 嵌入式底层驱动开发技术学习网站( h( T+ l0 ~# b% c
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习/ A9 Z- J- f1 \" m3 |  v
我们来看updater/updater.c的main():嵌入式开发联盟! o# Q7 l+ s9 f5 }0 R6 S! {

% I5 A/ {/ n3 M* K% B1 s1 X嵌入式开发联盟mcuos.com& C( g) v. ?) d4 g4 {- s
  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! h) `  _- 嵌入式底层驱动开发技术学习网站
3 d' }9 J7 Q* e在上面的源码中我们可以看到,要烧录的文件的起始地址为bin_entry(&bootloader_entry),终止地址为bin_tail(即&bootloader_tail),而文件的大小为: size=(int)((unsigned int)bin_tail-(unsigned int)bin_entry);
" N& _5 ]- ?: ]' i, j本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。- 嵌入式底层驱动开发技术学习网站( B# ~, z* {( k. H; c- r$ y4 ?
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习" }! O+ o" d' X3 a+ l* [' f

- h  G3 i- g1 H) Hmcuos.com

& v- W  c2 N! L$ _; f3 Y3 B我们在使用ADS调试updater.axf时,烧录的文件究竟从哪里来呢?这样,我们跟踪bootloader_entry和bootloader_tail的定义:
9 l: k! a) j$ C$ T! p/ imcuos.com嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习0 p0 z7 t8 S. Y4 ~( Q2 D, Y& ]) r
在updater/bin.s中有如下代码:
3 d- {2 A" E$ _; B: E' B( ?本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。    EXPORT  bootrom_entrymcuos.com0 L8 r& W" J5 q- U6 f5 L  w" L
    EXPORT  bootrom_tail
  E  ]: @7 v( imcuos.com    EXPORT  bootloader_entry
4 [2 X, S' p, m+ _5 ?    EXPORT  bootloader_tail
# ~  j( e6 j+ a, }9 h9 _本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
5 W9 d' p0 i9 Smcuos.com    AREA bin_section, CODE, READONLY- 嵌入式底层驱动开发技术学习网站3 v4 ~+ L; x# V6 e; u4 V1 k3 {/ B! H
bootrom_entry
" Q8 h3 d8 }8 _1 `4 ]嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习 IF {ENDIAN} = "little"
* w& q* e; {2 w/ P7 a- o本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。;   INCBIN  ..\WBRv1_1\image\bootrom\little\bootrom.binmcuos.com& K) m3 I+ I% `# ?0 q
ELSE2 o- S5 A& T" F, `  g! z% [$ Q
;   INCBIN  ..\WBRv1_1\image\bootrom\big\bootrom.bin
" A0 q2 p* y1 B! t, w3 f( b4 K嵌入式开发联盟 ENDIF- 嵌入式底层驱动开发技术学习网站" f9 E' L9 k9 Q2 m3 F, F7 P* u; U
bootrom_tail嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习2 C0 k# W: V5 s+ F1 a

$ `% r4 o/ O' l7 ~  u  F  e, |嵌入式开发联盟
, |0 u" z& H! B5 Y3 [嵌入式开发联盟本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。6 R9 G  n7 d7 K  r: y1 }
bootloader_entry
* b3 L3 o: O. W$ G本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。 IF {ENDIAN} = "little"
! O4 [' z3 ^4 Z$ f本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。    INCBIN  ..\WBLv1_1\image\bootloader\little\bootloader.bin) t; h5 K8 _- a; x
;   INCBIN  E:\image\bootloader\little\bootloader.bin本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。9 p8 E. H; `' }, U' F( p
ELSE
- q2 Q: I6 y  }# ~' X+ @嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习    INCBIN  ..\WBLv1_1\image\bootloader\big\bootloader.bin本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。3 h- q# |' o0 R+ M: L4 F
;   INCBIN  E:\image\bootloader\big\bootloader.bin
/ e5 s3 h: \# n6 S0 {" K* U嵌入式开发联盟 ENDIF
' U# Z. ?2 X1 E/ b% Z0 Y7 V嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习bootloader_tailmcuos.com# P! l5 C4 }' h) r' _0 Q
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。1 S$ c% ^7 S. {& [9 n
* o9 W, u  ^$ M' Z! u
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。+ d; Y5 M* ]9 n' A( d5 m
原来updater.bin是在bin.s中把bootloader.bin包含在自己的image中,并导出bootloader.bin的起始地址和结束地址。然后,在我们在运行updater.bin,并按任意键时,他将bootloader.bin烧录到Norflash的0x7F000000地址上了。
, i# k0 z6 N' m* b- 嵌入式底层驱动开发技术学习网站 if( flash_raw_write(bin_entry, (void *)0x7F000000, size) == 0 )
0 e. p' q9 z( x  X( x- 嵌入式底层驱动开发技术学习网站2 d# }6 O% B0 U- q$ w" P
, L4 k$ F$ H& q7 E: {6 n- D
根据上面的这个分析,也就知道怎么使用H-JTAG烧录w90p710的bootloader了。
附件: 您需要登录才可以下载或查看附件。没有帐号?本站只开放邀请码注册,QQ:82475491,索要邀请码

好帖,置顶!加精!

TOP

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