Jlink 烧写文件到 nandflash norflash

10 篇文章 0 订阅

s3c2440开发板支持两种启动方式,一种是 nandflash 启动,此时 nandflash 中的前 4K 内容会由硬件自动拷贝至片内 SRAM 4K 内存中,这片内 4K 内存会被 map 到 nGCS0 也就是 bank0 ,起始地址为0 。如果是 Nor 启动,norflash 也是被接在 nGCS0 ban0 上的,Norflash 可以直接被读取,因此 cpu 从 Norflash 的 0 地址开始运行。一直被人忽略的一点,nor启动时,片内 sram 4K 内存的起始地址为 0x4000 0000 .

    使用 Jlink 可以将文件下载到 sram ,那么,我们就可以在 sram 执行一个初始化 sdram 的程序,初始化更大的可用内存空间。然后,就可以使用 Jlink 向 sdram 中下载程序。如果说,我们想烧写文件到 nandflash 或者 norflash ,可以自己来写 nandflash norflash 的烧写函数,或者直接利用 Uboot 来烧写。

一、烧写 nandflash
    
    将跳线开关拨到 nand 启动那一侧!需要的文件:
      1、init.bin 用来初始化 sdram
      2、uboot_no_initsdram ,去掉初始化 sdram 部分的 uboot 
      3、要烧写的文件

   1、init.bin
@******************************************************************************
@ File:init.S
@ 功能:初始化sdram
@****************************************************************************** 
 
.text
.global _start
_start:
    // 关看门狗
    ldr r0,=0x53000000
    mov r1,#0
    str r1,[r0]
    
    // 屏蔽中断
    mov    r1, #0xffffffff
    ldr    r0, =0x4A000008
    str    r1, [r0]
    
    ldr    r1, =0x3ff
    ldr    r0, =0x4A00001C
    str    r1, [r0]
    
    // 初始化内存
    MOV R0,#0x48000000
    ADRL R1,mem_cfg_val
                            @STR [R1],[R0],#4
    MOV R4,#0
1:    
    LDR R3,[R1],#4
    STR R3,[R0],#4
    ADD R4,R4,#1
    CMP R4,#13
    BNE 1b
 
loop:
    b loop
    
.align 4
mem_cfg_val:
    @ 存储控制器13个寄存器的设置值
    .long   0x22011110      @ BWSCON
    .long   0x00000700      @ BANKCON0
    .long   0x00000700      @ BANKCON1
    .long   0x00000700      @ BANKCON2
    .long   0x00000700      @ BANKCON3  
    .long   0x00000700      @ BANKCON4
    .long   0x00000700      @ BANKCON5
    .long   0x00018005      @ BANKCON6
    .long   0x00018005      @ BANKCON7
    .long   0x008C07A3      @ REFRESH
    .long   0x000000B1      @ BANKSIZE
    .long   0x00000030      @ MRSRB6
    .long   0x00000030      @ MRSRB7
   makefile
init_sdram.bin : init_sdram_elf
    arm-linux-objcopy -O binary -S init_sdram_elf init_sdram.bin
    arm-linux-objdump -D -m arm  init_sdram_elf > init_sdram.dis
 
init_sdram_elf : init.o
    arm-linux-ld -Ttext 0x00000000 -g  init.o  -o init_sdram_elf
 
init.o : init.S
    arm-linux-gcc -g -c -o init.o init.S
 
clean:
    rm -f   init_sdram.dis init_sdram.bin init_sdram_elf *.o
   注意这里的连接地址是 0 地址,因为 nand 启动时,片内 sram 的起始地址为 0 

   2、uboot_no_initsdram ,去掉初始化 sdram 部分的 uboot 
    这里我是用的是 u-boot-1.1.6.tar.bz2 源码,以及韦东山老师提供的补丁文件 u-boot-1.1.6_jz2440.patch (适用于绝大多数2440开发板),将两个文件放于同一目录下
    tar jxvf  u-boot-1.1.6.tar.bz2 解压缩
    cd u-boot-1.1.6
    patch -p < ../u-boot-1.1.6_jz2440.patch 
    make 100ask24x0_config
    修改 cpu/arm920t/start.S 注释掉 bllowlevel_init 
    make
  
   3、jink连接好开发板,上电,打开 j-link commonder ,输入 usb 检查连接状况
 
    如图所示,能够识别出 id 以及ARM,Architecure 4T 表示正常
    speed 12000
    loadbin xxx_init.bin 0   将初始化 sdram 的文件通过Jink拷贝到片内sram
    setpc 0
    g

    h//暂停cpu
    loadbin u-boot_no_init_sdram.bin 33f80000 //33f80000为uboot的连接地址,不能更改
    setpc 33f80000
    g

    此时,不出意外,串口上可以看到 Uboot 的打印信息了


    此时你可以借助于 tftp nfs 来将文件下载到内存,也可以继续使用 jlink ,文件较小的话直接使用jlink比较方便
    h
    loadbin uboot.bin 30000000
    g
    nand erase 0x60000 0x500000//0x500000 5M 对于uboot来说应该够大了
    nand write 0x30000000 0x60000 0x500000  //至此,通过jink 烧写 uboot 完成

二、jink 烧写 norflash
    如果 Uboot 支持烧写 norflash 的话,我们同样可以采取上述方法,只不过要把跳线拨到nor启动那一侧,初始化 sram 程序的连接地址改为 0x40000000 ,将它 拷贝到 0x40000000 处去。
    但是韦老大的uboot貌似不支持,我们直接借助于 jink 来烧写更直接,打开jink-arm
    

    新建一个 project , option->projectsetting

    General 以及 Target interface 保持默认
    cpu 选项卡,core 选择 arm9 ,勾选 use target ram addr 40000000  4K
    40000000 是nor启动时片内sram的地址,4K为大小 ,delet 下边那个框里的 reset 如图

    flash 选项卡,首先去掉 auto xxx 选项的钩,然后 select flash device ,根据自己的norflash型号选择,睁大眼看看自己板子上的norflash型号

    在烧写之前呢,我们最好想前边烧写nandflash一样,先把初始化程序拷贝到sram,初始化一下sdram,关看门狗,屏蔽中断,否则在烧写较大文件的过程中必然失败。
   注意,此时初始化程序的连接地址为 0x40000000
@******************************************************************************
@ File:init.S
@ 功能:初始化sdram
@****************************************************************************** 
 
.text
.global _start
_start:
    // 关看门狗
    ldr r0,=0x53000000
    mov r1,#0
    str r1,[r0]
    
    // 屏蔽中断
    mov    r1, #0xffffffff
    ldr    r0, =0x4A000008
    str    r1, [r0]
    
    ldr    r1, =0x3ff
    ldr    r0, =0x4A00001C
    str    r1, [r0]
    
    // 初始化内存
    MOV R0,#0x48000000
    ADRL R1,mem_cfg_val
                            @STR [R1],[R0],#4
    MOV R4,#0
1:    
    LDR R3,[R1],#4
    STR R3,[R0],#4
    ADD R4,R4,#1
    CMP R4,#13
    BNE 1b
 
loop:
    b loop
    
.align 4
mem_cfg_val:
    @ 存储控制器13个寄存器的设置值
    .long   0x22011110      @ BWSCON
    .long   0x00000700      @ BANKCON0
    .long   0x00000700      @ BANKCON1
    .long   0x00000700      @ BANKCON2
    .long   0x00000700      @ BANKCON3  
    .long   0x00000700      @ BANKCON4
    .long   0x00000700      @ BANKCON5
    .long   0x00018005      @ BANKCON6
    .long   0x00018005      @ BANKCON7
    .long   0x008C07A3      @ REFRESH
    .long   0x000000B1      @ BANKSIZE
    .long   0x00000030      @ MRSRB6
    .long   0x00000030      @ MRSRB7
init_sdram.bin : init_sdram_elf
    arm-linux-objcopy -O binary -S init_sdram_elf init_sdram.bin
    arm-linux-objdump -D -m arm  init_sdram_elf > init_sdram.dis
 
init_sdram_elf : init.o
    arm-linux-ld -Ttext 0x40000000 -g  init.o  -o init_sdram_elf
 
init.o : init.S
    arm-linux-gcc -g -c -o init.o init.S
 
clean:
    rm -f   init_sdram.dis init_sdram.bin init_sdram_elf *.o

    speed 12000
    loadbin init.bin 0x40000000
    setpc 40000000
    g
    h
    此时,初始化工作已经完毕,开始烧写
    open 要烧写到 nor flash的文件,指定烧写地址一般为0,点击 Target connect ,然后 program OK 

    其实,初始化的工作可以在 projectsetting 下边那个框框里来做,我比较懒,直接用前边的初始化程序来自己初始化,都是一样的。


    jlink 的功能不局限于此,用它来进行裸机调试也是十分方便的,openjtag 需要借助于 openocd ,jlink 只需要一个jlink commonder ,这个后边调试的时候再细写吧。


以下转载自:http://blog.csdn.net/liushaowei2008/article/details/7721511
JLINK v8命令集
Available commands are:
有效的命令如下:
(本人简单翻译了一下如有错误还请指出,谢谢各位网友)
----------------------
f          Firmware info(显示固件信息)
h          halt(暂停CPU)
g          go(运行)
Sleep      Waits the given time (in milliseconds). Syntax: Sleep <delay>(睡眠多少毫秒)
s          Single step the target chip(单步调试目标芯片)
st         Show hardware status(显示硬件状态)
hwinfo     Show hardware info(显示硬件信息)
mem        Read memory. Syntax: mem  <Addr>, <NumBytes> (hex)(读内存)
mem8       Read  8-bit items. Syntax: mem8  <Addr>, <NumBytes> (hex)(读内存8字节)
mem16      Read 16-bit items. Syntax: mem16 <Addr>, <NumItems> (hex)mem32      Read 32-bit items. Syntax: mem32 <Addr>, <NumItems> (hex)
w1         Write  8-bit items. Syntax: w1 <Addr>, <Data> (hex)(写内存8字节)
w2         Write 16-bit items. Syntax: w2 <Addr>, <Data> (hex)(读内存16字节)
w4         Write 32-bit items. Syntax: w4 <Addr>, <Data> (hex)(读内存32字节)
wm         Write test words. Syntax: wm <NumWords>
is         Identify length of scan chain select register
ms         Measure length of scan chain. Syntax: ms <Scan chain>
mr         Measure RTCK react time. Syntax: mr
q          Quit(推出)
qc         Close JLink connection and quit(关闭jlink连接,并退出)
r          Reset target         (RESET)(重启目标)
rx         Reset target         (RESET). Syntax: rx <DelayAfterReset>(延时重启)
RSetType   Set the current reset type. Syntax: RSetType <type>
Regs       Display contents of registers(显示寄存器信息)
wreg       Write register.   Syntax: wreg <RegName>, <Value>(写继承器)
SetBP      Set breakpoint.   Syntax: SetBP <addr> [A/T] [S/H](设置断点)
SetWP      Set Watchpoint. Syntax: <Addr> [R/W] [<Data> [<D-Mask>] [A-Mask]](设置监视点)
ClrBP      Clear breakpoint. Syntax: ClrBP  <BP_Handle>(清除断点)
ClrWP      Clear watchpoint. Syntax: ClrWP  <WP_Handle>(清楚监视点)
VCatch     Write vector catch. Syntax: VCatch <Value>
loadbin    Load binary file into target memory.(下载bin文件到目标内存)
             Syntax: loadbin <filename>, <addr>
savebin    Saves target memory into binary file.(保存BIN文件)
             Syntax: savebin <filename>, <addr>, <NumBytes>
SetPC      Set the PC to specified value. Syntax: SetPC <Addr>(设置PC(r15)寄存器)
le         Change to little endian mode(设置成小端模式)
be         Change to big endian mode(设置成大端模式)
log        Enables log to file.  Syntax: log <filename>
unlock     Unlocks a device. Syntax: unlock <DeviceName>
           Type unlock without <DeviceName> to get a list
           of supported device names.
           nRESET has to be connected
---- CP15 ------------
rce        Read CP15.  Syntax: rce <Op1>, <CRn>, <CRm>, <Op2>(读CP15)
wce        Write CP15. Syntax: wce <Op1>, <CRn>, <CRm>, <Op2>, <Data>(写CP15)
---- ICE -------------
Ice        Show state of the embedded ice macrocell (ICE breaker)
ri         Read Ice reg.  Syntax: ri <RegIndex>(hex)
wi         Write Ice reg. Syntax: wi <RegIndex>, <Data>(hex)
---- ETM -------------
etm        Show ETM status
re         Read ETM reg.  Syntax: re <RegIndex>
we         Write ETM reg. Syntax: we <RegIndex>, <Data>(hex)
es         Start trace
---- ETB -------------
etb        Show ETB status
rb         Read ETB register.  Syntax: rb <RegIndex>
wb         Write ETB register. Syntax: wb <RegIndex>, <Data>(hex)
---- TRACE -----------
TAddBranch TRACE - Add branch instruction to trace buffer. Paras:<Addr>,<BAddr>
TAddInst   TRACE - Add (non-branch) instruction to trace buffer. Syntax: <Addr>
TClear     TRACE - Clear buffer
TSetSize   TRACE - Set Size of trace buffer
TSetFormat TRACE - SetFormat
TSR        TRACE - Show Regions (and analyze trace buffer)
TStart     TRACE - Start
TStop      TRACE - Stop
---- SWO -------------
SWOSpeed   SWO - Show supported speeds
SWOStart   SWO - Start
SWOStop    SWO - Stop
SWOStat    SWO - Display SWO status
SWORead    SWO - Read and display SWO data
SWOShow    SWO - Read and analyze SWO data
SWOFlush   SWO - Flush data
---- File I/O --------
fwrite     Write file to emulator
fread      Read file from emulator
fshow      Read and display file from emulator
fdelete    Delete file on emulator
fsize      Display size of file on emulator
---- Test ------------
thg        Run go/halt 1000 times
ts         Run step 1000 times
testwspeed Test download speed.   Syntax: testwspeed [<Addr> [<Size>]]
testrspeed Test upload speed.     Syntax: testrspeed [<Addr> [<Size>] [<NumBlock
s>]]
testcspeed Test CPU speed.        Syntax: testcspeed [<RAMAddr>]
---- JTAG ------------
Config     Set number of IR/DR bits before ARM device.
             Syntax: Config <IRpre>, <DRpre>
speed      Set JTAG speed. Syntax: speed <freq>|auto|adaptive, e.g. speed 2000,
speed a
i          Read JTAG Id (Host CPU)
wjc        Write JTAG command (IR). Syntax: wjc <Data>(hex)
wjd        Write JTAG data (DR). Syntax: wjd <Data32>(hex), <NumBits>(dec)
RTAP       Reset TAP Controller using state machine (111110)
wjraw      Write Raw JTAG data. Syntax: wjraw <NumBits(dec)>, <tms>, <tdi>
rt         Reset TAP Controller (nTRST)
---- JTAG-Hardware ---
c00        Create clock with TDI = TMS = 0
c          Clock
0          Clear TDI
1          Set   TDI
t0         Clear TMS
t1         Set   TMS
trst0      Clear TRST
trst1      Set   TRST
r0         Clear RESET
r1         Set   RESET
---- Connection ------
usb        Connect to J-Link via USB.  Syntax: usb <port>, where port is 0..3
ip         Connect to J-Link ARM Pro or J-Link TCP/IP Server via TCP/IP.
           Syntax: ip <ip_addr>
---- Configuration ---
si         Select target interface. Syntax: si <Interface>,
           where 0=JTAG and 1=SWD.
power      Switch power supply for target. Syntax: power <State> [perm],
           where State is either On or Off. Example: power on perm
wconf      Write configuration byte. Syntax: wconf <offset>, <data>
rconf      Read configuration bytes. Syntax: rconf
usbaddr    Assign usb address to the connected J-Link: Syntax: usbaddr = <addr>
ipaddr     Show/Assign IP address and subnetmask of/to the connected J-Link.
gwaddr     Show/Assign network gateway address of/to the connected J-Link.
dnsaddr    Show/Assign network DNS server address of/to the connected J-Link.
conf       Show configuration of the connected J-Link.
ecp        Enable the  J-Link control panel.
calibrate  Calibrate the target current measurement.
selemu     Select a emulator to communicate with,
           from a list of all emulators which are connected to the host
           The interfaces to search on, can be specified
             Syntax: selemu [<Interface0> <Interface1> ...]
ShowEmuList Shows a list of all emulators which are connected to the host.
            The interfaces to search on, can be specified.
             Syntax: ShowEmuList [<Interface0> <Interface1> ...]
----------------------
NOTE: Specifying a filename in command line
will start J-Link Commander in script mode.


几个常用命令:


  usb--------连接目标板
  r----------重启目标板
  halt-------停止cpu运行的程序
  loadbin----加载可执行的二进制文件
  g----------跳到代码段地址执行
  s----------单步执行(调试用)
  setpc-----设置pc寄存器的值(调试用)
  setbp-----设置断点
  Regs-------读寄存器组织
  wreg-------写寄存器
  mem--------读内存
  w4---------写内存
  power off mmu---关闭mmu,这个对于裸板调试很重要
  w4 cpsr,0x0000001f------切换到系统模式
  speed------设置jtag的传输速率
  rce 0,c0,c0,0-----设置cp15寄存器的第1个寄存器为0
 ———————————————— 

原文链接:https://blog.csdn.net/lizuobin2/article/details/52005917

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值