關於s3c6410的SD卡啓動

要研究裸機程序的編寫,必須要有一個“全裸”的環境。友善提供的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 plaincopy在CODE上查看代碼片派生到我的代碼片
  1. .text  
  2. .code 32  
  3. .global _start  
  4. _start:  
  5.     ldr r0,=0x7f008800  
  6.     ldr r1,=0x11111111  
  7.     str r1,[r0]  
  8.     ldr r0,=0x7f008808  
  9.     ldr r2,=0xff0f  
  10.     str r2,[r0]  
  11. loop:  
  12.     b loop  

//// makefile:
[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. CC=arm-linux-gcc  
  2. LD=arm-linux-ld  
  3. OBJCOPY=arm-linux-objcopy  
  4. CFLAG=-c  
  5. LDFLAG=-e _start -Ttext 0x0c000000  
  6. led.bin: led   
  7.     $(OBJCOPY) -O binary $< $@  
  8. led: led.o  
  9.     $(LD) $(LDFLAG) $? -o $@  
  10. led.o:led.s             
  11.     $(CC) $(CFLAG) $< -o $@  
  12. clean:  
  13.     rm *.o  
  14.     rm led  
  15.     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扇區都寫入。


發佈了45 篇原創文章 · 獲贊 6 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章