OK6410移植LINUX

本文详细介绍了在OK6410平台上移植Linux 3.7.3的操作步骤,包括制作uImage、设置MTD分区、添加NAND驱动、配置DM9000网卡、构建YAFFS2根文件系统、烧写到NAND闪存、配置UBoot、实现LCD显示及触摸屏驱动,并涉及到内核裁剪的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

移植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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值