天天看點

系統移植筆記總結第一節–環境配置第二節–bootloader第三節-- u-boot的移植:第四節–核心、裝置樹移植

第一節–環境配置

用到的資源

u-boot-2013.01.tar 提取碼:4doo

linux-3.14.tar 提取碼:w83e

rootfs.tar.xz提取碼:ho18

系統移植的要點:

  1. 搭建交叉開發環境
  2. bootloader 移植
  3. kernel 移植
  4. 根檔案系統 制作

一:嵌入式架構

app
		作業系統	(系統移植)
		驅動		(驅動開發)
		硬體		(headwear)
	
	嵌入式:冷冰冰的機器(硬體)注入靈魂(軟體)
           

二:環境搭建

1.環境搭建

嵌入式需要嵌入式開發環境,  交叉編譯
		1)交叉編譯工具的安裝	gcc-4.6.4/bin
		
		2)tftp的安裝和使用  客戶機<---->伺服器
		
			安裝:sudo  apt-get  install  tftpd-hpa  tftp-hpa 
			配置檔案-作用: sudo  vi  /etc/default/tftpd-hpa
			重新開機 sudo  service   tftpd-hpa   restart 
		3)nfs伺服器的使用   共享-[闆子/主機|用戶端/伺服器
			nfs:	fs,filesystem 檔案系統	nfs:網絡檔案系統
			安裝:   sudo apt-get install  nfs-kernel-server
			配置: sudo vim /etc/exports
			重新開機  sudo  /etc/init.d/nfs-kernel-server  restart 
				(or)sudo  service nfs-kernel-server restart
           

2.三大件的移植:

pc:	bios		  ->windows	->檔案系統  filesystem:fs
andriod:   recovery		->andriod	->fs
嵌入式:	u-boot		->linux		->fs	
三大件:	bootloader	    os		->fs
	
1):為什麼要系統移植?怎樣獲得三大件(借用其他闆子)?
	判斷兩塊闆子相同:
		i   CPU相同 
		ii  RAM flash 盡可能的相同
		iii 外設最好相同
2):
	1、交叉編譯工具  arm-none-linux-gnueabi-gcc
	
	2、tftp nfs  檔案系統
           

第二節–bootloader

一、bootloader:

為什麼需要bootloader:
			可以 修複/重裝/雙系統    更新系統核心功能
	bootloader ----->	硬體啟動的引導程式
		
		系統移植 首先移植的就是bootloader

	bootloader操作模式
		1自啟動模式
		2互動模式
           

bootloader基本功能

初始化硬體--->自搬移--->執行使用者指令--->加載核心
		詳細加載運作作業系統過程:
		####開機啟動--->執行硬體初始化動作--->進入互動模式/自動模式--->加載os 

		組成:   彙編  [開機啟動   核心硬體初始化(cpu 存儲 cache 序列槽等)  設定堆棧,跳轉到C]+   ==>
			C[大部分硬體初始化  互動模型/自動模式   加載os]
			
		第一階段
			初始化基本硬體(CPU DDR 序列槽 關看門狗)
			自搬移
			清BSS段和堆棧(bss段:存一些未初始化的變量 或者 全局變量)
		第二階段
			初始化本階段的硬體(flash 網口)
			讀取環境變量

		如果是自啟動模式 直接加載核心
		如果是互動模式 接收使用者指令
           

二、嵌入式bootloader

嵌入式bootloader:  (u-boot		 200KB)
		u-boot	:  universal bootloader,通用的 bootloader	
			既可以跑在PC上,也可以跑在其他的闆子上,一般跑在arm ppc 上.
           

三、u-boot如何使用-----

1、環境變量:
		FS4412 # printenv
		baudrate=115200		波特率:可以通過修改這個環境變量配置u-boot波特率
           
解釋:
		bootargs:  你告訴核心, 在核心啟動過程中的一些參數, 核心再啟動過程中,會讀取該變量,并執行相應動作
		root=/dev/nfs nfsroot=192.168.1.166:/home/lsf/src/rootfs rw   
		console=ttySAC2,115200  告訴核心你起來之後,使用序列槽2列印,波特率115200
		ip=192.168.1.123

	如何修改:set bootargs root=/dev/nfs nfsroot=192.168.1.167:/home/lsf/src/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.1.249
           
解釋:
u-boot如何自己知道加載哪一個os,如何加載os:   需要你告訴他如何去加載os
tftp 41000000 uImage;   從tftp伺服器下載下傳檔案uImage(os 核心)到RAM 41000000位址  
tftp 42000000 exynos4412-fs4412.dtb;  從tftp伺服器下載下傳檔案exynos4412-fs4412.dtb 下載下傳到RAM42000000位址
bootm 41000000  - 42000000
uboot進入自動模式,會依次執行裡面的每一條指令	作用:你告訴u-boot如何去加載正确的作業系統
如何修改: 
	set   bootcmd  tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000
	bootdelay=1		##進入互動模式的等待時間1秒
	ethact=dm9000
	ethaddr=11:22:33:44:55:66
	fileaddr 41000000
	filesize 2CAFC0
	ipaddr=192.168.1.123	####開發闆的ip位址
	netmask 255.255.255.0
	serverip 192.168.1.166	####設定tftp伺服器的 ip位址
	stderr=serial
	stdin=serial
	stdout=serial

	Environment size: 586/16380 bytes

	------------
           

關鍵字解釋

1、指令:
			printenv   列印環境變量
			setenv 設定環境變量
			saveenv 儲存環境變量
		####在設定環境變量時,需要進行删除,setenv 環境變量名稱 空格; saveenv
		2、
			ipaddr   闆端ip位址
			serverip  伺服器端ip位址(虛拟機位址)
			ethaddr  MAC位址 (一般不用它)
			
			###在使用tftp指令之前 需要開啟tftpd-hpa這個服務
		3、
		
			tftp  41000000 uImage   //該指令會從serverip指定的主機,通過tftp協定,下載下傳uImage檔案,到RAM 41000000位址中
			bootm :是go的更新版,主要用于執行核心
				bootm  核心位址  檔案系統位址   裝置樹位址
           

第三節-- u-boot的移植:

一、u-boot移植思想

1.架構選擇 單闆确定
	arm    exynos fs4412 參考 origen

2.交叉編譯
	uboot源碼目錄
	交叉編譯工具鍊
	Makefile
	ARCH = arm
	CROSS_COMPILE = arm-none-linux-gnueabi-
3.boot的編譯步驟
	make xx_config
	make
	make distclean
           

二、u-boot的移植:

工作量小  簡單,  因為u-boot目的是引導作業系統, 隻要 核心闆起來了,就可以加載os.  外設基本上不用關心.
		fs4412 => origen
	源碼: 頂層目錄,u-boot一級目錄,在該目錄下執行編譯 等操作.
           
  1. 平台相關的
    移植工作需要關注的内容
    		arch  /arm/cpu/xxxx    不同的cpu初始化代碼不一樣   		 		cpu原廠提供
    		##board  /samsung/origen  不同的闆子初始化代碼也是不一樣的   		開發者關注
    		##include/configs   /origen.h   不同的闆子配置檔案也是有差異的		開發者關注
    		origen.h用于控制整個u-boot的編譯動作
               
  2. 平台無關的
    比如 ping setenv 等指令,不同的平台 都擁有該功能   
    		網絡協定   
               

u-boot的編譯:

注意,一定要在頂層目錄下編譯 且配置交叉編譯環境
1.配置	告訴u-boot,你要編譯哪一個闆子的
			make  origen_config  ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
		
		2.編譯    make   ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
		3.結果   在頂層目錄下生成  u-boot.bin,可以燒寫到  flash中去的

		4.清空   make distclean
		
	u-boot的燒寫:在u-boot啟動之前,cpu會啟動自己的自啟程式,自啟程式比較強大(啟動序列槽、網卡、sd)
				  各個廠商的u-boot自啟程式不一樣的。
           

第四節–核心、裝置樹移植

###核心/kernel### uImage-核心的鏡像-2M

一、核心編譯:

1.配置核心		告訴核心你要編譯哪一個闆子的核心
		cp arch/arm/configs/exynos_defconfig .config
		修改配置  make menuconfig  ARCH=arm         通過圖形化界面 配置,  結果會寫回到.config
	2.編譯核心
		make uImage ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-   -j4
			前提是:sudo cp   u-boot/tools/mkimage /bin/
			
	3.結果:  	arch/arm/boot
		Image		5419020-5.2M	正宗的二進制核心鏡像,可以直接燒寫flash運作
		zImage		2763176-2.7MB    zipImage  Image經過壓縮之後的鏡像,運作之前需要解壓
		uImage 		2763240-2.7M    u-boot專用的zImage,  u-boot對zImage進行加工,添加64B的頭,生成uImage       

	4.清空   make distclean ARCH=arm

	#### but:	fs4412使用origen核心,發現啟動一半就死了  因為硬體差異  此時:
	
		1.通過make mennuconfig  配置核心,将我們需要的功能天添加進去核心.		dm9000的實驗[知名    廠商 知名的裝置]
		2.如果一個##驅動###沒有內建在核心中呢????      [你寫的驅動  一些小廠商的驅動 ....]	
		  你可以修改核心,将你的驅動加入核心.就可以通過menuconfig來配置和使用.
	
		Kconfig   決定如何在menuconfig顯示的			修改.config配置檔案
		menuconfig如何實作界面,會讀取各個目錄下的Kconfig來決定如何顯示
           

二、裝置樹編譯:

1、建立fs4412的裝置樹檔案  
			路徑 cp arch/arm/boot/dts/exynos4412-origen.dts  arch/arm/boot/dts/exynos4412-fs4412.dts
	
	2、修改Makfile編譯自己的裝置樹:
			vim arch/arm/boot/dts/Makefile   加入:exynos4412-fs4412.dtb \
	
	3、裝置樹檔案修改:
			vim  arch/arm/boot/dts/exynos4412-fs4412.dts
	
	4、編譯裝置樹	
			make dtbs  ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
	
	5、修改核心檔案drivers/clk/clk.c
		修改
		static bool clk_ignore_unused;
		為
		static bool clk_ignore_unused = true;
           

三、配置核心:

cp arch/arm/configs/exynos_defconfig  .config  需要先編譯裝置樹
		make menuconfig  ARCH=arm 
	
	
	make menuconfig  ARCH=arm		 修改核心
	make uImage  ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-  	編譯核心
	make dtbs  ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-		編譯裝置樹
           

四、裝置樹講解

#include "exynos4412.dtsi" //裝置樹頭檔案   有很多的裝置樹頭檔案

		例如:
		srom-[email protected]5000000 {    //bank1 實體裝置 描述    CS0為40000000
			compatible = "simple-bus";  //對象的名字
			#address-cells = <1>;  //該對象/裝置使用到的 寄存器
			#size-cells = <1>;
			reg = <0x5000000  0x1000000>; 
			ranges;

			[email protected]5000000 {
				compatible = "davicom,dm9000";
				reg = <0x5000000  0x2    0x5000004  0x2>;
				interrupt-parent = <&gpx0>;  //描述該硬體使用的是哪一個中斷控制器上的中斷	描述了該對象/硬體 使用到的中斷資訊
				interrupts = <6 4>;		//描述  該中斷控制器上的 具體哪一個中斷
				davicom,no-eeprom;
				mac-address = [00 0a 2d a6 55 a2];
				//status = "okay"/"disable" ; 表示    啟動 / (根目錄)
			};
		};
           

繼續閱讀