S32V平台uImge文件生成问题

平台信息 Link to heading

Boot:u-boot-2016.01_bsp10.0

内核:linux-4.1.26_bsp10.0

uboot编译 Link to heading

1$ export ARCH=aarch64
2$ export CROSS_COMPILE=/opt /gcc-linaro-4.9-2014.11-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
3$ make s32v234evb_config
4$ make 						

kernel编译 Link to heading

1$ export ARCH=arm64
2$export CROSS_COMPILE=/opt /gcc-linaro-4.9-2014.11-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
3$ make s32v234_defconfig 
4$ make all

模块安装 Link to heading

1$ make modules
2$ make INSTALL_MOD_PATH=./modules modules_install 

uImage配置 Link to heading

1mkimage -A arm64  -O linux -T kernel -C none -a 0xC80080000 -e 0xC80080000 -n "Linux test s32v234-evb"  -d arch/arm64/boot/Image uImage

这个时候会报错:

以上就是我的执行的流程。我刚刚开始认为我的mkimage参数不正确,所以我花了点时间专门研究了这个工具的参数的配置选项和相关的意义,然后我就将arch参数改为了arm这个时候我完全可以编译出的,这就证明了我的参数是配置正确的,然后我就开始怀疑是不是本身这套代码的框架上不支持arm64的框架,这个是很正常的,通过报错提示也说明他不支持。我就查询了相关文档找到了如何添加框架补丁的修改文档,我发现这个框架数据结构早就添加了ARM64的框架。

在/common/image.c的框架结构体是支持的:

 1static const table_entry_t uimage_arch[] = {
 2    {	IH_ARCH_INVALID,	NULL,		"Invalid ARCH",	},
 3    {	IH_ARCH_ALPHA,		"alpha",	"Alpha",	  },
 4    {	IH_ARCH_ARM,		"arm",		"ARM",		  },
 5    {	IH_ARCH_I386,		"x86",		"Intel x86",	},
 6    {	IH_ARCH_IA64,		"ia64",		"IA64",			},
 7    {	IH_ARCH_M68K,		"m68k",		"M68K",			},
 8    {	IH_ARCH_MICROBLAZE,	"microblaze",	"MicroBlaze",},
 9    {	IH_ARCH_MIPS,		"mips",		"MIPS",			},
10    {	IH_ARCH_MIPS64,		"mips64",	"MIPS 64 Bit",	},
11    {	IH_ARCH_NIOS2,		"nios2",	"NIOS II",		},
12    {	IH_ARCH_PPC,		"powerpc",	"PowerPC",		},
13    {	IH_ARCH_PPC,		"ppc",		"PowerPC",		},
14    {	IH_ARCH_S390,		"s390",		"IBM S390",		},
15    {	IH_ARCH_SH,		  "sh",		"SuperH",		},
16    {	IH_ARCH_SPARC,		"sparc",	"SPARC",		},
17    {	IH_ARCH_SPARC64,	"sparc64",	"SPARC 64 Bit",	},
18    {	IH_ARCH_BLACKFIN,	"blackfin",	"Blackfin",		},
19    {	IH_ARCH_AVR32,		"avr32",	"AVR32",		},
20    {	IH_ARCH_NDS32,		"nds32",	"NDS32",		},
21    {	IH_ARCH_OPENRISC,	"or1k",		"OpenRISC 1000",},
22    {	IH_ARCH_SANDBOX,	"sandbox",	"Sandbox",		},
23 	{	IH_ARCH_ARM64,		"arm64",	"AArch64",		},	// 这个是我们预期的配置
24    {	IH_ARCH_ARC,		"arc",		"ARC",			},
25    {	IH_ARCH_X86_64,		"x86_64",	"AMD x86_64",	},
26    {	-1,					"",			"",				},
27};

这个时候我开始迷糊了。

最后我就将报错信息一一定位到具体的代码中去,这个过程废了很长时间,我将整个64K头的解析匹配我都找到了,我本来是想直接写死框架,但是这个处理很不好也没有成功,一旦你不指定-A的时候就会默认为PowerPC,于是我就将PowerPC的位置和arm64的位置调换了,就可以了。

我打开了我编译出的mkimage文件:vi mkimage,也是支持arm64的呢。

下边是他的执行流程:-A 支持的框架就是圈红的地方。和代码中写的框架还是有出入的。

这个里面的打印信息都是我自己调试的时候添加上去的。保留着也好,能够清晰的看到他执行的时候的匹配过程。

See also in s32v Link to heading