Tiny4412 Uboot

主題:   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 口 在安裝是的順序,和之後運行是的順序不能變

相關文章
相關標籤/搜索