USB 대용량저장장치 잡을때 FAT 파일시스템 인식문제

you의 이미지

Embedded Board에서 NAND Flash를 FAT16으로 포맷하고 나서,
Windows에서 USB로 대용량저장장치로 드라이브를 인식시키면
포맷이 안되있다고 해서 포맷을 하고나면 이전에 Embedded Board에서
구워놨던 Firmware및 기타 등등이 다 인식불가더군요(당연하겠지만...)

저는 Embedded Board에서의 NAND Flash Memory Structure가 윈도우에서의 FAT16 파일시스템과 구조가 달라서 그렇지 않을까 생각했는데요...
(실제로 MBR영역은 다른것 같군요)
생각해보니 MBR이 인식이 안됐다면 대용량저장장치로 잡아도 access가 되지않을테고(포맷조차 불가능한...), 따라서 MBR은 인식했다는 얘긴데 그러면 파티션엔트리를 따라가서 FAT영역에 인식이 가능할테니... 파일시스템을 인식못해서 포맷을 하려고 하지는 않을거라는 생각이 들더군요

제가 질문드리고자 하는건 이 문제가

- Embedded Board의 USB Mass Storage측의 인터페이스 문제일지,
- 아니면 윈도우의 FAT 파일시스템이 메모리구조가 다른 NAND Flash의 FAT를 인식못해서 그런건지

하는겁니다. 답변 꼭 부탁드리겠습니다.

익명 사용자의 이미지

답변이라고 하기에는 뭐하지만...

일단 PC에 연결하고 로우 레벨로 드라이브를 열어 보시죠? MBR 부터 LBA 단위로 찾아가 보는 거죠. 그리고 윈도우가 FAT을 인식하기 위해 뭐가 부족한 지 보는 것입니다.

그런데 이런 일을 할려면 FAT 파일 시스템과 NAND 구조에 대해서 어느 정도는 알고 있어야 할 텐데...

어쨌거나... 이런 종류의 질문에는 뭐라고 답변하기가 힙들지 않을 까요? 보드와 깔려 있는 소프트웨어에 대해서 전혀 모르는 상황이니...

maximus의 이미지

NAND 에 firmware 가 같이 올라간 모양이군요.. (M-DOC 이죠?)
보드에서 MSDC 가 지원되는 모양인데 FAT 포멧이라고 하더라도 Partitioning 방법에 따라 틀리게 인식될수 있다고 봅니다.. FAT 라면 이러나 저러나 MBR (0,1번섹터죠?) 만 읽어서 parsing 하니까 아무래도 USB Controller 드라이버 data sheet 를 잘 살펴 보시면 뭔가 나오지 않을까 생각 됩니다..
(근데 firmware 까지 있는데 MSDC 로 하는건 위험하지 않나요?)

그게 아니라면 MSDC 모드 말고 USB Data mode(지원하는지 모르겠지만)로 프로토콜을 제작하여 통신 할수도 있을것 같구요.. (이것이라면 PC쪽에서 전용 프로그램이 있어야 겠지만서두)

제가 그쪽 전문이 아니라 정확하지 않은 부분이 있을수 있습니다..
그냥 참고만 하세요.. ^^

=================================
:: how about a cup of tea ? ::
=================================

kslee80의 이미지

혹시나, CPU 에서 사용하는 Endian 이 틀려서 나타난 결과가 아닐까요..

익명 사용자의 이미지

답변 감사드립니다...

현재의 NAND는 1번째블록의 0번째페이지가 MBR입니다. 즉,32번째 섹터가 MBR이죠...

하지만 윈도에서의 MBR은 1번째 섹터가 MBR이므로,
제가 생각하기엔 윈도에서 NAND를 access하려고 보니까 MBR정보가 없으므로 '포맷이 안되있다'는 메시지가 뜨지 않았나 봅니다만...

만약 이경우라면 PC에서 NAND access를 위한 전용프로그램을 짜는방법밖에 없겠죠?(아니면 NAND memory structure를 윈도처럼 바꾸던가...)

USB Mass Storage Class상에서 이 문제를 해결할 방법은 없는지요?
(참고로 현재 보드의 SD Card는 USB 대용량 저장장치로 PC에서 access가 잘 되고 있습니다... 따라서 endian같은 문제는 아니구요...)

익명 사용자의 이미지

윈도우가 하는 방법처럼 하셔야 합니다!
왜냐고요? 호환성 문제지요.

USB 대용량 저장 장치로 사용 가능하게 해 놓고 윈도우와 호환되지 않게 만들어 놓으면 골 때리는 문제가 참 많아 질 겁니다. 예를 들어 PC에 연결해서 보니까 파일 시스템이 이상하다고 해서 포맷해버리면 ...

반대로 윈도우와 호환되게 해놓으면 어디서도 동일하게 억세스 할 수 있기 때문에 전용 프로그램 같은 것을 만들 필요도 없고, 오에스 마다 신경써야 할 것도 상당히 줄어들지요. 전용 프로그램도 프로그램이지만 드라이버를 만들어야 하는 것은 심각합니다.

그런데 32번 섹터가 MBR이라고 해놓은 것은 혹시 NAND 용 파일 시스템 디자인상 그렇게 해 놓은 것은 아닐까요? 만약에 그렇다면 LBA 변환만 적절하게 해주시면 될 지도 모르겠군요. 예를 들어서 PC에서 요구하는 LBA - 32 정도? ^^;

또... NAND는 BAD BLOCK이 있을 수 있어서 이걸 따로 관리해줘야 한다는 것도 알고 계시죠? 그럼 physical to logical, logical to physical block 관리가 필요할 텐데요 이 부분은 그냥 무시하고 하시나요?

더 깊은 내용은 NAND 파일 시스템 만드신 분과 협의하는 것이 적당할 것 같습니다.

bluecafe의 이미지

간단하게 의견 드리면... ...

1. USB Mass Storage Interface 문제일 확률이 높습니다.

2. NAND Flash Driver를 가지고 있거나 M-DOC(?) 같이 IDE 인터페이스를 가지고 있는 녀석이라면 문제가 될수 없습니다. (M-DOC에대해서는 확인해 보지 못했습니다 죄송.. :oops: )

3. NAND Flash의 전체영역을 FAT 으로 사용하신다면 MBR, 혹은 PBR(Boot Sector)을 0번섹터에 두셔야 합니다. 그렇지 않으면 인식이 되지 않을것 같습니다.

4. 32번째 섹터가 MBR인 경우는 USB Read/Write할 때 Offset을 32섹터 만큼 주면 해결이 될것 같습니다.

KLDP에서 3년 동안 글만 읽다가 첨 글을 써보니 떨리고 부끄럽고 하네요.. :oops:
실례가 있다면 너그러이 봐주시길 바랍니다.

그럼.

익명 사용자의 이미지

NAND의 MBR을 32번 섹터로 잡은이유는 아마도 NAND memory structure의 디자인상 그렇게 한걸로 알고있습니다.

그렇다면 LBA변환은 PC에서 할수밖에 없지않나요?
PC에서 볼때 MBR이 LBA-32일테니까요..
그럼 어차피 PC에서 전용프로그램을 짜야되지 않을까요?

아니면 다른 방법이 있는지...??

bluecafe의 이미지

또 글을 올리게 되네요.. 오늘은 아무래도 즐거운 맘으로 소주를 한잔해야 할듯..

NAND Flash structure 의 디자인상 이라는 부분이 이해가 되지 않네요..
일반적으로 NAND Flash는 Physical to Logical MAPPing을 통해서 관리를 하는것이 통례이고 여기에 Wearleveling 까지 더해지는 것으로 알고 있습니다.
만일 P <--> L 매핑을 하지않고 SSFDC 규격같은 Wearleveling을 하지 않으면 굉장히 위험한 시스템이 될 수 있습니다. (FAT영역 같은곳은 매우 잦은 Access가 일어나기 때문에 FAT이 포함된 블럭은 잘 깨질수 있다는 의미 입니다.)

그리고 MBR을 32번 섹터로 잡은 것은 괜찮아 보입니다. 앞서 답변에서도 말씀 드렸듯이 USB에서 Read 0 sector command가 왔을때 0 + 32 섹터의 위치를 읽어서 리턴해 주면 PC에서는 그것이 0번 섹터로 인식하기 때문입니다.

하루에 글을 두번씩이나.. 아이부끄.... :oops:

익명 사용자의 이미지

참고로 PC(윈도우, 도스)에서 FAT을 읽을 때에는 LBA 0가 가장 중요합니다. 시작점이니까요. 여기에 MBR이나 PBR이 꼭(!!!) 있어야 합니다. LBA 0가 정상적이지 않을 경우(MBR, PBR 포맷에 맞지 않을 경우) FAT 파일 시스템 초기화를 못합니다.

그리고 USB 대용량 저장장치 인터페이스 부분에 LBA를 읽는 명령과 쓰는 명령을 처리하는 부분이 있을 것입니다. PC에서 이 부분으로 넘어오는 파라미터를 조절해서(32를 빼든 더하든 해서) NAND 파일 시스템에 넘겨주라(또는 NAND를 직접 억세스 하라?)는 말입니다.

익명 사용자의 이미지

많은 분들이 답변해주셔서 정말 감사합니다^^

현재의 NAND 드라이버는 Physical to Logical 매핑을 하지않고 직접적으로 Physical address에 명령을 주는걸로 알고있습니다(제가 짠게 아니라...)
하지만 Bad Block 처리는 잘 해주고 있으니 그리 큰 문제는 없을것 같구요...

어쨌든, 현재 MBR이 32번섹터에 존재하므로 USB I/F에서 read루틴에 Block address + 32 를 해주고 시도해봤으나 역시나 마찬가지더군요...

원점으로 돌아가서......
아무래도 PC에서 MBR영역이 달라서 못읽었기때문에 문제가 발생했다고 보는걸 재고해봐야 할듯합니다.
(실제로 LBA+32를 해본결과...)
그외 문제가 될만한 소지가 뭐가 있을까요??

거듭 답변 감사드립니다.

익명 사용자의 이미지

가능하시면 LBA 0를 덤프해 보여주시는 것이 좋을 것 같습니다. 여기서 말하는 LBA 0는 여기가 확실해(!)라고 생각하는 곳이 아니라 PC에서 실제로 LBA 0를 요구할 때 읽어서 되돌려 주는 LBA 0 데이터를 말합니다. 임베디드 장치에서도 덤프를 뜰 수 있죠? 이때 데이터는 헥사 에디터에서 보여주는 방식으로 보여주는 것이 좋겠죠?

그리고 혹시 임베디드 장치에서 로그를 남길 수 있는 상황이라면 PC가 읽어가는 LBA 들과 이때 요구하는 길이를 로그로 만들어서 올려주시면 FAT 파일 시스템을 아시는 분들이 봐주실 수도 있을 것 같은데요.

예를들어 다음과 같은 로그가 있으면 도움이 되겠죠.

read LBA 0 1
read LBA 32 1
read LBA 33 4
...

의미는 LBA 0 부터 LBA 1개, LBA 32 부터 LBA 1개, LBA 33 부터 LBA 4개 ...

^^;

익명 사용자의 이미지

죄송하지만 윗분이 쓰신내용이 이해가 안되네요...
-----------------------------------------------------
여기서 말하는 LBA 0는 여기가 확실해(!)라고 생각하는 곳이 아니라 PC에서 실제로 LBA 0를 요구할 때 읽어서 되돌려 주는 LBA 0 데이터를 말합니다
----------------------------------------------------
이게 무슨말씀인지...?
그리고 제가 덤프나 로그를 어떻게 떠야할지 잘 몰라서요... 관련 사이트나 자료가 있으시면 알려주시면 감사하겠습니다...

어쨌든......
일단은 NAND memory structure를 바꿔서 테스트 해본 결과 역시 MBR영역의 문제가 맞더군요
NAND구조를 MBR을 0섹터로 바꿔서 테스트 해봤습니다...
음...그렇다면 역시 해결방법은 NAND구조를 바꾸는수밖에 없겠군요...전용프로그램을 짠다는건 USB대용량저장장치 기능을 안쓰겠다는 얘기이니...

어쨌든 지금까지 답변해주신 분들께 감사드립니다^^
제 질문에 이렇게 답변이 많이 붙은적인 처음이라...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.