임베디드/7202

[커널] mtd 관련 sst

shellbt 2006. 10. 26. 14:30
제목: mtd가 안되요

글쓴이: 초보왕
글쓴날: 2002년 09월 25일 오전 11:42
URL : http://kelp.or.kr/korweblog/?story=02/09/25/1740122


안녕하세요
mtd에 대해서 너무 모르는것이 많아서 질문을 올림니다.
우선 지금 제 앞에 있는 보드는
MPC850 cpu에 SST39VF040 128K를 부트롬으로 쓰고요
SST39VF160 2M를 두개부처서 4M를 커널 이미지와 루트파일을
initrd형태로 넣어 사용합니다. 램디스크로 부팅하고요
4M에서 남는 여분을 mtd를 써서 사용하고 싶은데요
제가 이쪽으로는 아는게 아무것도 없어서 많은 가르침 부탁드립니다.

소스를 쭉보니까 drivers/mtd 에 관련된것들이 있는거 같은데요
physmap.c 와 tqm8xxl.c 를 많이 쓰는거 같은데 뭐가 다른건지
모르겠어요
그리고 CFI와 JEDEC의 차이점도 모르겠거던요 어떤걸 쎠야하느지도
감이 안잡히고요 jedec.c와 jedec_probe.c에 칩 정보가 없길래
자료를 보면서 넣어보긴 했거던요.. 흠..
그리고 menuconfig할때 mtd설정을 모르겠어요
호스트 pc는 86계열이고 타겟은 ppc니까 빅엔디안 으로 하는게 맞는지..
2M짜리 칩을 두개써서 32bit 4M로 만들었는데 buswidth와 interleave는 어떻게 잡아야하는지..
SST칩에대한 옵션은 하나도 없는데 AMD껄로 해도 되는지..
주소가 부트롬이 E0000000이고 bank2가 E1000000으로 시작하는데 CFI Flash
physical memory map에다가 어떻게 써넣어야 하는지..
전혀 모르겠어요..
그래서 SST39VF160과 mtd로 검색한 결과.. 이런 말이 있더라고요

Add the device ID and Size info to jedec_probe.c
That code should handle the 55/aa bits already
- dwmw2

그래도 감이 안잡혀요.. 답변좀 해주새요~~~~
글쓴이: 초보왕
글쓴날: 2002년 10월 01일 오전 09:34

답변 감사드립니다.
지금 저의 상태는

jedec_probe.c 에

mfr_id: MANUFACTURER_SST,
dev_id: SST39VF160,
name: "SST 39VF160",
DevSize: SIZE_2MiB,
CmdSet: P_ID_AMD_STD,
NumEraseRegions: 1,
regions: {ERASEINFO(0x1000,512),
//ERASEINFO(0x10000,32),}
이부분을 추가했고요
drivers/mtd/chips/에있는 jedec_probe.c과 cfi_cmdset_0002.c를
수정하며 결과를 보고 있습니다.
unlock에 관한것은 잘은 모르지만..
unlock1 에 0x5555를, unlock2에 0x2aaa를 넣어주면 동작은 되는것
같던데요..

jedec_probe.c에서는

//cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, CFI_DEVICETYPE_X8, NULL);
//cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, CFI_DEVICETYPE_X8, NULL);
cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, CFI_DEVICETYPE_X16, NULL);
cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, CFI_DEVICETYPE_X16, NULL);

이렇게 8을 16으로 바꾸니까 잡히더군요.. 왜그런지는 모름니다.. 우선 잡히는게 급했지요.

그래서 나온 커널 메시지는

MTD Sharp chip driver <ds@lineo.com>
physmap flash device: 400000 at e1000000
Search for id:(bf 56) interleave(2) type(1)
Probe at addr_unlock1(0x00000000 + 0x00555555) past the end of the map(0x003fffff)
Search for id:(bf 2782) interleave(2) type(2)
Found: SST 39VF160
Physically mapped flash: Found 2 x16 devices at 0x0 in 16-bit mode
number of JEDEC chips: 1
mtd: Giving out device 0 to Physically mapped flash
Using physmap partition definition
Creating 3 MTD partitions on "Physically mapped flash":
0x00000000-0x000c0000 : "kernel"
mtd: Giving out device 1 to kernel
0x000c0000-0x003c0000 : "initrd"
mtd: Giving out device 2 to initrd
0x003c0000-0x003f0000 : "User FS"
mtd: Giving out device 3 to User FS

이렇게 나오더군요 Giving out device라는 메시지의 뜻이 뭔지 궁금합니다.

cat /proc/mtd 하면
[root@WHITE_STONE admin]# cat /proc/mtd
dev: size erasesize name
mtd0: 00400000 00002000 "Physically mapped flash"
mtd1: 000c0000 00002000 "kernel"
mtd2: 00300000 00002000 "initrd"
mtd3: 00030000 00002000 "User FS"

이렇게 나오고요
파일 시스템을 minix로 쓰려고 하는데 명령을 내리면..
[root@WHITE_STONE admin]# mkfs.minix /dev/mtdblock3
64 inodes
192 blocks
Firstdatazone=6 (6)
Zonesize=1024
Maxsize=268966912

이렇게 나오면서 프롬프트로 빠져 나갑니다. 하지만 파일시스템은 안잡히네요
[root@WHITE_STONE admin]# mount -t minix /dev/mtdblock3 /mnt
VFS: Can't find a Minix or Minix V2 filesystem on device 1f:03.
mount: wrong fs type, bad option, bad superblock on /dev/mtdblock3,
or too many mounted file systems

아래에 있는것은 mkfs.minix와 mount를 할때 커널 메시지 입니다.
mtdblock_open
ok
mtdblock_release
ok
mtdblock_open
ok
mtdblock: read on "User FS" at 0x1000, size 0x1000
mtdblock: read on "User FS" at 0x0, size 0x1000
mtdblock: write on "User FS" at 0x0, size 0x1000
mtdblock: write on "User FS" at 0x1000, size 0x1000
mtdblock_release
mtdblock: writing cached data for "User FS" at 0x0, size 0x2000
ok
mtdblock_open
ok
mtdblock: read on "User FS" at 0x400, size 0x400
VFS: Can't find a Minix or Minix V2 filesystem on device 1f:03.
mtdblock_release
ok
mtdblock_open
ok
mtdblock_release
ok

지금 여기까지 왔는데요 잘 가고 있는것인지도 잘 모르겠습니다.
어떻게 하면 파일시스템을 사용할수 있을까요?


글쓴이: 즐거운이
글쓴날: 2002년 09월 27일 오후 04:42

안녕하세요? 저와 같은 플래시를 사용하시는 군요..
일단.. 저와는 사용하는 CPU가 다르군요.. 저는 arm720T 계열입니다.
아마 많은 점이 다르겠지요?
일단 저는 kernel 버전 2.4.18를 사용했습니다.
저는 구형의 AMD_flash.c를 고쳐서 사용했습니다.
SST_flash.c로 ^ ^,
일단 님이 사용하고 계시는 flash는 많은 부분에서 AMD와
비슷합니다. AMD는 Block단위로만 다루고 있는데.. SST는
Block과 sector를 다 다룰 수 있습니다.
명령을 주는 주소와 명령만 약간 차이가 있습니다.
이점 알고 계시구요.. 아 그리고 칩을 전체를 지우는 명령어도
SST는 가지고 있네요.. 이거 편하던데.. 저에겐요.. ^ ^
block단위이면 32개의 Block으로 크지만.. sector면 약 512개을
사용할 수 있어서 좋습니다. 머 지우는데..조금 시간은 걸리죠..
참 저는 unlock에 대한 부분은 찾질 못했습니다. 혹시
님이 아니면 알려주시면 감사..
mtd_info *amd_flash_probe에서 적당하게..
amd_flash_info table을 만들어 주세요..
sector로 한다면..

mfr_id: MANUFACTURER_SST,
dev_id: SST39LF160,
name: "SST AM29LV160DB",
size: 0x00200000,
numeraseregions: 1,
regions: {
{ offset: 0x000000, erasesize: 0x01000, numblocks: 512 }

이렇게 되겠네요...

아참 만드실 때 주의 이건 chip 하나에
대한 겁니다. size는 0x00200000이 되겠죠? 2M인깐요..
32bit니.. buswidth는 4입니다. 8bit가 1이죠..