主題: 1.bootloader的介紹 2.uboot的編譯和燒寫 3.minicom的使用 4.uboot的代碼結構 5.用dnw將程序加載到uboot中執行linux
1. bootloader的介紹 ========================= 開發板或PC上電啓動後,運行的第一個軟件稱爲bootloader,PC的bootloader通常稱爲BIOS;windows
Bootloader相似於PC上的BIOS,其核心做用有3個: -->初始化硬件 包括EXY4412處理器,DDR內存,SD卡,eMMC等 -->提供一系列交互命令 用戶能夠經過串口和bootloader通訊,並利用bootloader執行一些命令,好比用dnw下載應用程序執行等 -->引導linux內核app
Bootloader有不少種,也能夠本身寫。其中最著名的一種叫uboot,是一個開源的代碼項目,支持很是多的處理器和開發板。咱們使用的開發板也移植了uboot。工具
Superboot也是bootloader的一種,是友善自行設計的,並無開源;設計
2. uboot的編譯和燒寫 =========================== (1)uboot的解壓縮 --------------------- uboot的壓縮包在uboot子目錄下: $>cd /home/zhang/01embed/uboot/code
root@localhost tiny4412]# mkdir uboot-tiny4412 [root@localhost tiny4412]# cd uboot-tiny4412/ [root@localhost uboot-tiny4412]# ls [root@localhost uboot-tiny4412]# pwd /opt/FriendlyARM/tiny4412/uboot-tiny4412接口
[root@localhost uboot-tiny4412]# cp -f /opt/install/zht-01embed/uboot/uboot_tiny4412_0929.tar.gz . [root@localhost uboot-tiny4412]# ls uboot_tiny4412_0929.tar.gzip
$>tar xzvf uboot_tiny4412_0929.tar.gz內存
(2)配置uboot並編譯 -------------------- $>cd uboot_tiny4412/開發
若是編譯0929版的uboot,須要爲兩個文件增長可執行權限: $>chmod 755 mkconfig $>chmod 755 tools/scripts/make-asm-offsets
$>make tiny4412_config $>make
....... /4.5.1 -lgcc -Map u-boot.map -o u-boot arm-linux-ld: warning: creating a DT_TEXTREL in object. arm-linux-objcopy -O srec u-boot u-boot.srec arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
若是編譯0929版的uboot,須要爲兩個文件增長可執行權限: $>chmod 755 mkconfig $>chmod 755 tools/scripts/make-asm-offsets
(3)編譯用於生成bl2的工具 --------------------- 進入uboot目錄,編譯兩個和燒寫sd卡相關的工具: $>cd uboot_tiny4412_0929/sd_fuse/ $>make 生成工具mkbl2和sd_fdisk
[root@localhost sd_fuse]# make gcc -o mkbl2 V310-EVT1-mkbl2.c gcc -o sd_fdisk sd_fdisk.c
(4)將uboot燒寫到SD卡中 ---------------------- 首先準備一張2G或以上的SD卡; 注意!燒寫uboot會破壞卡中已有的數據,所以請先對SD卡上的數據進行備份(有必要的話);
假設SD卡被Linux識別爲/dev/sdb,以root權限運行如下命令: $>umount /media/xxx/ umount /media/27FB-0A91/
root@localhost sd_fuse]# ls /dev/sd* -ll brw-rw----. 1 root disk 8, 0 4月 27 08:28 /dev/sda brw-rw----. 1 root disk 8, 1 4月 27 08:28 /dev/sda1 brw-rw----. 1 root disk 8, 2 4月 27 08:28 /dev/sda2 brw-rw----. 1 root disk 8, 16 4月 27 08:34 /dev/sdb brw-rw----. 1 root disk 8, 32 4月 27 10:17 /dev/sdc brw-rw----. 1 root disk 8, 33 4月 27 10:17 /dev/sdc1
$>cd uboot_tiny4412_0929/sd_fuse/tiny4412/
root@localhost tiny4412]# pwd /opt/FriendlyARM/tiny4412/uboot-tiny4412/uboot_tiny4412_0929/sd_fuse/tiny4412
[root@localhost tiny4412]# ls sd* -ll -rw-rw-rw-. 1 xguest xguest 2174 10月 31 13:08 sd_fusing.sh [root@localhost tiny4412]# ls sd* -ll -rwxrwxrwx. 1 xguest xguest 2174 10月 31 13:08 sd_fusing.sh
$>./sd_fusing.sh /dev/sdb U-boot image is fused successfully. Eject SD card and insert it again.
//該腳本首先用上面的工具mkbl2生成bl2.bin //而後用dd將E4412_bl1.bin,bl2.bin,,u-boot.bin,E4412_tzsw.bin等4個部分分別寫入/dev/sdb的指定位置
退出sd 卡
若是隻想向SD卡燒寫bl2.bin和u-boot.bin,能夠用另外一個腳本: $>cd sd_fuse/tiny4412/ $>./fast_fuse.sh /dev/sdb
插SD卡到板子,打開minicom ,開機
Checking Boot Mode ... SDMMC REVISION: 1.1 MMC Device 0: 14804 MB MMC Device 1: 3728 MB MMC Device 2: N/A *** Warning - using default environment Net: No ethernet found. Hit any key to stop autoboot: 0 TINY4412 #
3. minicom的使用 ========================= (1)基於串口進行通信 ------------------------ 將uboot燒寫到開發板後,uboot會經過串口來收發信息,若是要和uboot交互,首先須要鏈接串口;
用串口線將開發板的串口和PC的串口相連,若是是臺式機,則可使用機器後面的普通串口;若是是筆記本,則可使用開發板中配套提供的USB轉串口設備;
注意!若是使用臺式機後面的普通串口,在插拔串口線時,務必提早關閉開發板的電源!
連好串口線後,就能夠利用串口通信工具和uboot交流了,在windows中的串口通信工具爲超級終端,而linux中爲minicom;
(2)minicom的安裝和配置 ------------------------- 若是沒有安裝minicom,請首先配置好yum,而後按以下方法安裝和配置: 安裝: $>yum install minicom
第一次運行minicom時要先配置一下: $>minicom -s
進入配置界面,配置過程以下: --> 將光標定位到第三項(Serial port setup)敲Enter鍵進入; --> 按A鍵,設定串口對應的設備 若是開發板鏈接到PC後面的串口,則設備文件名爲/dev/ttyS0; 若是使用USB轉串口線鏈接開發板,則設備文件名爲/dev/ttyUSB0 輸入完成後按enter鍵 --> 按E鍵,設置串口通訊的波特率爲115200,8N1 --> 按F鍵,關閉硬件流控 --> 修改完後,選擇Save setup as dfl
(3)minicom的使用 ------------------------ 再次啓動minicom時,若是串口對應的設備文件名沒有變化,則能夠直接運行minicom; $>minicom 啓動開發板後,若是uboot燒寫成功,則minicom的界面中會顯示uboot輸出的文字,按鍵盤任意鍵,進入uboot的交互模式; 若是要退出minicom,同時按下Ctrl+A,鬆開後再按Z,再按X則退出;
(4)minicom運行出錯 ------------------------- 若是沒有正確退出,下一次啓動minicom時可能會出現以下錯誤: $>minicom Device /dev/ttyUSB0 lock failed: 不容許的操做.
此時,能夠刪除minicom的鎖文件: $>rm -f /var/lock/LCK*
刪除後,再次啓動minicom: $>minicom
4. uboot的代碼結構 ========================== 做爲硬件啓動後最早運行的程序,要完成一個bootloader必須熟知特定arm處理器的底層細節以及啓動過程; 早期的嵌入式開發中,大多數arm芯片的底層細節都是開放的,此時能夠直接從網上下載最新版的uboot並移植到開發板上運行;
很遺憾,三星並未徹底開放EXYNOS4412芯片的底層細節,所以,咱們的課程只能使用友善移植的uboot; 下面大致介紹一下uboot的核心代碼結構;
(1)board/samsung/tiny4412/ --------------------------- 目錄下的代碼主要完成tiny4412開發板的初始化; -->config.mk 在文件config.mk中指定了編譯後的uboot的運行地址,即: CONFIG_SYS_TEXT_BASE = 0xc3e00000
這個地址是虛擬地址,若是要使用物理地址,則須要在編譯uboot時關閉MMU,並將uboot的運行地址修改以下: CONFIG_SYS_TEXT_BASE = 0x43e00000
-->u-boot.lds 文件u-boot.lds指定了整個uboot的連接順序
(2)arch/arm/cpu/armv7/ --------------------------- 該目錄下的代碼針對CortexA9處理器,其中最重要的是整個uboot的初始化文件start.S
(3)include/configs/tiny4412.h --------------------------- 是tiny4412開發板的配置文件,能夠經過修改文件中的常量定義來改變uboot的配置; 好比能夠設置uboot輸出信息的提示符: #define CONFIG_SYS_PROMPT "zht4412 #"
還能夠關閉對MMU的支持: //#define CONFIG_ENABLE_MMU
(4)common/ ----------------------------- 該目錄下是uboot中各類命令,如dnw,tftp,go,set,save等的實現代碼; 若是要實現本身定義的命令,應該把實現代碼加入該目錄;
5. 用dnw將程序加載到uboot中執行 =============================== 當開發板上運行uboot之後,能夠經過工具dnw從pc獲取可執行的bin格式應用程序,加載到開發板上運行;
(1)dnw工具的安裝
[root@localhost 桌面]# cd /opt/FriendlyARM/tiny4412/ [root@localhost tiny4412]# mkdir dnw-tools [root@localhost tiny4412]# pwd /opt/FriendlyARM/tiny4412 [root@localhost tiny4412]# cd dnw-tools/ [root@localhost dnw-tools]# cp -f /opt/install/zht-01embed/tools/dnw-linux.tar.gz . [root@localhost dnw-tools]# ls dnw-linux.tar.gz [root@localhost dnw-tools]# pwd /opt/FriendlyARM/tiny4412/dnw-tools
----------------------- dnw工具在tools目錄下,解壓縮並安裝(要有root權限): $>cd tools/ $>tar xzvf dnw-linux.tar.gz $>cd dnw-linux/ $>make $>make install
(2)利用dnw加載(load)程序 ----------------------- dnw利用usb接口加載程序,找到光盤中的usb線,一端接pc,小扁口一端則鏈接到板子上的mini-usb口;
minicom 中 -----
Net: No ethernet found. Hit any key to stop autoboot: 0 TINY4412 # dnw 70003000
OTG cable Connected! Now, Waiting for DNW to transmit data
首先要在uboot中運行dnw命令: zht4412 #dnw 70003000 //指定應用程序的加載位置爲地址0x70003000 //當前的uboot爲不支持MMU的版本
接下來在pc中運行dnw工具,將bin程序加載到板子上:
cp -rf /opt/install/zht-01embed/work/code-uboot /opt/FriendlyARM/tiny4412/. cd /opt/FriendlyARM/tiny4412/code-uboot/00cpsr/ [root@localhost 00cpsr]# make arm-linux-as start.s -o start.o arm-linux-gcc -c main.c -o main.o arm-linux-ld start.o main.o -Ttext 0x70003000 -o mycpsr arm-linux-objcopy -O binary mycpsr mycpsr.bin
[root@localhost 00cpsr]# dnw mycpsr.bin load address: 0x57E00000 Writing data... 100% 0x000001A2 bytes (0 K) speed: infM/S
$>cd code-uboot/00cpsr/ $>make $>dnw mycpsr.bin
///////minicom 窗口 出現
TINY4412 # dnw 70003000 OTG cable Connected! Now, Waiting for DNW to transmit data Download Done!! Download Address: 0x70003000, Download Filesize:0x198 Checksum is being calculated. Checksum Value => MEM:b5f5 DNW:b654 Checksum failed.
表示傳輸成功,自動退出等待。 若是不退出, 繼續在 dnw 窗口, [root@localhost 00cpsr]# dnw mycpsr.bin 直到minicom 自動退出
(3)運行程序 ------------------------ uboot只能支持bin格式的應用程序,若是已經經過dnw加載,則能夠用go命令運行應用程序: zht4412 #go 70003000 //執行地址70003000處的代碼
出現問題, printf 打印不出
問題。
cd /opt/FriendlyARM/tiny4412/uboot-tiny4412/uboot_tiny4412_0929
root@localhost uboot_tiny4412_0929]# find . -name "System.map" ./System.map
gedit System.map
找到 printf地址 .... c3e11ad0 T printf ....
找到使用 printf 的程序
[root@localhost 00cpsr]# pwd /opt/FriendlyARM/tiny4412/code-uboot/00cpsr [root@localhost 00cpsr]# ls common.h main.c main.o Makefile mycpsr mycpsr.bin start.o start.s
int my_main(void) { printf("CPSR = 0x%x\n", get_cpsr());
printf("===Execute cmp 4,3===\n"); set_flags(4, 3); printf("CPSR = 0x%x\n", get_cpsr());
printf("===Execute cmp 4,4===\n"); set_flags(4, 4); printf("CPSR = 0x%x\n", get_cpsr());
printf("===Execute cmp 3,4===\n"); set_flags(3, 4); printf("CPSR = 0x%x\n", get_cpsr()); 修改
[root@localhost 00cpsr]# gedit common.h
#ifndef _COMMON_H #define _COMMON_H
#define NULL ((void *)0) #define printf(...) (((int (*)(const char *, ...))0xc3e11ad0)(__VA_ARGS__))
#endif //_COMMON_H
從新編譯
make
[root@localhost 00cpsr]# make arm-linux-ld start.o main.o -Ttext 0x70003000 -o mycpsr arm-linux-objcopy -O binary mycpsr mycpsr.bin
傳到板子。 minicom窗口 dnw 70003000 回車
代碼窗口 dnw mycpsr.bin 回車(能夠屢次)
等到 minicom窗口 退出等待
TINY4412 # go 70003000 ## Starting application at 0x70003000 ... CPSR = 0x60000113 ===Execute cmp 4,3=== CPSR = 0x20000113 ===Execute cmp 4,4=== CPSR = 0x60000113 ===Execute cmp 3,4=== CPSR = 0x80000113 ===Unmask IRQ & FIQ=== CPSR = 0x60000113 ## Application terminated, rc = 0x1
問題 :
[root@localhost 04led]# dnw arm.bin load address: 0x57E00000 Can not open /dev/secbulk0: No such file or directory
應該是你的驅動沒有安裝好 解決方法: 串口USB 和小usb 口 在安裝是的順序,和之後運行是的順序不能變