系统移植笔记总结

第一节–环境配置

用到的资源
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 init=/linuxrc ip=192.168.1.123
		解释:
		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
bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000
解释:
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-cs1@5000000 {    //bank1 物理设备 描述    CS0为40000000
			compatible = "simple-bus";  //对象的名字
			#address-cells = <1>;  //该对象/设备使用到的 寄存器
			#size-cells = <1>;
			reg = <0x5000000  0x1000000>; 
			ranges;

			ethernet@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" ; 表示    启动 / (根目录)
			};
		};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值