返回列表 发帖

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

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

本帖最后由 dglwx 于 2011-6-16 16:47 编辑 mcuos.com8 o, U( l8 H3 q# s4 F

4 C) r0 P; i" S5 z9 I; Y- C嵌入式开发联盟1, H-JTAG烧录bootloader:本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。9 k# z) }& u; d: w

) `* B4 u7 j3 `9 S4 b嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习' ]- |& i1 l" C1 [8 }8 e4 _
说明:
1 m' c* ^! K. a: i嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习附件中图片提到的L200使用的是w90p710,带有8M的Norflash(S29GL064N),如果大家使用其他型号的Flash,请作相应的修改:
) D: Y2 b2 z2 B% J. ^, H2 C本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。1, 如果是4M的Norflash,则需将w90p710.hfc中的
2 [, |7 d( j- ?+ l: C8 d嵌入式开发联盟Setmem+32-Bit+0xFFF01004+0xFE050084嵌入式开发联盟- `1 ]$ x( \% w$ f2 ?
改为
) [2 |1 E2 @3 E/ A3 M3 x& T- 嵌入式底层驱动开发技术学习网站Setmem+32-Bit+0xFFF01004+0xFE040084嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习$ e+ W& O% p+ u- D1 `( W7 q+ I0 y

% y2 R1 t0 l: j6 O" @) |# [- 嵌入式底层驱动开发技术学习网站另外,在H-Flasher里选择相应的flash.
% C7 n' }/ @% l# a嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。& F- O1 _; s1 F& y5 u0 k
2,H-JTAG官方的w90p710的配置Norflash的起始地址为0xFF000000,这里我改为了0x7F000000(应该是这个值吧,参考 0xFFF01004(ROM/FLASH(ROMCON) Control Register  )的值的配置。mcuos.com6 L! L4 C9 b7 f; P. r) y6 |8 `+ g8 i
其中的bootloader.bin编译后在这个路径下:WBLv1_1\image\bootloader\little\bootloader.bin
8 G8 j3 x( \7 y/ ]/ r本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。0 }) A8 |9 o9 X" Y9 W
) ~4 {4 C  F% a. @6 X
2.   以前使用ADS烧录的方法参考附件:   嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习' N) W8 a. W# Y  X$ `8 [) F
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。# k, [. C7 c. |: K) O5 L. A

# H% Q- @$ D1 N1 ]6 `; _本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
# O" W* U0 T1 R. G, k9 s$ g嵌入式开发联盟mcuos.com& h* w8 X4 z5 x
- 嵌入式底层驱动开发技术学习网站3 D" [- s1 h5 u$ B; C
3, 在bootloader里升级bootloader- 嵌入式底层驱动开发技术学习网站( f# |. e% g- P+ {

: X) ^; K/ F: v1 E, U/ Y4 h. Mmcuos.com以前,在bootloader里升级bootloader时,可以使用使用下面两个命令来实现:mcuos.com- @; V2 }. n6 z4 [1 k$ @. Z- r

1.嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习1 W0 f% n# G% Y2 H
在bootloader的命令提示符下输入mt 0x8000,该命令用来将ADS编译出来的updater.bin下载到内存的0x8000处:

     bootloader>mt 0x8000

嵌入式开发联盟9 z5 |8 G8 @. w$ P

嵌入式开发联盟0 E- m" h! M" `: h

2.
, A5 p8 d  s( G4 h7 I* e2 W! }在PC windows的命令提示符下使用tftp命令上传updater.bin文件到L200的内存中去:

      winxp_cmd> tftp -i 192.168.1.218 put updater.bin


; v( H( W3 g) A( w& S- 嵌入式底层驱动开发技术学习网站

3.嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习, K' V4 M4 e) u; B& f$ I- V# J
使用g命令运行下载下来的updater.bin文件:

     bootloader>g 0x8000


8 u0 E& U, B# n+ w  ?- p- 嵌入式底层驱动开发技术学习网站

4.本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。% z$ p, {7 f2 u# e
等updater.bin程序运行一会后,按几下回车键。这时bootloader升级OK。


4 O+ o% z- p) r- t4 t$ L$ T6 B嵌入式开发联盟
' z. m$ t6 M. f) p' k$ N3 N  [本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。4, 为什么在bootloader里能使用updater.bin来升级bootloader?- 嵌入式底层驱动开发技术学习网站$ u" P: N: q, o9 p& \0 p
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习' m4 F9 w! V3 K: {0 S! A
以前一直没搞命令updater.bin究竟是怎么回事。最近认真阅读了一下代码才发现,确实设计挺巧妙的:
- p2 W9 \  Z! \( P6 emcuos.com- 嵌入式底层驱动开发技术学习网站1 L- i8 Y1 a' P) a4 ^3 @
我们来看updater/updater.c的main():- 嵌入式底层驱动开发技术学习网站5 S" f# c3 o" @. J% L# t- s' T

  G( ?! Q: g$ i本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
3 s; f' g/ \8 S  g. o, D1 W嵌入式开发联盟
  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;}
复制代码

+ a) e, e; Z1 ~2 r) x本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。嵌入式开发联盟: R, L9 ]/ p$ Q+ v) b
在上面的源码中我们可以看到,要烧录的文件的起始地址为bin_entry(&bootloader_entry),终止地址为bin_tail(即&bootloader_tail),而文件的大小为: size=(int)((unsigned int)bin_tail-(unsigned int)bin_entry);9 w5 d; a$ G# z- ^  X
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。" j2 q( U4 K  S

- k; W) L3 B0 M" s. Z2 R本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
+ u0 {5 b- q! ]1 \4 \/ S4 s; Z7 Ymcuos.com
mcuos.com( r: s) n2 A% q" j
我们在使用ADS调试updater.axf时,烧录的文件究竟从哪里来呢?这样,我们跟踪bootloader_entry和bootloader_tail的定义:
& G9 _& b6 }$ k2 x嵌入式开发联盟- 嵌入式底层驱动开发技术学习网站# }+ m4 q1 C0 V
在updater/bin.s中有如下代码:嵌入式开发联盟* u0 J$ ]0 c. ]0 ~# D5 q; O
    EXPORT  bootrom_entry
% d- l% k" s& b6 h/ m+ Z) R% o, X- 嵌入式底层驱动开发技术学习网站    EXPORT  bootrom_tail- 嵌入式底层驱动开发技术学习网站* L4 R3 t. q2 F* l  @
    EXPORT  bootloader_entry本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。- Z- O. Z9 e  y6 T
    EXPORT  bootloader_tail嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习/ Z) X* p' A% r

; S) R$ ]. ^2 @* ~+ K0 h- 嵌入式底层驱动开发技术学习网站    AREA bin_section, CODE, READONLY
: J' d  h4 i: Q6 s: m& F0 Xmcuos.combootrom_entry嵌入式开发联盟4 A/ C! i/ q0 j. r' u8 A
IF {ENDIAN} = "little"
/ a/ |# l+ A  a7 Q1 ~; e' i1 m( e- U- 嵌入式底层驱动开发技术学习网站;   INCBIN  ..\WBRv1_1\image\bootrom\little\bootrom.bin嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习. i3 h. z" ^* z' T/ J; f
ELSEmcuos.com7 e8 h0 X. p/ r* G0 ]
;   INCBIN  ..\WBRv1_1\image\bootrom\big\bootrom.binmcuos.com4 W8 P- P8 F0 _1 g+ E3 C* \) u; O4 l
ENDIF
6 |. K3 c. z6 a5 _- o8 l0 G6 wbootrom_tail
+ T: B* o+ e& G- H" A嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习6 l" S5 o/ E8 L  |2 R

8 C, m/ k; [. _# |; h+ `, X嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习% E6 k2 A- d, L: i
bootloader_entry
# u, s' N- S+ F: D/ }0 _mcuos.com IF {ENDIAN} = "little"嵌入式开发联盟; r1 L( p% I  j! d" [1 T  R# ^9 |
    INCBIN  ..\WBLv1_1\image\bootloader\little\bootloader.bin
+ M8 {! Q' ~, a1 y; _;   INCBIN  E:\image\bootloader\little\bootloader.bin
8 X6 J8 ]. o1 ]/ Z3 H, C9 ?5 g" G# x嵌入式开发联盟 ELSE" w" i" n7 u7 s: {' y
    INCBIN  ..\WBLv1_1\image\bootloader\big\bootloader.bin
" c( f& b7 P4 R) j/ ^9 g;   INCBIN  E:\image\bootloader\big\bootloader.bin
& j1 t% \1 x% Y+ h& P+ v% w! }  E" t嵌入式开发联盟 ENDIF4 K, O; d6 Q. a0 F" l' Y
bootloader_tail本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。5 |. g* ~" S3 T) n* A
mcuos.com* s% p% P2 C, T9 Y

# u$ d# w. G, S: L- E" v6 m5 M' `8 K, I/ m9 W4 `: g/ s( b2 c
原来updater.bin是在bin.s中把bootloader.bin包含在自己的image中,并导出bootloader.bin的起始地址和结束地址。然后,在我们在运行updater.bin,并按任意键时,他将bootloader.bin烧录到Norflash的0x7F000000地址上了。嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习7 K8 z7 s- \. d' O5 ?
if( flash_raw_write(bin_entry, (void *)0x7F000000, size) == 0 )
+ m1 |! E% t5 [9 K- 嵌入式底层驱动开发技术学习网站
7 T$ N5 }. n1 Y6 I嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习7 x, v0 j7 v2 J  F# X' f$ K# R5 e
根据上面的这个分析,也就知道怎么使用H-JTAG烧录w90p710的bootloader了。
附件: 您需要登录才可以下载或查看附件。没有帐号?本站只开放邀请码注册,QQ:82475491,索要邀请码

好帖,置顶!加精!

TOP

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