關於s3c6410的SD卡啟動

2021-06-21 11:20:24 字數 2498 閱讀 2588

**

要研究裸機程式的編寫,必須要有乙個「全裸」的環境。友善提供的superboot可以提供執行使用者自定義程式的能力,但其實這樣執行的程式環境還是依賴於superboot的, 那些記憶體初始化、時鐘初始化,串列埠初始化等工作都已經由superboot做了。tiny6410支援nandflash和sd卡啟動兩種模式,nandflash的燒寫還是依賴superboot,所以比較簡便的方法是通過sd卡啟動,superboot本身也是通過sd卡啟動的。

從網上搜了一下這方面的資料,主要參考文章來來去去就幾篇, 三星的s3c6410_internal_rom_booting.pdf是乙份比較有用的資料,當然還有其中一些文章也比較有用,例如djyos的sd卡啟動試驗。這些文章描述s3c6410的要點總結如下:

(1) s3c6410啟動過程分成bl0, bl1, bl2幾個階段, 其中bl0是固化在s3c6410內部的irom中的, 該段程式根據所選擇的啟動模式從儲存介質載入bl1. s3c6410支援從多種儲存介質中啟動,nandflash, sd卡,sdhc卡,onenand, movinand.... bl1和bl2儲存於這些儲存介質中。這裡我主要關注sd和sdhc卡.

(2) bl0在載入bl1前已經做了很多任務作,sd控制器初始化,關閉看門狗等。

(3) 對於sd卡, bl1位於 (totalsector - 18) 的扇區;對於sdhc卡,bl1位於(totalsector-1042)的扇區。bl1由bl0載入到 0x0c000000處執行,大小為8k.

知道了上面幾點,就可以製作sd啟動卡了,可以將所編寫的裸機程式放到bl1的位置。下面編寫乙個最簡單的點燈程式(led1~led4全亮):

/ led.s:

[plain]view plain

copy

.text  

.code 32  

.global _start  

_start:  

ldr r0,=0x7f008800  

ldr r1,=0x11111111  

str r1,[r0]  

ldr r0,=0x7f008808  

ldr r2,=0xff0f  

str r2,[r0]  

loop:  

b loop  

makefile:

[plain]view plain

copy

cc=arm-linux-gcc  

ld=arm-linux-ld  

objcopy=arm-linux-objcopy  

cflag=-c  

ldflag=-e _start -ttext 0x0c000000  

led.bin: led   

$(objcopy) -o binary $

led: led.o  

$(ld) $(ldflag) $? -o $@  

led.o:led.s             

$(cc) $(cflag) $

clean:  

rm *.o  

rm led  

rm led.bin  

下面要將led.bin寫入bl1.使用的是2g的sd卡,所以應該寫到 -512 * 18處。網上的文章都說用winhex寫入,我使用的是linux環境,沒有winhex可用,不過其實dd命令就可以對絕對磁碟扇區做讀寫。還有乙個問題就是要知道sd卡的大小, 用fdisk命令就可以了:

$ sudo fdisk -l /dev/sdb

disk /dev/sdb: 2059 mb, 2059403264 bytes

207 heads, 37 sectors/track, 525 cylinders

units = cylinders of 7659 * 512 = 3921408 bytes

sector size (logical/physical): 512 bytes / 512 bytes

i/o size (minimum/optimal): 512 bytes / 512 bytes

disk identifier: 0xb2a60e0e

device boot start end blocks id system

/dev/sdb1 1 525 2010469 b w95 fat32

所以要寫入的位址為 2059403264 - 18 * 512 = 2059394048

然後用dd命令寫入led.bin :

$ sudo dd if=./led.bin of=/dev/sdb seek=2059394048 bs=1

至此一張可啟動的sd卡就完成了,插入tiny6410, 選擇sd卡啟動模式,就可以看到板子啟動時4燈全亮。

注:友善宣稱它提供的sdflasher.exe可以不論sd和sdhc卡都可以支援,從而優於三星提供的irom_flushing_tool, 三星的要選擇是sd還是sdhc。其實原理很簡單,sdflasher.exe寫入時不論是-18扇區還是-1042扇區都寫入。

關於S3C6410的SD卡啟動

要研究裸機程式的編寫,必須要有乙個 全裸 的環境。友善提供的superboot可以提供執行使用者自定義程式的能力,但其實這樣執行的程式環境還是依賴於superboot的,那些記憶體初始化 時鐘初始化,串列埠初始化等工作都已經由superboot做了。tiny6410支援nandflash和sd卡啟動...

使uboot支援S3C6410的SD啟動

這裡使用的uboot並非uboot官方發布的uboot 而是為三星定製的乙個uboot版本s3c u boot 1.1.6,其 作者就包括了三星的程式設計師與denx的員工。這個版本支援sd啟動,不過預設是nand啟動,使它支援uboot需要做以下事情 1 雖然支援uboot啟動,但是uboot 裡...

使uboot支援S3C6410的SD啟動

一直以來都不知道sd卡中的uboot和nandflash中的uboot有什麼區別?今天終於看到一篇文章,介紹了一下兩者的區別,和如何用原生uboot製作sd卡uboot,記錄下來以供後面查閱。找到了原出處 6410的手冊上說,可以從nandflash onenand sd卡啟動,沒有專用的燒錄工具的...