移植linux-3.7.3
#mkimage工具
制作LINUX内核的压缩镜像文件,需要用到mkimage工具,在uboot的tools目录下,mkimage可以用来制作压缩/不压缩的多种内核镜像文件。如果uboot/tools中没有mkimage,可以尝试apt安装 sudo apt-cache search mkimage
Usage: mkimage -l image
-l ==> list image header information
mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
解压linux内核源代码
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
改上面这段代码的arch = arm和cross_compile = arm-linux-
准备
cp arch/arm/mach-s3c64xx/mach-mini6410.c arch/arm/mach-s3c64xx/mach-ok6410.c
#替换其中 mini6410 MINI6410
arch/arm/mach-s3c64xx/Makefile:
# Machine support
obj-$(CONFIG_MACH_OK6410) += mach-ok6410.o
#Kconfig
Kconfig用来描述所属目录源文档相关的内核配置菜单
arch/arm/mach-s3c64xx/Kconfig:
# S3C6410 machine support
config MACH_OK6410
bool "OK6410"
select CPU_S3C6410
select SAMSUNG_DEV_ADC
select S3C_DEV_HSMMC
select S3C_DEV_HSMMC1
select S3C_DEV_I2C1
select SAMSUNG_DEV_IDE
select S3C_DEV_FB
select S3C_DEV_RTC
select SAMSUNG_DEV_TS
select S3C_DEV_USB_HOST
select S3C_DEV_USB_HSOTG
select S3C_DEV_WDT
select SAMSUNG_DEV_KEYPAD
select SAMSUNG_DEV_PWM
select HAVE_S3C2410_WATCHDOG if WATCHDOG
select S3C64XX_SETUP_SDHCI
select S3C64XX_SETUP_I2C1
select S3C64XX_SETUP_IDE
select S3C64XX_SETUP_FB_24BPP
select S3C64XX_SETUP_KEYPAD
help
Machine support for the OK6410
添加之后执行make menuconfig就会有ok6410选项
添加ID
arch/arm/tools/mach-types:
ok6410 MACH_OK6410 OK6410 1626
回到linux根目录执行make menuconfig
如果报错 apt-get install libncurses* (提供字符中断处理)
为了使make xconfig不出错 build-essential kernel-package libqt3-headers libqt3-mt-dev
->Load an Alternate Configuration File 输出配置文件的路径arch/arm/configs中s3c6400_defconfig最接近ok6410
->General Setup
->Cross-compiler tool prefix 交叉工具链的路径
/home/forlinx/tools/arm-linux-gcc/bin/arm-linux-
->System Type
(0) S3C UART to use for low-level message
[*]OK6410
->Save an Alternate Configuration File
.config
此时在.config文件中可以看到配置信息
make uImage
在arch/arm/boot 下生成uImage zImage两种内核镜像
将uImage放入SD卡即可引导内核
内核启动地址entryadd
内核镜像加载地址loadadd fatload mmc 0 50008000 uImage
内核镜像入bootmadd bootm 50008000
1)如果loadadd == bootmadd ,bootm不会对uImage header后的zImage进行memory move的动作
而会直接go到entry point执行, 因此此时的entry point 必须为 loadadd + 0x40
如果kernel boot过程没有到uncompressing the kernel,就可能是设置不对
bootmadd == loadadd == entryadd - 0x40
2)如果loadadd != bootmadd , 需要避免memory move时因为覆盖导致zImage被破坏的情况
此时bootm会把uImage header后的zImage文件move到loadadd , 然后go到entry point开始执行
这段代码在common/cmd_bootm.c中的bootm_load_os函数中,此时loadadd 必须等于 entry point
bootmadd != loadadd == entryadd
linux/script/Makefile.lib:
修改入口点地址
UIMAGE_LOADADDR ?= arch_must_set_this
#UIMAGE_ENTRYADDR ?= $(UIMAGE_LOADADDR)
UIMAGE_ENTRYADDR ?= $(shell echo $(UIMAGE_LOADADDR) | sed -e "s/..$$/40/")
MTD分区
MTD(Memory Technology Device 内存技术设备)是linux系统中快闪存储器转换层
arch/arm/mach-s3c6x–/mach-ok6410.c
static struct mtd_partition ok6410_nand_part[] = {
[0] = {
.name = "uboot",
.size = SZ_1M,
.offset = 0,
},
[1] = {
.name = "kernel",
.size = SZ_2M,
.offset = SZ_1M,
},
[2] = {
.name = "rootfs",
.size = MTDPART_SIZ_FULL,
.offset = SZ_1M + SZ_2M,
},
};
>>>
static struct mtd_partition ok6410_nand_part[] = {
[0] = {
.name = "Bootloader",
.size = (1*SZ_1M),
.offset = 0,
.mask_flags = MTD_CAP_NANDFLASH,
},
[1] = {
.name = "Kernel",
.size = (5*SZ_1M),
.offset = (1*SZ_1M),
.mask_flags = MTD_CAP_NANDFLASH,
},
[2] = {
.name = "File System",
.size = (200*SZ_1M),
.offset = (6*SZ_1M),
},
[3] = {
.name = "User",
.size = MTDPART_SIZ_FULL,
.offset = MTDPART_OFS_APPEND,
},
};
make uImage
添加NAND驱动
将s3c_nand.c放入/dirvers/mtd/nand/
nand.h -> /arch/arm/plat-samsung/include/plat/
/dirvers/mtd/nand/Makefile:
obj-$(CONFIG_MTD_NAND_S3C) += s3c_nand.o #任意位置
添加menuconfig选项
/drivers/mtd/nand/Kconfig:
config MTD_NAND_S3C2410后添加
config MTD_NAND_S3C
tristate "NAND Flash support for S3C SoCs"
depends on (ARCH_S5P64XX || ARCH_S3C64XX || ARCH_S5PC1XX) && MTD_NAND
help
This enables the NAND