2011년 12월 02일

요즘은 dd 명령으로 mtd 장치들을 쓸 수 있게끔 하는 작업을 하고 있습니다.

분명히 이전에 만든 제품은 dd명령으로 부트로더, 커널 등을 업데이트 했었는데, 새로 만든 제품에서는 이 기능이 동작하지 않고 있습니다.


전원을 내렸다
올립니다. 


... 중략 ...
Creating 3 MTD partitions on "NAND 1GiB 3,3V 8-bit":

0x00000000-0x00040000 : "Bootloader"
0x00040000-0x00340000 : "Kernel"
0x00340000-0x40000000 : "File System"
...중략...



이런 로그가 찍힙니다.

반드시 이 로그는 커널 소스코드 내에 있을 것입니다.
grep 신공을 펼쳐서 커널 코드를 찾을겁니다.

키워드는 Creating, partitions 그리고 Bootloader, Kernel 입니다.

....
....
....

아하!
여기 있었군요.. 
 
여기 /linux/arch/arm/plat-s3c24xx/common-smdk.c 파일입니다.

struct mtd_partition s3c_partition_info[] = {
        {
                .name = "Bootloader",
                .offset = 0,
                .size = (256*SZ_1K),
                .mask_flags = MTD_CAP_NANDFLASH,
        },
...중략... 


내 타겟보드에는 S3C6410 이 들어가 있는데 경로는 s3c24xx입니다.

6410으로 폴더 만드는 것이 어렵나요?

삼성 커널 개발자들은 숨바꼭질을 좋아하나봅니다.

이건 여기 linux/drivers/mtd/maps/ 디렉토리 안에다가 정의를 하셨어야죠.

찾기 어렵잖아요.

숨바꼭질을 종료하겠습니다.




다음으로 struct mtd_partition 파일이 어디에 선언되어있는지 찾아봅시다.

리눅스 크로스 레퍼런스(http://lxr.linux.no) 에서 찾습니다.

...
...
...

여기 linux/include/linux/mtd/partitions.h 파일에 선언되어 있군요.

이렇게...

struct mtd_partition {

        char *name;                     /* identifier string */

        u_int32_t size;                 /* partition size */

        u_int32_t offset;               /* offset within the master MTD space */

        u_int32_t mask_flags;           /* master MTD flags to mask out for this partition */

        struct nand_ecclayout *ecclayout;       /* out of band layout for this partition (NAND only)*/

        struct mtd_info **mtdp;         /* pointer to store the MTD object */

};



인터넷 어딘가에서 Bootloader와 kernel을 쓰기 가능하게 하려면 MTD_WRITEABLE 을 mask_flags에 추가하라고 하던데...

저 위에 적어놓은 파일을 보니 mask_flags = MTD_CAP_NANDFLASH 라고 되어 있습니다.
MTD_CAP_NANDFLASH가 뭔지 볼까요?

여기 linux/include/mtd/mtd-abi.h 파일에 정의되어 있습니다.

//Some common devices / combinations of capabilities

#define MTD_CAP_ROM             0

#define MTD_CAP_RAM             (MTD_WRITEABLE | MTD_BIT_WRITEABLE | MTD_NO_ERASE)

#define MTD_CAP_NORFLASH        (MTD_WRITEABLE | MTD_BIT_WRITEABLE)

#define MTD_CAP_NANDFLASH       (MTD_WRITEABLE) 


아하! MTD_WRITEABLE 이 들어가 있군요.
NAND Flash 메모리의 파티션에는 MTD_CAP_NANDFLASH 라고 마스킹 해 주면 쓰기 가능이 되나 봅니다.

이제 테스트만 해 보면 되겠죠.
오늘은 시간이 없으니, 테스트는 다음주에 ㄷㄷㄷㄷㄷㄷ

 

+ Recent posts