간만에 글을 올리네요..
atmel at91sam9m10g-45 target board를 테스트 하고 있습니다.
보드를 받았을 때 android 가 올라가 있었는데 RoofFS가 jffs2로 되어 있더군요.
그래서 현재 RoofFS를 yaffs2로 바꾸는 작업을 하고 있습니다.
.config를 보니 yaffs2는 이미 체크되어 있는상태고 해서 MTD 파티션 나누고
이미지파일만 nand에 써주면 되겠다 싶었죠. 그래서 mtd block을 아래와 같이 나눴습니다.
static struct mtd_partition __initdata ek_nand_partition[] = {
{
.name = "kernel",
.offset = 2 * 1024 * 1024, /* kernel + RootFS (start : 0x20_0000 = 2MB) */
.size = 5 * 1024 * 1024, /* size : 5MB */
},
{
.name = "system", /* yaffs2 android system : mtd@system */
.offset = 5 * 1024 * 1024,
.size = 95 * 1024 * 1024,
},
{
.name ="userdata", /* yaffs2 android userdata : mtd@userdata */
.offset = 100 * 1024 * 1024,
.size = 64 * 1024 * 1024,
},
{
.name = "cache",
.offset = 164 * 1024 * 1024, /*64 * 1024 * 1024*/
.size = 60 * 1024 * 1024,
},
{
.name = "test", /*for debug*/
.offset = 224 * 1024 * 1024, /*64 * 1024 * 1024*/
.size = MTDPART_SIZ_FULL,
},};
그리고 커널의 menuconfig에서 "General Setup --> Initial Ram filesystem and RAM disk
(initramfs/initrd)support"를
"../mydroid/out/target/product/sam9m10/root" 로 설정해서 out/root 의 내용을 기반으로
Kernel의 uImage에 RootFS를 포함하게 했습니다.
그런다음 올리고 커널과 android를 컴파일 해서 sam-ba tool (atmel download tool) 로
0x200000에 uImage(kernel), 0x500000에 system.img(android),0x6400000에 userdata.img(android)를
올렸습니다.
그리고 uboot env설정을
setenv bootargs 'mem=128M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=yaffs2 init=/init rootdelay=1'
또는
setenv bootargs 'mem=128M console=ttyS0,115200 root=/dev/mtdblock0'
이렇게 두가지로 바꾸고 부팅을 시켰더니 .....
-------------------------------------------------------------------------------------------
rtc-at91sam9 at91_rtt.0: hctosys: unable to read the hardware clock
atmel_mci atmel_mci.0: Using dma0chan0 for DMA transfers
atmel_mci atmel_mci.0: Atmel MCI controller at 0xfff80000 irq 11, 1 slots
atmel_mci atmel_mci.1: Using dma0chan1 for DMA transfers
atmel_mci atmel_mci.1: Atmel MCI controller at 0xfffd0000 irq 29, 1 slots
Freeing init memory: 408K
Warning: unable to open an initial console.
yaffs: dev is 32505857 name is "mtdblock1"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.1, "mtdblock1"
block 425 is bad
block 426 is bad
block 583 is bad
android_usb gadget: high speed config #1: android
android_usb gadget: config #1
yaffs_read_super: isCheckpointed 0
yaffs: dev is 32505858 name is "mtdblock2"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.2, "mtdblock2"
yaffs_read_super: isCheckpointed 0
yaffs: dev is 32505859 name is "mtdblock3"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.3, "mtdblock3"
block 393 is bad
yaffs_read_super: isCheckpointed 0
init: cannot find '/system/bin/sh', disabling 'console'
init: cannot find '/system/bin/servicemanager', disabling 'servicemanager'
init: cannot find '/system/bin/vold', disabling 'vold'
init: cannot find '/system/bin/debuggerd', disabling 'debuggerd'
init: cannot find '/system/bin/app_process', disabling 'zygote'
init: cannot find '/system/bin/mediaserver', disabling 'media'
init: cannot find '/system/bin/installd', disabling 'installd'
init: cannot find '/system/etc/install-recovery.sh', disabling 'flash_recovery'
init: cannot find '/system/bin/keystore', disabling 'keystore'
enabling adb
adb_open
adb_release
adb_open
android_usb gadget: high speed c
-------------------------------------------------------------------------------------
라고 뜨고 멈춰버립니다.
대충 원인을 생각하기에
1. system 폴더가 yaffs2로 mount가 잘못되었나??
-> out/root/에 있는 init.rc에는 mount yaffs2 mtd@system /system 이라고 mount를 하기는 했음.
근데 이게 잘못되었나?
2. sam-ba로 system.img를 nan에 write 할 때 잘못되었나??
-> 구글에서 찾으니 uboot에서 yaffs2 파일을 다운할 때는 nand.write.yaffs2라고 방식을 좀 틀리게 해야 된다 더군요.
3. RootFS를 인식을 못하나?
-> kernel menuconfig 로 merge 하기는 했는데 이렇게 하면 안되나?
등등 여러생각은 나지만 확실히 뭐가 문제인지 모르겠네요.. 고수님들의 의견을 부탁드립니다.
댓글 5
-
맥주
2011.04.14 11:50
-
김영일
2011.04.14 12:58
이백님 답변 감사드립니다.
이전에 mtd 나눈부분이 있어서 사이즈가 잘못되었네요...근데 사이즈를 수정해도 마찬가지 였습니다.
결과는 똑같이 system 폴더안의 내용을 인식못하네요.
그래서 혹시 nand write 할 때 atmel 에서 제공한 툴이 oob 를 고려하지 않고 write하는 것이 아닌가 싶네요...
sam-ba 라는 툴인데 이게 이전에는 jffs2만 사용하게 되어 있더군요...
에구...언능 해야 되는데...죽갔네요... 뭐 해결책이 없을까요?
-
맥주
2011.04.14 20:03
rootfs 도 yaffs 인데, rootfs의 init는 init.rc를 바탕으로 수행하는 것이기 마운트 등을 수행하는 것으로 보아 정상 동작 하는 것 처럼 보입니다. 아니면, init는 static 으로 컴파일 되기 때문에, init만 제대로 wirte되었다면, 혼자 동작 할수도 있겠네요. bad 영역을 아닌곳에 쓰여 졌을 수도 있으닌까요.
툴에 문제가 있는 것이 확실하다면, uboot의 이미지 퓨징 기능을 사용해야 할 것 같습니다.
yaffs2 이미지도 쓰기가 가능 한 것을 아실 것입니다.
만약 system 이미지 자체에 문제가 있는 것이라면, mtd로 부팅 하지 말고, nfs로 부팅 하는 방법으로 rootfs 와 system, data 이미지를 검증 할 수 있습니다. 컴파일 해서 생성된 디렉토리를 한 디렉토리에 몽땅 복사하고 권한을 수정해 줘야 합니다.
root/ 를 nfs의 / 로 복사하고, system/, data/ 디렉토리 자체를 복사 해서 mtd 마운트 하지 않는 방법으로 이미지 자체를 검증 할 수 있습니다. 이것 또한 손이 많이 가긴 하지요.
별로 해답이 되진 않는 것 같네요. 아무쪼록 이미지 퓨징이 잘 되시길 바랍니다.
-
김용욱
2011.04.15 01:00
파일이 있지만 에러가 났을 가능성도 의심해봐야 합니다.
혹시 링커가 제대로 있는지요? 이런 경우도 발생할 수 있습니다. cannot find는 링커가 없는 경우에도 발생이 합니다. 저의 경우에는 링커가 symobls 내에만 있고 system에선 없어 해당 문제를 겪었습니다.
-
김영일
2011.04.15 13:41
좋은 답변 주신 분들 감사드립니다.
.
{
.name = "system", /* yaffs2 android system : mtd@system */
.offset = 5 * 1024 * 1024,
.size = 95 * 1024 * 1024,
},
.offset = 5 * 1024 * 1024 + 2 * 1024 * 1024, 가 되어야 하지 않을까요?
그 뒤 파티션도 offset이 틀린것 같습니다..