Linux移植一
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.
现在手上有两个开发板,一个是tiny6410,一个是OK6410-A.tiny6410上跑的是linux2.6.38,支持alsa,uboot支持yaffs2系统以及从sd卡启动linux,并且移植了qte的库.而ok6410上跑的是linux2.6.36,没有移植alsa库,默认安装的系统为cramfs系统,yaffs2系统需要再安装.用户空间音频编程仅支持oss方式,可以跑qtopia,不过qte库未移植或至少不完整.uboot仅支持从sd卡烧录uboot,不能直接启动linux.
总的来说tiny6410在linux方面提供了更全面的支持.不过在核心板的PCB设计上tiny6410至少在声卡这块远没有ok6410好,所以接下来我的工作是将tiny6410提供的linux2.6.38移植到ok6410上.方案有两种:
1.用ok6410提供的uboot + linux2.6.38
2.用tiny6410提供的uboot + linux2.6.38
先尝试第一种.
ok6410与tiny6410硬件资源差不多,都是2G的flash和256M的ram.ram型号相同为K4X1G163PE (两块),flash型号不同,ok6410是K9GAG08U0D,mlc一代。tiny6410是K9GAG08U0E,mlc二代。
移植方法:
进入2.6.38目录,/arm/mach-s3c64xx目录下即存放目标板子资源的地方.我需要修改的是mach-mini6410.c文件。使它的flash分区方式与ok6410提供的uboot保持一致.修改如下:
struct mtd_partition mini6410_nand_part[] = {
{
.name = "Bootloader",
.offset = 0,
.size = (1 * SZ_1M),
.mask_flags = MTD_CAP_NANDFLASH,
},
{
.name = "Kernel",
.offset = (1 * SZ_1M),
.size = (5*SZ_1M) ,
.mask_flags = MTD_CAP_NANDFLASH,
},
{
.name = "User",
.offset = (6 * SZ_1M),
.size = (120*SZ_1M) ,
},
{
.name = "File System",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
原因是uboot会传递ID给内核,内核判断不一致则退出运行。
参考链接:
http://hi.baidu.com/zybuaa/blog/item/5ef9164c12fe8afcd72afc9c.html
解决方法:
修改/arm/kernel/head.s,蓝色部分为增加的内容,强制给内核所需要的ID号.
ENTRY(stext)
//add by jdh
mov r0, #0
ldr r1,=0x9d8
ldr r2, =0x50000100
//end
setmodePSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode
@ and irqs disabled
mrcp15, 0, r9, c0, c0@ get processor id
bl__lookup_processor_type@ r5=procinfo r9=cpuid
movsr10, r5@ invalid processor (r5=0)?
再次编译内核,并加载到目标板上运行.
这一次能够正常加载内核,并能够识别声卡.
ALSA device list: #0: MINI6410 TCP cubic registered NET: Registered protocol family 17 VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5 s3c-rtc s3c64xx-rtc: setting system clock to 2000-01-01 00:00:01 UTC (946684801) Freeing init memory: 1412K mount: mounting /dev/mtdblock2 on /r failed: No such device /init: line 103: can't open /r/dev/console: no such file Kernel panic - not syncing: Attempted to kill init! [<c0178c44>] (unwind_backtrace+0x0/0xe4) from [<c0516104>] (panic+0x58/0x174) [<c0516104>] (panic+0x58/0x174) from [<c018ae54>] (do_exit+0x68/0x5e4) [<c018ae54>] (do_exit+0x68/0x5e4) from [<c018b694>] (do_group_exit+0x90/0xc4) [<c018b694>] (do_group_exit+0x90/0xc4) from [<c018b6d8>] (sys_exit_group+0x10/0x 18) one_wire_status: 2 [<c018b6d8>] (sys_exit_group+0x10/0x18) from [<c01735e0>] (ret_fast_syscall+0x0/ 0x30) one_wire_status: 4
我没有兴趣继续去修改cramfs系统,因为这是只读系统.所以接下来准备做第二步:在ok6410上移植用tiny6410提供的uboot + linux2.6.38.