一、烧录相关软件下载
USB转串口相关芯片驱动 : CH341SER.ZIP
J-link驱动 : Setup_JLinkARM_V410i.exe
windows下tftp服务器工具: tftpd32.exe
注意:
1, 只有在bootloader阶段才能使用j-link下载调试,一旦Linux运行起来后,j-link就不能再使用了。
2, 如果开发板上没有出厂时的wince系统,就可以跳过前面的擦除出厂系统自带bootloader的过程,直接使用j-link下载bootstrap程序并烧录u-boot
3,所有的flash都只能由1 write成0,不能由0 write成1; 如果要从0变为1,只能erase; 所以在往flash写数据之前,必须先擦除要写的地址空间;
烧录文件说明:
--------------------
bootstrap-s3c2440.bin
bootstrap文件是郭工用汇编写的一段代码,主要用来初始化CPU外部的SDRAM;在烧录时,该程序需要使用j-link下载到0x0(CPU内部SRAM)地址上去运行,另外此程序不需要烧录到Nandflash上。
u-boot-s3c2440.bin
--------------------
u-boot就相当于电脑的BIOS程序,该程序用来烧录/启动Linux系统等。在运行完bootstrap后,我们需要使用j-link将它加载到0x33f80000(CPU外部SDRAM)中去运行,当他在内存中运行起来后,再使用nand write命令将他烧录到nandflash的0地址上去;
二、连接串口和用j-link烧写程序
1,在安装完USB转串口驱动后,然后右击我的电脑,打开设备管理器,在端口的地方可以看到USB转串口的串口号(我的是COM8)
2,然后secureCRT如下设置,点击连接
然后就可以看到select Menu,接下来选择6,再选择0,然后y,这样就干掉了开发板的出场设置,接下来用jlink烧写我们自己的程序。
3,如果成功安装了jlink 工具的话,我们就能够运行这个j-link commander,然后按如下步骤来烧写
j-link加载u-boot命令:(j-link是可以直接操作CPU以及CPU内部的SRAM)
--------------------
h 停止CPU中正在执行的程序,如果没有停下,可以多按几次h
speed 12000 设置J-link调试速度为12M
loadbin loadbin E:\bootfile\bootstrap-s3c2440.bin 0 加载bootstrap程序到CPU内部的4K SRAM中运行
setpc 0 让PC寄存器指向SRAM的起始地址,该地址放的是刚才下载的bootstrap程序
g 开始执行bootstrap程序,该程序用来初始化外部扩展的64M SDRAM,地址空间为0x3000 0000~(0x3000 0000+64M)
h 停止bootstrap程序的执行,如果没有停下,可以多按几次h
loadbin E:\fl2440_bin\u-boot-s3c2440.bin 0x33f80000 将u-boot加载到SDRAM的0x33f80000
setpc 0x33f80000 使PC寄存器指向0x33f80000,即u-boot程序的第一条代码
g 开始执行u-boot程序
4,烧写完之后,会出现下面的运行界面,
U-Boot 2010.09 (Jan 26 2016 - 10:34:01)
DRAM: 64 MiB
NAND: 256 MiB
In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot: 0
[fl2440@shaocongshuai]#
[fl2440@shaocongshuai]#
三、u-boot模式下将程序烧写进nandflash
此时u-boot就在内存中运行起来了,然后要让u-boot.bin 文件烧到nandflash上,让其能够直接启动, 在这之前的删除之前nandflash上的数据,相当于格式化系统盘。
[fl2440@shaocongshuai]# nand scrub
然后运行tftpd32.exe通过网络将文件下载到u-boot上
[fl2440@shaocongshuai]# set ipaddr 192.168.1.244
[fl2440@shaocongshuai]# set serverip 192.168.1.93
I. 设置u-boot环境变量:
-----
set ethaddr 设置fl2440开发板上的u-boot程序中的MAC地址
set ipaddr 设置fl2440开发板上的u-boot程序中的IP地址
set serverip 指定tftp下载时使用的tftp服务器的IP地址
save 保存所设置的环境变量
reset u-boot环境下的重启
注意:
不管怎么样,serverip和ipaddr 必须处在同一网段内.
1.如果是网线连接的是无线路由器的LAN口,则serverip是linux下搭建的tftp服务器的ip
2.如果是用的本地连接,则serverip是本地连接手动设置的ipv4的ip(只要是私有ip),网关、dns可以不设置(处在同一局域网内)。本地连接时ipv4的ip(也就是serverip)设置必须是手动设置,不能dhcp,防止与pc的无线网路发生冲突。而且本地连接的网卡默认是关闭的,只有下载是才会使能。windows下的tftpd的server interface只有在下载是才会显示serverip.
II. 下载并烧录u-boot程序:
-----
tftp 30008000 u-boot-s3c2440.bin 将u-boot临时下载到SDRAM的30008000地址
nand erase 0 100000 将nandflash的0~1M的分区擦除,该分区是用来存放u-boot程序的;
nand write 30008000 0 ${filesize} 将刚下载到SDRAM 30008000地址上的u-boot写到nandflash的0地址偏移处,大小为下载的U-boot文件大小;
III. 下载并烧录linux系统:
-----
tftp 300008000 linuxrom-s3c2440.bin 将linux系统程序临时下载到SDRAM的30008000地址
nand erase 100000 F00000 将nandflash的1M~16M的分区(总共15M)擦除,该分区是用来存放linux系统的;
nand write 30008000 100000 ${filesize} 将刚下载到SDRAM 30008000地址上的linux系统写到nandflash的1M地址偏移处,大小为下载的linux系统文件大小;
四、设置环境变量让系统一上电后自动加载Linux内核
[fl2440@shaocongshuai]# set bootargs 'console=ttyS0,115200 mem=64M rw loglevel=7'
[fl2440@shaocongshuai]# set bootcmd 'nand read 30008000 100000 f00000;bootm 30008000'.
[fl2440@shaocongshuai]# pri
baudrate=115200
ethaddr=08:00:3e:93:0a:5b
ipaddr=192.168.1.244
serverip=192.168.1.93
netmask=255.255.255.0
ethact=dm9000
bkr=tftp 30008000 linuxrom-s3c2440.bin;bootm 30008000
bootdelay=3
stdin=serial
stdout=serial
stderr=serial
bootargs=console=ttyS0,115200 mem=64M rw loglevel=7
bootcmd=nand read 30008000 100000 f00000;bootm 30008000
Environment size: 336/131068 bytes
附上:
ARM CPU: Samsung S3C2440(ARM920T, ARMv4t)
RAM:
SRAM (CPU片内的SRAM,只有4K) --NGCS0(0x0000 0000~+4K)
SDRAM (外扩的32M*2=64M SDRAM, Samsung K4S561632C-TC75) --NGCS6(0x3000 0000~+64M)
DDRAM (NC)
Flash:
Nandflash (Samsung 256MB*1 K9F2G08)
Norflash (NGCS0 --)
内存32MB/4个Bank = 一个bank 8MB
K4S561632C 总共有13行,9列
访问时,先通过addr0~addr12给行地址,选定相应行;
再通过addr0~addr8 给列地址
SDRAM单片是16位的数据线(DQ0~DQ15)
+-+-+-+-+
+-+-+-+-+
+-+-+-+-+
+-+-+-+-+
13*9=2^22=4MB 一次是读16个位(即2个字节),总共寻址8MB
L(Lower)DQM和U(Upper)DQM负责选择低字节还是高字节给CPU
BA0~BA1这两个线是用来控制究竟选中SDRAM里的哪一个Bank
CPU是否选中SDRAM工作,是由SDRAM的NSCS这个引脚决定的,原理图
上他接到了CPU的NGCS6上,所以SDRAM的地址线空间是从0x3000 0000开始
在开发板中,SDRAM连接到内存控制器的Bank6中,它的开始内存地址是0x30000000,大小为64M,即0x20000000。 ARM Linux kernel将SDRAM的开始地址定义为PHYS_OFFSET。经bootloader加载kernel并由自解压部分代码运行后,最终kernel被放置到KERNEL_RAM_PADDR(=PHYS_OFFSET + TEXT_OFFSET,即0x30008000)地址上的一段内存,经此放置后,kernel代码以后均不会被移动。
在board/samsung/smdk2410/config.mk文件中
TEXT_BASE = 0x33F80000