内核版本:3.4.2
首先复习下bootloader是如何启动内核的:
theKernel = (void (*)(int, int, unsigned int))0x30008000;
theKernel(0, 362, 0x30000100);
/*
* mov r0, #0
* ldr r1, =362
* ldr r2, =0x30000100
* mov pc, #0x30008000
*/
上面的r1就是bootloader传递给kernel的机器id,kernel会根据这个机器id来调用相应的平台的初始化函数。
使用
shanl@shanl-Aspire-4740:~/Linux/1st/arch/arm$ find -name "mach*.o"
./mach-s3c24xx/mach-gta02.o
./mach-s3c24xx/mach-at2440evb.o
./mach-s3c24xx/mach-jive.o
./mach-s3c24xx/mach-vr1000.o
./mach-s3c24xx/mach-smdk2410.o
./mach-s3c24xx/mach-smdk2443.o
./mach-s3c24xx/mach-nexcoder.o
./mach-s3c24xx/mach-n30.o
./mach-s3c24xx/mach-bast.o
./mach-s3c24xx/mach-mini2440.o
./mach-s3c24xx/mach-vstms.o
./mach-s3c24xx/mach-otom.o
./mach-s3c24xx/mach-osiris.o
./mach-s3c24xx/mach-rx3715.o
./mach-s3c24xx/mach-smdk2440.o
./mach-s3c24xx/mach-tct_hammer.o
./mach-s3c24xx/mach-qt2410.o
./mach-s3c24xx/mach-rx1950.o
./mach-s3c24xx/mach-h1940.o
./mach-s3c24xx/mach-smdk2416.o
./mach-s3c24xx/mach-amlm5900.o
./mach-s3c24xx/mach-anubis.o
./mach-s3c24xx/mach-osiris-dvs.o
./mach-s3c24xx/mach-smdk2413.o
发现我们编译的这个uImage支持很多单板,这个需要进行裁剪
kernel的machid定义在Mach-types.h (arch\arm\include\asm) 34 2012-6-9
这个文件又包含另一个Mach-types.h(编译时生成的)
下面看看uboot中是如何将机器id传递给内核的(Cmd_bootm.c (common)):
do_bootm --> boot_fn = boot_os[images.os.os];->boot_fn(0, argc, argv, &images);
boot_os是个数组,里面有do_bootm_linux函数
do_bootm_linux -》boot_jump_linux
由boot_jump_linux可知机器id可以由两种渠道获取:
1.可以从环境变量中获取:s = getenv("machid");
2.也可以从默认值中获取:gd->bd->bi_arch_number = MACH_TYPE_SMDK2410; // 193
下面试验一下,随便设置一个机器id:
set machid 3213243243
启动内核后就会提示下面错误信息:
Error: unrecognized/unsupported machine ID (r1 = 0x13243243).
Available machine support:
ID (hex) NAME
00000400 AML_M5900
0000014b Simtec-BAST
0000015b IPAQ-H1940
0000039f Acer-N35
00000290 Acer-N30
000002a8 Nex Vision - Otom 1.1
00000454 QT2410
000000c1 SMDK2410
000005b4 TCT_HAMMER
000001db Thorcom-VR1000
000005d2 JIVE
000003fe SMDK2413
000003f1 SMDK2412
00000377 S3C2413
00000474 VSTMS
00000695 SMDK2416
000002de Simtec-Anubis
00000707 AT2440EVB
000007cf MINI2440
000002a9 NexVision - Nexcoder 2440
0000034a Simtec-OSIRIS
00000250 IPAQ-RX3715
0000016a SMDK2440
00000518 GTA02
000003b8 HP iPAQ RX1950
0000043c SMDK2443
Please check your kernel config and/or bootloader.
从上面可知我们的内核已经支持了2440芯片,
那么我们就按照提示设置一个机器id(0000016a SMDK2440):
这样设置的话就会找到:./mach-s3c24xx/mach-smdk2440.c文件中的初始化函数了
设置后,不会出现打印错误信息了,但是重新启动发现有乱码,如下所示:
将:
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(16934400);
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
修改为:
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000);
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
重新编译内核(make uImage)后发现还是有乱码
继续设置下波特率:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=yaffs2
这样内核的打印信息就可以正常从传偶输出了