一、燒錄相關軟件下載
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地址上去;
linuxrom-s3c2440.bin
--------------------
linuxrom是linux系統文件,我們需要在u-boot運行時,使用tftp命令下載到SDRAM的0x30008000地址上,然後再使用nand write命令將其燒錄到nandflash的0x100000地址上,記得flash再寫之前一定要先使用nand erase命令擦除。
二、連接串口和用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