IT技术互动交流平台

H-JTAG烧写NAND FLASH及ARM裸机程序框架

作者:linux_xpj  发布日期:2012-10-12 09:15:27

平台:MINI2440  NOR:S29AL016  NAND:K9F2G08U0B  SDRAM:K4S561632N 
工具:MINI2440或MICRO2440自带H-JTAG小板

    无论是用J-LINK还是用H-JTAG来烧写Nor Flash,FriendlyARM的手册上都有详细说明。但是对于只有Nand Flash的开发板,如何将我们的第一个测试程序烧写进去?
    FriendlyARM的手册上有这么一段话:“注意:目前H-JTAG只能用于烧写Nor Flash,并不能直接烧写Nand Flash,一些开发板厂商为了节省成本,很多都省掉了Nor Flash,因此并不能用本节介绍的步骤快速简单的烧写BIOS”。然而我从网上google一下,发现很多网友都说H-JTAG可以用来烧写Nand Flash,经过试验证明H-JTAG的确可以用来烧写Nand Flash,下面来介绍如何用H-JTAG烧写Nand Flash。

1.安装H-JTAG V2.1版本
    软件下载:H-JTAG V2.1 RELEASE.rar
2.硬件连接
    使用开发板附带的JTAG小板连接开发板的JTAG接口,开关拨到Nand Flash一侧,并打开电源。(其实烧写Nand Flash时开关拨到Nor或Nand均可以)
3.配置H-JTAG端口
    <1>打开H-JTAG软件,在setttings下拉菜单下选择USB/LPT Selection,因为我们用的是并口JTAG,所以选中LPT。
    <2>在settings下拉菜单下选择LPT JTAG Setting,按照下图设置即可。


 

4.配置初始化脚本
    在H-JTAG的主界面,点击Script->Init Script,跳出Init Script窗口,点该窗口下面的Load按钮,找到并选择打开FriendlyARM2440.his文件。
5.检测目标器件
    点击主菜单Operations->Detect Target,可以看到已经检测到目标器件了。   
    注意:初始化脚本并不是必须的,就算没有初始化脚本,也可以检测到CPU,但无法进行单步调试。其实所谓的初始化脚本也就是对ARM的几个寄存器进行设置而且,我们可以用UE打开FriendlyARM2440.his文件。

Setmem+32-Bit+0x53000000+0x00000000    //关看门狗
Setmem+32-Bit+0x4A000008+0xFFFFFFFF    //屏蔽所有中断
Setmem+32-Bit+0x4A00001C+0x000007FF
Setmem+32-Bit+0x53000000+0x00000000    //关看门狗
Setmem+32-Bit+0x56000050+0x000055AA    //设置外部中断
Setmem+32-Bit+0x4C000014+0x00000007    //设置时钟
Setmem+32-Bit+0x4C000000+0x00FFFFFF
Setmem+32-Bit+0x4C000004+0x00061012
Setmem+32-Bit+0x4C000008+0x00040042
Setmem+32-Bit+0x48000000+0x22111120    //初始化内存控制器
Setmem+32-Bit+0x48000004+0x00002F50
Setmem+32-Bit+0x48000008+0x00000700
Setmem+32-Bit+0x4800000C+0x00000700
Setmem+32-Bit+0x48000010+0x00000700
Setmem+32-Bit+0x48000014+0x00000700
Setmem+32-Bit+0x48000018+0x0007FFFC
Setmem+32-Bit+0x4800001C+0x00018005
Setmem+32-Bit+0x48000020+0x00018005
Setmem+32-Bit+0x48000024+0x008E0459
Setmem+32-Bit+0x48000028+0x00000032
Setmem+32-Bit+0x4800002C+0x00000030

    是不是和ARM裸机程序的初始化步骤很像,这里介绍一下ARM裸机程序框架
 

测试平台:MINI2440  NOR:S29AL016  NAND:K9F2G08U0B  SDRAM:K4S561632N
ARM裸机程序框架:
1. 设置为管理模式
2. 关看门狗,屏蔽所有中断
3. 初始化时钟
4. 初始化内存控制器
5. 初始化NAND控制器,从NAND拷贝代码到SDRAM
6. 跳转到main函数

    2440支持两种启动方式,nor启动和nand启动。当使用nand启动时,硬件会把nand前面4K代码拷贝到2440内部SRAM中,并从SRAM开始取指令执行。因此如果代码大于4K,需要进行代码的搬运。

    下面这个例子实现从串口0输出"hello world"字符串,由于程序代码远远小于4K,所以为了简单起见,省去了步骤4和步骤5。
简要分析:
1. 设置为管理模式
.global _start
_start:
    /* set the cpu to SVC32 mode */
    mrs    r0,cpsr
    bic    r0,r0,#0x1f
    orr    r0,r0,#0xd3
    msr    cpsr,r0
2. 关看门狗,屏蔽所有中断
    /* turn off the watchdog */
#define pWTCON        0x53000000

    ldr r0, =pWTCON
    mov r1, #0x0
    str r1, [r0]

    /* mask all IRQs by setting all bits in the INTMR - default */
#define INTMSK       0x4A000008   /* Interupt-Controller base addresses */
#define INTSUBMSK    0x4A00001C

    mov    r1, #0xffffffff
    ldr    r0, =INTMSK
    str    r1, [r0]

    ldr    r1, =0x7ff
    ldr    r0, =INTSUBMSK
    str    r1, [r0]
3. 初始化时钟
#define CLKDIVN        0x4C000014    /* clock divisor register */
    /* FCLK:HCLK:PCLK = 1:4:8 */
    ldr    r0, =CLKDIVN
    mov    r1, #5
    str    r1, [r0]

    /* MMU_SetAsyncBusMode */
    mrc p15,0,r0,c1,c0,0
    orr r0,r0,#0xc0000000
    mcr p15,0,r0,c1,c0,0

#define MPLLCON        0x4C000004
#define MPLL_FCLK_405M    ((0x7f<<12) | (0x02<<4) | (0x01))

    ldr r0, =MPLLCON
    ldr r1, =MPLL_FCLK_405M
    str r1, [r0]
6. 跳转到main函数
    ldr sp, =4096
    bl     main

halt:
    b     halt

    在main函数中完成串口0的初始化和字符串的输出。上述代码都是用位置无关码写的,因此代码的链接地址可以随便指定,我在Makefile中指定为0地址。

完整代码下载:uart.tar.gz
(文章最底部下载)

    在Linux系统下执行make,将生成的可执行二进制文件烧写到nand中,便可以从串口上看到输出。

 
----------------------------------------------------------------------------------------------------------------------------


关于脚本的格式可以参考此文档: H-JTAG_USER_MANUAL_(CN).pdf (文章最底部下载)
6.烧写Nand Flash
    <1>点击H-JTAG主菜单的Flasher->Start H-Flasher打开H-Flasher烧写程序窗口。如图:


 

    <2>在H-Flasher窗口菜单中选择New,新建配置
    <3>在H-Flasher窗口菜单中选择Load,选择S3C2440+K9F2G08.hfc
    <4>点击H-Flasher左侧导航栏的Programming
    <5>点击Check按钮,H-Flasher将会探测到开发板所用的Nand Flash型号。在Src File选择所要烧写的文件,再点击Program按钮即可。

    授人以鱼不如授人以渔,下面我们就看看S3C2440+K9F2G08.hfc里面到底是什么东西,在windows下用UE打开。

FLASH SECTION:
NAND-FLASH
S3C2440+K9F2G08
MEMORY SECTION:
08-BIT X 1-CHIP
0x0
0x30000000
XTAL SECTION:
NULL
TCK SECTION:
9
5
SCRIPT SECTION:
SoftReset+++
Setmem+32-Bit+0x53000000+0x00000000
Setmem+32-Bit+0x4A000008+0xFFFFFFFF
Setmem+32-Bit+0x4A00001C+0x000007FF
Setmem+32-Bit+0x4C000014+0x00000005
Setmem+32-Bit+0x4C000004+0x0007F021
Setmem+32-Bit+0x48000000+0x22011110
Setmem+32-Bit+0x48000004+0x00000700
Setmem+32-Bit+0x48000008+0x00000700
Setmem+32-Bit+0x4800000C+0x00000700
Setmem+32-Bit+0x48000010+0x00000700
Setmem+32-Bit+0x48000014+0x00000700
Setmem+32-Bit+0x48000018+0x00000700
Setmem+32-Bit+0x4800001C+0x00018005
Setmem+32-Bit+0x48000020+0x00018005
Setmem+32-Bit+0x48000024+0x009604F4
Setmem+32-Bit+0x48000028+0x000000B1
Setmem+32-Bit+0x4800002C+0x00000030
Setmem+32-Bit+0x48000030+0x00000030
PGMOPTION SECTION:
ADDON SECTION:

    是不是和刚才的FriendlyARM2440.his文件很像,它也是在做一些基本的硬件初始化工作。有人也许会问,为什么要做这些初始化,不做行不行?注意上面蓝色字样0x30000000,这是内存的起始地址,既然我们用到了内存,当然需要对它进行初始化,而内存的时序涉及到时钟,因此初始化时钟也是应该的。
    记不记得2440手册上有介绍过,2440本身内部集成4K SRAM,当Nor启动时这4K SRAM映射到地址0x40000000处,当Nand启动时这4K SRAM映射到地址0x0处。因此如果我们只是想简单地烧写二进制文件到Nand Flash中,大可不必这么麻烦,直接使用内部SRAM,这样也可以避免因为未正确初始化SDRAM而出现“Error: Can't download driver to specified address.”,下面简单介绍一下配置步骤。
1 - 3 步骤照旧
4.配置H-Flasher www.it165.net
    <1>点击H-JTAG主菜单的Flasher->Start H-Flasher打开H-Flasher烧写程序窗口。如图:


 

    <2>在H-Flasher窗口菜单中选择New,新建一个配置
    <3>点击H-Flasher左侧导航栏的Flash Selection,在右侧选择Nand Flash型号:S3C2440+K9F2G08
    <4>点击H-Flasher左侧导航栏的Configuration,按下图配置

 


 

    <4>点击H-Flasher左侧导航栏的Programming,点击右侧的Check来检查器件
 


 

相关配置文件下载:

友善自带配置文件(只针对Nor Flash烧写):

FriendlyARM2440.his  H-Flasher_mini2440.hfc

MINI2440  NOR:S29AL016 NAND:K9F2G08U0B SDRAM:K4S561632N 配置文件:

MINI2440_XPJ.his  MINI2440+K9F2G08.hfc  MINI2440+S29AL016.hfc

都包含在下面这个压缩文件里:


下载地址:http://files.it165.net/down/201210/1012attr.rar
Tag标签: H-JTAG   NAND   FLASH  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规