移植最新的内核之:使内核的打印信息可以在串口输出

内核版本: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

这样内核的打印信息就可以正常从传偶输出了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值