返回列表 发帖

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

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

本帖最后由 dglwx 于 2011-6-16 16:47 编辑 - 嵌入式底层驱动开发技术学习网站% r6 }! }; n' b1 j" H* |

9 C. {" b) E6 V7 b& |1, H-JTAG烧录bootloader:- 嵌入式底层驱动开发技术学习网站8 t9 v! g# C) ~4 `! P' I

4 J4 }8 s) {9 F; s& K1 `/ v8 i7 _4 a0 S- Z6 ~4 V
说明:
# P1 Z: j8 y6 ~+ `( V嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习附件中图片提到的L200使用的是w90p710,带有8M的Norflash(S29GL064N),如果大家使用其他型号的Flash,请作相应的修改:本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。, ^( V& v0 `2 Q# H( P9 @
1, 如果是4M的Norflash,则需将w90p710.hfc中的
! S& F! G7 G: O) R/ C6 tSetmem+32-Bit+0xFFF01004+0xFE050084
- @# Q# E3 O/ q$ M& r7 I1 I7 E- U本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。改为嵌入式开发联盟* E. L1 y' a3 A- i( G5 ^7 S
Setmem+32-Bit+0xFFF01004+0xFE040084本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。  p+ I' ]# x! ~$ G( G8 |: B0 i) S

  E9 n' Y, A5 A, @) d# D0 e本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。另外,在H-Flasher里选择相应的flash.
& m% t& ^% Z7 s: X2 x% g4 A4 p本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
  ?# d, d( a) \' w嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习2,H-JTAG官方的w90p710的配置Norflash的起始地址为0xFF000000,这里我改为了0x7F000000(应该是这个值吧,参考 0xFFF01004(ROM/FLASH(ROMCON) Control Register  )的值的配置。
$ s9 A" H0 k: c1 Z2 q) V本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。其中的bootloader.bin编译后在这个路径下:WBLv1_1\image\bootloader\little\bootloader.binmcuos.com- I3 y4 D! P' n6 q+ S
mcuos.com# Q  G' W$ g/ ^1 L2 S
嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习3 H& V- f% a1 I7 H
2.   以前使用ADS烧录的方法参考附件:   
6 n! s5 Y; a+ f. @# w, t
( P; c( M. L3 V' ~2 h4 g+ |. X5 A, Q嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习
1 k1 f) Z# Z' O: G  t  T# ?$ n* f7 Tmcuos.com
; ?, B8 a% p& K' q  P1 w嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。( \4 T- o9 C& h  V) ]

& J( A+ m' I( b. p# r嵌入式开发联盟3, 在bootloader里升级bootloader
% w) b1 _, f: n; A9 D8 j4 O嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习
% t) ~( ~# C% p4 T3 s, M: H2 t以前,在bootloader里升级bootloader时,可以使用使用下面两个命令来实现:
  C& x' F4 [" b, R7 V! K- e; L

1.mcuos.com- v4 `* _* x) w$ I* x( \
在bootloader的命令提示符下输入mt 0x8000,该命令用来将ADS编译出来的updater.bin下载到内存的0x8000处:

     bootloader>mt 0x8000


, O" x# z: _1 ?% O$ Wmcuos.com


+ y7 d) p3 K0 A8 Y; Y+ ^+ @嵌入式开发联盟

2.
2 Y4 @( X5 E  v- 嵌入式底层驱动开发技术学习网站在PC windows的命令提示符下使用tftp命令上传updater.bin文件到L200的内存中去:

      winxp_cmd> tftp -i 192.168.1.218 put updater.bin

嵌入式开发联盟$ R" d) R3 B; f) g

3.嵌入式开发联盟+ g1 I$ ~9 |+ M6 b" F
使用g命令运行下载下来的updater.bin文件:

     bootloader>g 0x8000

- 嵌入式底层驱动开发技术学习网站# _5 e4 x3 y/ H* x

4.本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。- l! N9 C0 K/ [/ T! P! a" i
等updater.bin程序运行一会后,按几下回车键。这时bootloader升级OK。


2 i( e2 I2 F3 }/ ~% Mmcuos.com嵌入式开发联盟5 |4 D0 n+ G8 A* ^
4, 为什么在bootloader里能使用updater.bin来升级bootloader?嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习1 l% T$ J3 H8 O" F' }
- 嵌入式底层驱动开发技术学习网站6 x; n5 `, {) I( Y3 u, f! B0 v
以前一直没搞命令updater.bin究竟是怎么回事。最近认真阅读了一下代码才发现,确实设计挺巧妙的:本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。# K! b! N$ ^1 K- k. {* J1 l4 w
& T, l$ ^2 V7 _3 R" B9 Q' w0 X
我们来看updater/updater.c的main():
0 V( c2 ^3 g+ Y# \$ d! [- 嵌入式底层驱动开发技术学习网站; E& e: m8 |0 }* L: z- X
- 嵌入式底层驱动开发技术学习网站+ F& u; N8 C& _8 z: L6 M8 Y0 y3 j
  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;}
复制代码

! N: s, K! Q; _5 x. y1 g  W本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。嵌入式开发联盟! m7 @8 C- W. `8 S- O/ G
在上面的源码中我们可以看到,要烧录的文件的起始地址为bin_entry(&bootloader_entry),终止地址为bin_tail(即&bootloader_tail),而文件的大小为: size=(int)((unsigned int)bin_tail-(unsigned int)bin_entry);
) g% Z; Z: I# _; b5 C/ S' n嵌入式开发联盟
+ F0 a: |6 n; _  \- {- 嵌入式底层驱动开发技术学习网站
嵌入式开发联盟6 O0 u7 `8 d6 l" Q( J$ H
本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。1 A0 k# y! m: D6 o

' C3 E- C& \* y1 ]嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习我们在使用ADS调试updater.axf时,烧录的文件究竟从哪里来呢?这样,我们跟踪bootloader_entry和bootloader_tail的定义:
* d4 A! k5 ~( k, `  Q( emcuos.com嵌入式开发联盟+ Y* @- H9 |% _! l5 L6 P- A
在updater/bin.s中有如下代码:
0 [, X2 E+ u7 n* A+ Q1 d+ F: [* M嵌入式开发联盟    EXPORT  bootrom_entry- 嵌入式底层驱动开发技术学习网站& a' U/ P" S' Y2 I) R* T! g
    EXPORT  bootrom_tail
8 ?8 s% Z$ j! @! h. c5 z嵌入式开发联盟    EXPORT  bootloader_entry
; ?" I. _5 C  N% x# \mcuos.com    EXPORT  bootloader_tail嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习* A% S8 `7 a/ M" z6 D! b

1 R7 g, R- K. n9 Z! m- g+ _嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习    AREA bin_section, CODE, READONLY嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习4 t/ d! D' `$ X3 b3 B
bootrom_entry
  q1 o% F9 B/ K4 D& r  x IF {ENDIAN} = "little"
9 E6 o( z$ Z5 \; v$ ^' Bmcuos.com;   INCBIN  ..\WBRv1_1\image\bootrom\little\bootrom.bin
) ?& V0 g8 R/ Q* Smcuos.com ELSEmcuos.com2 ^6 ?$ |" ^. ?$ v: C2 y
;   INCBIN  ..\WBRv1_1\image\bootrom\big\bootrom.bin嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习9 ]  H4 }5 j# Y6 O1 o. e! a
ENDIF本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。* {# y5 u' ?1 H, r0 T
bootrom_tail
$ {/ k9 u+ ?$ l' @# q3 b* d嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习
+ ?( r# r  v  Smcuos.com
% p2 K1 ~* h0 F9 L' y4 ~本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。
7 O0 i& l' a2 h4 u+ ~本站提供嵌入式底层驱动开发详尽的学习资料,技术帖子,面向嵌入式开发行业初学者,提供有针对性的技术培训服务。bootloader_entry
# y/ ~* n6 ?( ~2 [% k/ s7 ~ IF {ENDIAN} = "little"嵌入式开发联盟' d, \( j! l6 ~
    INCBIN  ..\WBLv1_1\image\bootloader\little\bootloader.bin- 嵌入式底层驱动开发技术学习网站% ?9 T: @5 h+ S' O. `
;   INCBIN  E:\image\bootloader\little\bootloader.bin- 嵌入式底层驱动开发技术学习网站1 P; q9 K, {  s, X: r- [
ELSE
- X& H# ?. Y/ Qmcuos.com    INCBIN  ..\WBLv1_1\image\bootloader\big\bootloader.bin  A, I/ y$ _- ^0 f+ i. r4 f- D
;   INCBIN  E:\image\bootloader\big\bootloader.bin- 嵌入式底层驱动开发技术学习网站7 c( n5 R; s, [- H8 V
ENDIF
# Z4 o) C: |6 q& I! l7 sbootloader_tail嵌入式开发联盟8 J3 {( ?  J- {

$ l. v3 b6 ]* O& Y; K! u) F- 嵌入式底层驱动开发技术学习网站
, H2 b6 E3 W. [& W/ k! }9 f嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习
( A* Y% o. m6 N9 s# X嵌入式, 嵌入式开发, Linux, arm, 驱动开发, 嵌入式学习原来updater.bin是在bin.s中把bootloader.bin包含在自己的image中,并导出bootloader.bin的起始地址和结束地址。然后,在我们在运行updater.bin,并按任意键时,他将bootloader.bin烧录到Norflash的0x7F000000地址上了。- 嵌入式底层驱动开发技术学习网站0 |5 B. w" G0 J
if( flash_raw_write(bin_entry, (void *)0x7F000000, size) == 0 )
2 W) q6 C8 d8 \, E+ lmcuos.com
0 c7 P# I* s+ i7 }4 ~嵌入式开发联盟嵌入式开发联盟: h8 [2 S2 Z4 q! E9 p. I
根据上面的这个分析,也就知道怎么使用H-JTAG烧录w90p710的bootloader了。
附件: 您需要登录才可以下载或查看附件。没有帐号?本站只开放邀请码注册,QQ:82475491,索要邀请码

好帖,置顶!加精!

TOP

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