{//===============================開發環境搭建===================================
約定: “$”表示是在主機上執行,“#”表示在目標板執行
{//探討
JACK: Hi,ivan, 嵌入式開發環境如何搭建啊,完全不知道如何下手啊?
IVAN:
網絡搜索 /* 注: 如何搜索關鍵字,快速找到需要信息。是項目開發中重要的一種能力。 如下
“ubuntu 嵌入式 開發環境 搭建 ”
注意關鍵字要簡明,且用空格隔開,方便搜索引擎查找
*/
JACK: TFTP服務不行啊,怎麼辦?
IVAN:
網絡搜索 //“ubuntu tftp服務 安裝”或 “嵌入式 tftp服務 安裝”或“linux tftp服務 安裝”
JACK: NFS服務不行啊,怎麼辦?
IVAN:
網絡搜索 // “ubuntu NFS服務 安裝”
}
{//開發主機安裝
{//虛擬機安裝(已有則跳過)
解壓Ubuntu_12.04_64-bit_farsight.7z /*該鏡像是在官方Ubuntu 12.04 LTS 64bit 基礎上,安裝了編譯調試bootloader 內核,android 4.4源碼所需的工具和庫。
如交叉編譯工具,VIM ,TFTP,NFS等
*/
點VMware-workstation-full-10.0.4-2249910.exe //按默認方式安裝虛擬機
安裝好後,選擇“打開虛擬機”導入已安裝好的鏡像 Ubuntu_12.04_64-bit_farsight.vmx
點播放虛擬機,選我已移動該虛擬機
啓動後,用戶名是linux 密碼是1
}
{//linux和window間共享
虛擬機 -> 設置 -> 選項 -> 共享文件夾 -> 添加 -> 選擇需要共享的位置(如E盤)
$ ls /mnt/hgfs/E/ //有共享的內容顯示,表示成功
$ cd ~
$ ln -s /mnt/hgfs/E/ e //創建軟連接, 方便操作
}
{//交叉編譯工具安裝
$ tar xvf gcc-4.6.4.tar.xz
$ sudo vim /etc/bash.bashrc /* 添加交叉編譯工具鏈的路徑到系統腳本
在末尾添加
export PATH=/home/linux/store/gcc-4.6.4/bin:$PATH
注意路徑要根據gcc-4.6.4的實際路徑修改
*/
$ source /etc/bash.bashrc //使配置文件生效
$ arm-n 然後按Tab鍵補全 //如果能補全爲arm-none-linux-gnueabi- 表示安裝交叉編譯工具成功了
}
{//u-boot編譯(用已移植好的)
$ cp ~/e/fs4412/2系統移植/1實驗/2第二天_U-boot移植/u-boot-2013.01-fs4412.tar.xz .
$ tar -xvf u-boot-2013.01-fs4412.tar.xz
$ cd u-boot-2013.01-fs4412
$ ./build.sh //運行該腳本後會自動生成最終的鏡像 u-boot-fs4412.bin
$ cp u-boot-fs4412.bin ~/e/USB_fastboot_tool/platform-tools/ //通過後面的fastboot方式可寫到板子上
}
{//內核編譯(用已移植好的)
//配置編譯關係 kconfig -> make menuconfig -> .config ->make -> makefile ->zImage
$ cp ~/e/fs4412/2系統移植/1實驗/3第三天_內核移植/linux-3.14-fs4412.tar.xz .
$ tar -xvf linux-3.14-fs4412.tar.xz
$ cd linux-3.14-fs4412
$ make uImage //編譯生成適合u-boot bootm啓動的內核鏡像 uImage
$ make dtbs /*編譯設備樹
make meunconfig //圖像界面進行配置(如 指定新的驅動,內核裁剪)
make modules //只編譯模塊文件(.ko文件)
make //編譯所有 (但不包括uImage生成)
*/
$ cp arch/arm/boot/uImage /tftpboot/
$ cp arch/arm/boot/dts/exynos4412-fs4412.dtb /tftpboot/
}
{//tftp服務安裝
//----虛擬機上安裝tftp服務
$ sudo dpkg -s tftpd-hpa //檢查是否安裝tftp server
$ sudo apt-get install tftpd-hpa //如果未安裝,安裝 tftp-server
$ sudo vi /etc/default/tftpd-hpa //修改tftp服務器配置文件爲
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-c -s -l"
$ mkdir /tftpboot //創建tftpboot目錄,
$ sudo chmod a+w /tftpboot
$ sudo service tftpd-hpa restart //啓動 tftp-server
//-----驗證虛擬機tftp服務是否OK
$ sudo cat /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"
$ sudo service tftpd-hpa restart //如果有更改配置,需要重啓一下 tftp-server
$ cd /tftpboot
$ touch test
$ cd /tmp
$ tftp 127.0.0.1
tftp>get test
tftp>q
$ ls //看到有test文件,表示該tftp服務是OK的
//---準備待傳輸文件
拷貝 第一天_環境搭建裏面裏的 u-boot-fs4412.bin uImage exynos4412-fs4412.dtb 到 /tftpboot 目錄下
}
{//nfs服務安裝
$ service nfs-kernel-server /*檢查nfs服務是否安裝
如果顯示下面信息, 表示有安裝
* Usage: nfs-kernel-server {start|stop|status|reload|force-reload|restart}
如果沒有,需安裝
#sudo apt-get install nfs-kernel-server
*/
$ sudo vi /etc/exports /*修改配置文件,指定共享目錄位置
在末尾追加
/nfs/rootfs *(rw,sync,no_root_squash)
或 /source/ *(rw,sync,no_subtree_check)
*/
$ sudo mkdir /nfs
$ sudo chmod 777 /nfs
$ cd /nfs
$ 拷貝 1第一天_環境搭建 下的 rootfs.tar.xz 到 /nfs 目錄下 //rootfs.tar.xz是已製作好的根文件系統
$ tar -xvf rootfs.tar.xz
$ sudo chmod 777 rootfs
$ sudo /etc/init.d/nfs-kernel-server restart //重啓nfs服務(使得前面修改生效)
$ sudo mount -t nfs localhost:/nfs/rootfs/ /mnt/ //測試nfs服務是否安裝成功。
$ ls /mnt/ /*如果其中的內容和/nfs/rootfs中一致。 表示有掛載成功
如顯示下面內容,表示成功
bin dev etc lib linuxrc mnt proc root sbin sys tmp usr var
*/
$ sudo umount /mnt
}
}
{//目標機安裝(u-boot燒寫調試) -- 需要SD卡
{//製作SD卡,並從SD卡啓動 (使用的是2010版本u-boot,支持fastboot燒寫的)
將sdfuse_q 拷貝到Linux下
將SD卡插入電腦並識別
進入sdfuse_q執行如下操作
$ sudo ./mkuboot.sh /dev/sdb /*出現下面的信息,表示SD啓動盤製作成功
Fuse FS4412 trustzone uboot file into SD card
/dev/sdb reader is identified.
u-boot-fs4412.bin fusing...
1029+1 records in
1029+1 records out
527104 bytes (527 kB) copied, 5.31834 s, 99.1 kB/s
u-boot-fs4412.bin image has been fused successfully.
Eject SD card
*/
關閉開發板電源,將撥碼開關SW1調至(1000)(SD啓動模式)
剛纔做好的SD啓動盤插入SD卡插槽
打開電源
}
{//---fastboot燒寫
連接USB線到板子上的USB OTG口
連接串口線到板子的COM2口
重啓板子,並快速停下,在串口終端輸入下面命令 /*
如果有有需要,可以格式化 eMMC 並創建分區
$ fdisk -c 0
$ fatformat mmc 0:1
$ ext3format mmc 0:2
$ ext3format mmc 0:3
$ ext3format mmc 0:4
*/
$ reset 重啓切換到2010版的sd卡啓動
$ fastboot //會提示裝驅動,選中第一天_環境搭建裏的fastboot_driver 安裝
打開dos終端 進入USB_fastboot_tool\platform-tools目錄輸入
> fastboot.exe flash bootloader u-boot-fs4412.bin /*
同理可以燒錄其它鏡像
> fastboot.exe flash kernel zImage
> fastboot.exe flash ramdisk ramdisk-uboot.img
> fastboot.exe flash system system.img
> fastboot -w
*/
關閉開發板電源,將撥碼開關SW1調至0110(EMMC啓動模式)後打開電源
從flash 的u-boot啓動 /*
如果啓動失敗,可以通過撥號開關恢復到SD卡方式啓動
如果啓動成功,想恢復到原來的u-boot啓動 (第一次輸入reset後會自動切換回去,不用拔撥號開關)
*/
}
}
{//1. 板子串口能顯示信息
連接串口線到板子的COM2口 //如果是用筆記本電腦的,需裝usb轉串口驅動(用360驅動大師在線裝方便)
確認撥號開關SW1 爲0110 (從EMMC(FLASH的一種) 啓動)
{//? 無串口打印信息
波特率設置不對, 流控未選爲無
電腦用的可能是COM2
u-boot被破壞了,切換到SD卡啓動(SW1 改爲1000)
}
}
{//2. 板子能ping通虛擬機 (要關閉防火牆 網卡右鍵高級)
------------------------
|板子 192.168.9.9 |
------------------------
|
------------------------
|電腦 192.168.9.222 | //做中轉用,和板子虛擬機IP要在同一網段, 且不能和它們IP一樣
------------------------
|
------------------------
|虛擬機 192.168.9.120 |
------------------------
//---------確認板子和電腦是能通信的
設置電腦網卡ip 爲192.168.9.222 255.255.255.0 192.168.9.1
啓動板子,快速按任意鍵停在boot處,設置u-boot 的環境變量
# setenv serverip 192.168.9.120 //注意它與虛擬機裏 ubuntu 的ip要一致
# setenv ipaddr 192.168.9.9
# setenv gatewayip 192.168.9.1
# pri /*查看設置後效果
FS4412 # pri
baudrate=115200
bootargs=root=/dev/nfs nfsroot=192.168.9.120:/nfs/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.9.9
bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000
bootdelay=3
ethact=dm9000
ethaddr=11:22:33:44:55:66
gatewayip=192.168.9.1
ipaddr=192.168.9.9
netmask=255.255.255.0
serverip=192.168.9.120
*/
# ping 192.168.9.222 //測試網絡是否連通 ,注意在u-boot中, 它能ping電腦, 電腦不能ping它
//注意,要拔掉jtag線,否則ping 會重啓
host 192.168.9.222 is alive //is alive 表示ok
# saveenv 保存設置
//---------確認電腦和虛擬機時能通信
編輯 -> 虛擬網絡編輯器 -> VMnet0 橋接到(選連板子的網卡) //注意不要用automic,應手動指定對應的網卡
虛擬機 -> 設置 -> 網卡適配器 -> 自定義 (選 VMnet0) /*使虛擬機內的虛擬網卡,關聯到電腦實際用到的網卡
通過選VMnet0 和 VMnet1 。實現連板子,還是上internet的切換
*/
點ubuntu右上角網絡圖標 -> 右鍵選編輯連接 -> 全刪掉 -> 添加(改新連接名稱爲board)
-> IPV4 設置 -> 方法(選手動) -> 點添加 設置爲 192.168.9.120 255.255.255.0 192.168.9.1 並保存退出
點右上角網絡圖標,先斷開,再選board連接 // 通過選board,和internet 實現連板子,還是上internet的切換
$ ifconfig //看ip是否已變爲了192.168.9.120
$ ping 192.168.9.222 //測試電腦和虛擬機是否聯通 (如不通,可嘗試修復一下網卡,重啓虛擬機)
//---------確認板子能和虛擬機能通訊
$ reset 重啓boot
$ ping 192.168.9.120 //注意: boot階段是板子能ping 電腦 ,電腦不能ping板子
host 192.168.9.120 is alive //通訊OK ,失敗會顯示not alive
}
{//3. 網絡自動 tftp 加載內核,並掛載nfs rootfs 啓動
# setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000 /* 設置tftp方式加載內核
setenv bootcmd 設置環境變量(自啓動命令 bootcmd)
tftp 41000000 uImage\; 通過tftp從虛擬機/tftpboot目錄下下載內核uImage到板子的內存 41000000 處。 \; 用於分割多個命令
tftp 42000000 exynos4412-fs4412.dtb 通過tftp下載設備樹文件 exynos4412-fs4412.dtb 到板子的內存 42000000 處
bootm 41000000 - 42000000 啓動內核(41000000處放的是內核uImage, 42000000處放的是設備樹文件)
*/
# setenv bootargs root=/dev/nfs nfsroot=192.168.9.120:/source/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.9.9 /* 掛載nfs rootfs
setenv bootarg 設置環境變量( bootarg是啓動參數)
root=/dev/nfs 指定根文件系統類型是 nfs
nfsroot=192.168.9.120:/source/rootfs 指定source rootfs的位置 (是在ip 是192.168.9.120的機器上 ,的/source/rootfs目錄下). 注意/nfs/rootfs必須和前面NFS服務配置文件設置一致
*/
# savenenv //保存環境變量
掉電重啓動板子 /* 看能否掛載nfs rootfs成功
能看到下面信息表示成功
[root@farsight ]# ls
etc linuxrc proc sbin tmp var
bin dev lib mnt root sys usr
在裏面創建文件,電腦的/nfs/rootfs上同步變化
*/
}
}