1、uboot(kernel)的编译不要在windows和linux的共享区(/mnt/hgfs/)做该过程。因为在uboot编译的过程中,会有些库文件或连接文件,但是这些文件在windows下会有些混乱。
2、编译的时候,尽量使用samsung提供的工具链。----arm-2009q3
---------------------------------------------------------------------------------------------------------------------------------------------------------------
编译的思路:
1、安装交叉工具链
将arm-2009q3.tar.bz2 拷贝到/usr/local/arm/下
#tar -jxvf arm-2009q3.tar.bz2
交叉工具链的目录:
/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
注意:该工具链是没有放到ubuntu的环境变量中,使用该工具链时,必须使用绝对路径。
--------------------------------------------------------------------------------
2、uboot源码的配置
1)通过源码顶层目录下Makefile文件设置工具链。
ifeq ($(ARCH),arm)
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
注意:与工具链的安装目录保持一致
2)针对GEC210平台的配置
在Makefile中找到:
gec210_nand_config : unconfig
@$(MKCONFIG) $(@:_config=) arm s5pc11x gec210 samsung s5pc110
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/gec210/config.mk
配置方法:
在uboot源码顶层路径下:
$ make gec210_nand_config
Configuring for gec210_nand board...
---------------------------------------------------------------------------------------
3、编译 ---->u-boot.bin
在uboot源码顶层路径下:
#make
/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-objdump -d u-boot > u-boot.dis
----------------------------------------------------------------------------------------
4、查看生成uboot可执行文件
$ file u-boot
u-boot: ELF 32-bit LSB executable, ARM, version 1, statically linked, not stripped
$ size u-boot
text data bss dec hex filename
393531 29068 285484 708083 acdf3 u-boot
-----------------------------------------------------------------------------------------
总结:
拿到一个发布源码,如何去编译???
1、设置交叉编译工具链---Makefile
2、针对某个具体的平台进行配置 ---->Makefile
3、make ---u-boot.bin
-----------------------------------------------------------------------------------------
注意一个问题:
uboot源码包在发布之前:
#make clean
#make distclean
二者的却别
#make clean 轻度的清除,相当于make的反向操作。
#make distclean 重度的清除,相当于 make和make gec210_nand_config的反向操作
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Uboot 移植
一、什么是移植?
将别人发布的源码(针对一个特定的平台)做修改,然后让这段代码可以在我们自己的平台上运行(GEC210)
移植的目标:GEC210(S5PV210)
移植的源码:必须支持该CPU(S5PV210)
移植的源码的来源:
1、CPU的官方网站/代理商
2、uboot官网(支持移植的CPU)
=========================================================================================================
二、将uboot移植到GEC210.
android_uboot_smdkv210.tar.bz2 ----> GEC210平台上
SMDKV210 ---->samsung
GEC210 ---->yueqian
不能这样做:
SMDK2440(S3C2440) --->GEC210
========================================================================================================
三、编译SMDKV210提供的uboot源码
1、安装交叉工具链
#tar -jxvf android_uboot_smdkv210.tar.bz2
通过顶层的Makefile文件设置交叉工具链。
ifeq ($(ARCH),arm)
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
2、针对特定平台(SMDKV210)做uboot源码的配置
在Makefile中的配置入口:
smdkv210single_config : unconfig
@$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/smdkc110/config.mk
通过配置入口可以得到几个信息:
$(@:_config=) --->smdkv210single
arm ---> cpu架构
s5pc11x ---> cpu的型号, s5pc11x是s5pv210的早期版本,在做s5pv210uboot源码时,使用了s5pc11x
smdkc110 --->board的名字。smdkc110相当于smdkv210的早期版本
samsung --->vendor 厂家的名字
s5pc110 --->soc 片上系统
#make smdkv210single_config
Configuring for smdkv210single board...
3、编译 ----uboot.bin不能直接在GEC210上运行(因为没有做移植)
在SMDKV210平台上运行
#make
========================================================================================================
四、uboot的源码结构分析
注意:
问题:uboot只是很多cpu架构、cpu的型号、板子平台;如何配置源码,使该源码支持一个具体的平台????????
答:
@$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110
类似与CPU传参,参数的名字($(@:_config=) arm s5pc11x smdkc110 samsung s5pc110)和源码目录文件的名字保持一致
1、lib_*
支持不同的CPU架构,与GEC210相关的是:lib_arm,针对arm架构的cpu公共的代码
2、cpu
uboot支持的cpu,与GEC210相关的是:cpu/s5pc11x/ 在该目录下有一个源文件start.S,该源文件是针对210平台的地址要执行的源文件(入口)
cpu/s5pc11x/s5pc110/
3、 /board/samsung/smdkc110/
板级初始化代码
4、include
头文件,与GEC210相关的文件:include/s5pc110.h
include/asm-arm
include/configs/smdkv210single.h
5、common
uboot的命令,公共的代码
6、api
uboot上设计应用程序的接口,公共的源码
7、doc
帮助说明文档
8、fs
文件系统的源码,公共的。
9、net
uboot的一些网络工具(ping tftp..)的源码
10、tools
uboot提供的一些工具,如:mkimage,公共的代码
========================================================================================================
五、uboot移植过程
分析SMDKV210与GEC210两块电子板的差异(分析原理图),针对差异做修改,完成移植
1、修改串口的控制台:将串口3改为串口1
SMDKV210: uart2
GEC210:uart0
serial3 ----> serial1
uart2 --->uart0
--------------------------------------------------------------
2、修改内存的配置
SMDKV210 :ch0:512MB 8bits * 4
ch1:512MB 8bits * 4
GEC210: ch0:256MB 16bits*2
ch1:256MB 16bits*2
提示:
1)GEC210平台内存的初始化是在uboot阶段完成的。内核阶段已经在内存中工作。内存的初始化非常关键
2)cotex-A8平台硬件设计是,最难的是内存的设计,尤其是在PCB阶段。why??
CPU与内存之间是一个高速电子线路 :时钟:200MHz
数据:800MHz
所以要注意电磁兼容性设计。
注意的问题:数据线要等长
--------------------------------------------------------------
3、网卡(通过比较两块板子原理图)
SMDKV210 --->DM9000 CE:CSn4/CSn5
CMD:ADDR0
GEC210 --->DM9000 CE:CSn1
CMD:ADDR2
1)确定基地址
s5pv210访问DM9000的基地址(由片选信号CSn1)
修改:
#define CONFIG_DM9000_BASE 0x88000000
2)确定地址的偏移量
s5pv210访问DM9000的地址偏移量(由地址线addr2)
CMD: addr2=1 DATA port
addr2=0 ADDRESS port
0b000 .... 0100 ---> 4
注意DM9000是工作在16bits模式,210访问dm9000的地址 4<<1 = 8
3)初始化srom1控制器
static void dm9000_pre_init(void)
{
unsigned int tmp;
/* DM9000 on SROM BANK1, 16 bit */
SROM_BW_REG &= ~(0xf << 4);
SROM_BW_REG |= (0x1 << 4);
//SROM1控制DM9000的时序
SROM_BC1_REG = ((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0));
//GPIO初始化
/* Set MP01_1 as SROM_CSn[1] */
tmp = MP01CON_REG;
tmp &=~(0xf<<4);
tmp |=(2<<4);
MP01CON_REG = tmp;
}
--------------------------------------------------------------
4、nor flash
SMDKV210 ---> AM29LV800BB
GEC210 --->无
将nor flash初始化的代码屏蔽掉
--------------------------------------------------------------
5、SRAM
SDMKV210 --->K6F1616U6A
GEC210 --->无
将sram初始化的代码屏蔽掉
--------------------------------------------------------------
6、PMIC---电源管理芯片
提示:什么是开关电源,什么线性电源??LM7805 --->线性电源
LM2576 --->开关电源
SMDKV210 --->max8698
GEC210 --->无
将将PMIC初始化这段代码屏蔽掉。
提示:
一般uboot只要能将初始化成功硬件的核心,能启动操作系统就OK了,与启动过程相关的功能模块可以不做移植(例如:usb、声卡、ADC、jpeg、MP4......)