全部博文(685)
分类: 嵌入式
2014-05-25 14:55:22
设置uimage入口:由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。
要理解程序的入口地址,自然想到的是连接文件,首先看看开发板相对于某个开发板的连接文件"/board/你的开发板/u-boot.lds"
1.修改顶层makefile和board.cfg:入口makefile中添加如下新内容,因为需要执行make xxx_config配置自己的板子---->在单板的数据库boards_cfg中添加自己单板的信息;
qljt2440_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t qljt2440 qljt s3c24x0
2:添加include/configs/xxboard.h和board/Samsung/xx_board目录:在 include/configs/ 中建立开发板所需的头文件xxx.h。
在头文件结尾处添加如下宏定义:
#define CONFIG_S3C2440_NAND_BOOT 1
#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x8000
--->在board/目录下建立自己的目录:该目录下含lowlevel_init.s、uboot.lds,config.mk及makefile,flash.c和xxxboard.c
此目录下修改flash.c、xxxboard.c分别保证flash读写和GPIO控制/PLL/flash初始化函数,makefile中添加flash.o和xxxboard.o,根据开发板内存区的配置修改lowlevel_init.S和uboot.lds;
3.修改start.s中部分寄存器地址的定义、时钟设置。
所以@$(MKCONFIG) –A $(@:_config=) 分解出来就是 mkconfig –A smdk4412,它的意思就是进入当前目录下的mkconfig文件并且传递两个参数(-A ,smkd4412)给它。
Boards_cfg为各单板的数据库文件,mkconfig读取数据库文件并初始化ARCH等系统变量;
内核移植
============================================================
Uboot从C函数跳到kernel的head.s汇编(用汇编因为这部分代码会读取CPU型号等需要直接读写寄存器)--->C函数跳到汇编,汇编再跳到C函数;
内核移植必不可少的修改
1.修改机器码:
内核的机器码在arch/arm/tools/mach-types(机器码库)+arch/arm/mach-s3c2440/mach_smdk2440.c文件,将其“MACHINE_START(S3C2440, "SMDK2440")”中的第一项改为与uboot码值对应的宏,在这里是S3C2440;
u-boot的机器码是在arch\arm\include\asm\mach-types.h,代码在board/xxx/xxx_board.c
Uboot的机器码一定要修改成与内核的一致,因为内核head.S中会检查uboot传来的机器码与MACHINE_START(S3C2440, "SMDK2440")中的机器码是否一致。
2.修改时钟
arch/arm/mach-s3c2440/mach-smdk2440.c
修改s3c24xx_init_clocks(12000000);
3.修改makefile中的ARCH和编译器类型:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
4.使用S5PV210处理器的默认选项,然后就可以make生成uimage了
arch/arm/configs文件夹中有许多命名为xxx_defconfig的配置文件,如果运行make xxx_defconfig,当前.config文件会由xxx_defconfig文件生成。
Kbuild系统:是一个编译框架(makefile框架,因为是基于make编译工具)
1.obj-?和xxx-objs:obj-?指定编译什么,怎么编译?其中的“?”可能是“y”或“m”,“y”指定把对象编译进内核中,“m”指定把对象编译为模块。语法如下; obj-? = $(target).o(target.o为某个o文件,也可能是多个o文件即xxx-objs);
xxx-objs指定了编译对象需要的文件,一般只有在源文件是多个时才需要它。
#drivers/isdn/i4l/Makefile
obj-$(CONFIG_ISDN) += isdn.o
isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o
2.EXTRA_CFLAGS:有时需要连接内核源代码外部的系统头文件,但Kbuild系统默认的系统头文件都在内核源代码内部,如何使用外部的头文件呢?
EXTRA_CFLAGS可以给Kbuild系统添加外部系统头文件,
EXTRA_CFLAGS += $(ext_include_path)
3.lib-?:所有用lib-y列出的objects在那个文件夹中被综合进单独的一个库,lib-y的使用方法通常被限制在lib/和arc/*/lib中。
#arch/i386/lib/Makefile
lib-y := checksum.o delay.o
Make menuconfig时scripts目录下工具会读取各目录下的kconfig(定义了makefile中会用到的变量)并形成菜单;
Make menuconfig或make xxx_defconfig后产生.config,.config中的变量都是已定义并配置过的为各子目录的makefile所用。
注:为子目录添加新kconfig时,需在父目录的kconfig中添加source “source "arch/arm/父目录/子目录/Kconfig"”
注:移植内核时添加flash驱动,为何是修改arch/arm/plat-s3c24xx/commond-smdk.c文件就行呢?--------->
http://blog.csdn.net/zhaole20094463/article/details/7884785
Vmlinux---->Image---->zImage---->uImage