Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Karta MMC i obsluga FAT12/FAT16 w C

szaro 26 Apr 2005 11:01 9821 43
Computer Controls
  • #1
    szaro
    Level 19  
    Od pewnego czasu staram sie uruchomic karte MMC pod AVR-kiem i nic .Znalazłem gotowe biblioteki do kart MMC ale bez obsługi FAT ,moge tylko odczytac i zapisac blok (512B) .Docelowo chodzi mi o odczyt (<-na poczatek odzczt :) ) pliku z karty (nazwa pliku ,katalog , i oczywiscie zawartosc :D )Moze ktos ma jakis przyklad ?lub moze mi wyjasnic w jai sposob sa zapisywane pliki na karcie ??
    Pozdrawiam
  • Computer Controls
  • #2
    LordBlick
    VIP Meritorious for electroda.pl
    szaro wrote:
    może mi wyjaśnić w jaki sposób są zapisywane pliki na karcie ??
    Blokowo po 512 bajtów. To jest podstawowa jednostka zapisu. Obsługę FAT16 z pewnością znajdziesz np. w nawet starych źródłach jądra systemu Linux, a bliżej tematu to będzie Yamp, są wersje z obsługą kart MMC. Powodzenia !
    Light'I
  • Computer Controls
  • #3
    szaro
    Level 19  
    ok a w jakiej paczce to znajde (w linux-ie) a moze moglbys tak bez szczegolow wyjasnic zasade ??
  • Helpful post
    #4
    LordBlick
    VIP Meritorious for electroda.pl
    paczka kernel... jak rozpakujesz to powinno być co nieco i w Documentation i gdzieś też będzie "filesystems". Więcej nie pamiętam... ;)
  • #5
    szaro
    Level 19  
    juz wiem cos wiecej :D ale mam jeszcze pare pytan
    na poczatku dysku (karty) znajduje sie Bootsector(superblock) i zajmuje 512B czyli jeden klaster w przypadku FAT16 (karta 32MB) w ktorym sa zapisane wszystkie istotne parametry dysku a co dalej ? tablica FAT ?? tylko jakos sie nie doszukalem ile ona zajmuje miejsca ??i jak sa opisane foldery bo z tego co wyczytalem to opisanie jednego pliku zajmuje 32B ??
  • #6
    elektryk
    Level 42  
    szaro wrote:
    na poczatku dysku (karty) znajduje się Bootsector(superblock) i zajmuje 512B czyli jeden klaster w przypadku FAT16 (karta 32MB)
    Mylisz pojęcia, bootsektor ma 512B ale nie ma nic wspólnego z klasterem, bootsektor to poprostu 512bajtów które zawierają tablice parametrów, a czy tam będzie fat czy ex2 czy ntfs to nie jest to zapisane w bootsektorze tylko w tablicy partycji.
  • #7
    szymtro
    Level 30  
    Foldery są opisane tak samo jak pliki tylko maja inny atrybut, nie ma podanego rozmiaru a tylko adres gdzie zaczynają się opisy plików. O ile dobrze pamiętam to opis katalogu jest chyba krótszy od pliku o dwa bajty.

    A i jeszcze jedno:
    sformatuj sobie ta kartę na komputerze, potem wrzuć tam ze trzy proste pliki textowe i jeden katalog - ale wrzućtam gotowe a nie tworzone odrazu na karcie. Potem odpowiedni program do analizowania (cos jak winhex) który potrafi przeczytać dysk bajt po bajcie i zobaczysz jak na dloni jak wygladaja pliki i katalogi naprawdę.

    A tak swoja droga to zauważyłem że XP jak kasuje plik na pamieci typu flash to go nie kasuje tylko zmienia mu nazwę na jakąś dziwna i atrybuty - też na jakieś dziwne?
  • #8
    szaro
    Level 19  
    gdzies wyczytalem ze tablica FAT ma rozmiar 63 sektorow a jeden sektor ma 512B to daje 32 256B zakaladjac ze jeden wpis (plik) zajmuje 32B to moge zmiescic 1008 plikow i folderow ??

    szymtro wrote:
    Foldery są opisane tak samo jak pliki tylko maja inny atrybut, nie ma podanego rozmiaru a tylko adres gdzie zaczynają się opisy plików. O ile dobrze pamiętam to opis katalogu jest chyba krótszy od pliku o dwa bajty.

    to jak to jest z tymi folderami z jakas zawartoscia napisales ze jest podany adres gdzie zaczynaja sie opisy plikow ,ale gdzie te opisy sie znajduja ? w tablicy FAT ?
  • #9
    tajwoj
    Level 24  
    Hej,
    Moze coś Ci pomogą biblioteki Pascala Stanga.
  • Helpful post
    #10
    elektryk
    Level 42  
    szaro wrote:
    gdzies wyczytalem ze tablica FAT ma rozmiar 63 sektorow a jeden sektor ma 512B to daje 32 256B zakaladjac ze jeden wpis (plik) zajmuje 32B to moge zmiescic 1008 plikow i folderow ??
    NIE, tablica FAT i katalogi to coś zupełnie innego. FAT określa które sektory logiczne i w jakiej kolejności tworzą plik, a katalog liste nazwe pliku w danym katalogu.

    szaro wrote:
    to jak to jest z tymi folderami z jakas zawartoscia napisales ze jest podany adres gdzie zaczynaja się opisy plikow ,ale gdzie te opisy się znajduja ? w tablicy FAT ?
    Folder to jest taki plik który zawiera liste plików z atrybutami, datą, rozmiarem i numerem pierwszej jednostki alokacji pliku.
  • #11
    szaro
    Level 19  
    jakos dalej nic z tego nie wiem :( czy moze mi ktos tak krok po kroku wytlumaczyc jak to dziala ??
  • #12
    BoskiDialer
    Level 34  
    mi sprawnie poszło napisać obsługe FAT12 i zmieścić program w 512B (ze sporym zapasem wolnego miejsca). rozmiar tablicy fat jest zapisany w bootsektorze (+0x16/2B). w okolicach tego rozmiaru znajduje sie również ilość kopii (+0x10/1B), a jeszcze gdzieś ilość wpisów katalogu głównego (+0x11/2B). mając te dane można łatwo napisać obsługe fat12 (fat16 jest prostrze gdyż podczas dekodowania tablicy fat nietrzeba dekompresować* wpisów).

    więc tak: bootsektor fat12 (zresztą każdy inny również tyle że z możliwym innym rozmiarem) ma swój nagłówek o rozmiarze 59B (62B-3B na JMP+NOP). tam jest zapisana geometria CHS dysku, ilość sektorów tablicy fat, ilość kopii tablicy fat, ilość wpisów w katalogu głównym, numer seryjny, ilość zarezerwowanych sektorów itd.. tablica fat zaczyna się pod numerem sektora równym ilości ukrytych sektorów, a rozmiar jest zapisany bezpośrednio w bootloaderze.. aby obliczyć numer pierwszego sektora katalogu głównego trzeba obliczyć:
    "HiddenSector + FatTables*SectorsPerFat", a rozmiar katalogu głównego (w sektorach) jest równy:
    "(EntriesInRootDir*32+511) div 512"..

    Jeśli ktoś jest zainteresowany w załączniku jest mój kod (asembler/nasm) takowego loadera. można tam zobaczyć jak rozwiązałem poszczególne problemy (kod może być nieczytelny z powodu optymalizacji)
    * - dekompresować - w fat12 jeden wpis ma 12bitów więc dla oszczędności 2 wpisy zajmują 3 a nie 4 bajty.
  • #14
    DosinskY
    Level 18  
    Wtam,

    Pozwolicie, ze podepne sie pod ten temat sprzed roku ;) zeby nie tworzyc nwego.
    Korzystajac z materialow pod linkami podanymi przez piotr_go oraz analizy karty mmc sformatowanej pod windows WinHEX-em, utworzylem boot sector dla FAT16 jak ponizej:

    Code:

    boot_sec[0] = 0xEB;
    boot_sec[1] = 0x00;
    boot_sec[2] = 0x90;
    boot_sec[3] = 0x4D;
    boot_sec[4] = 0x53;
    boot_sec[5] = 0x44;
    boot_sec[6] = 0x4F;
    boot_sec[7] = 0x53;
    boot_sec[8] = 0x35;
    boot_sec[9] = 0x2E;
    boot_sec[10] = 0x30;
    boot_sec[11] = 0x00;
    boot_sec[12] = 0x02;
    boot_sec[13] = 0x01;
    boot_sec[14] = 0x02;
    boot_sec[15] = 0x00;
    boot_sec[16] = 0x02;
    boot_sec[17] = 0x00;
    boot_sec[18] = 0x02;
    boot_sec[19] = 0x9A;
    boot_sec[20] = 0xF4;
    boot_sec[21] = 0xF8;
    boot_sec[22] = 0xF3;
    boot_sec[23] = 0x00;
    boot_sec[24] = 0x20;
    boot_sec[25] = 0x00;
    boot_sec[26] = 0x01;
    boot_sec[27] = 0x00;
    boot_sec[28] = 0x00;
    boot_sec[29] = 0x00;
    boot_sec[30] = 0x00;
    boot_sec[31] = 0x00;
    boot_sec[32] = 0x00;
    boot_sec[33] = 0x00;
    boot_sec[34] = 0x00;
    boot_sec[35] = 0x00;
    boot_sec[36] = 0x00;
    boot_sec[37] = 0x00;
    boot_sec[38] = 0x29;
    boot_sec[39] = 0x5B;
    boot_sec[40] = 0xA9;
    boot_sec[41] = 0x6D;
    boot_sec[42] = 0x94;
    boot_sec[43] = 0x4E;
    boot_sec[44] = 0x4F;
    boot_sec[45] = 0x20;
    boot_sec[46] = 0x4E;
    boot_sec[47] = 0x41;
    boot_sec[48] = 0x4D;
    boot_sec[49] = 0x45;
    boot_sec[50] = 0x20;
    boot_sec[51] = 0x20;
    boot_sec[52] = 0x20;
    boot_sec[53] = 0x20;
    boot_sec[54] = 0x46;
    boot_sec[55] = 0x41;
    boot_sec[56] = 0x54;
    boot_sec[57] = 0x31;
    boot_sec[58] = 0x36;
    boot_sec[59] = 0x20;
    boot_sec[60] = 0x20;
    boot_sec[61] = 0x20;
    for (i=62 ; i<510 ; i++)
      {
        boot_sec[i] = 0x00;
      };
    boot_sec[510] = 0x55;
    boot_sec[511] = 0xAA;


    Zerowy sektor karty (sformatowanej pod windows na system plikow FAT16) zagrywam powyzszymi bajtami. Po wlozeniu karty do czytnika komputera i probie jej otwarcia, windows mowi: "brak nosnika w napedzie bla bla bla". Aby po takiej operacji przywrocic karte do uzytku, musze sformatowac ja w aparacie foto, bo windows nie jest w stanie jej sformatowac.
    Moze ktos z Was oswieci mnie gdzie robie blad. Gapie sie w to juz 3 dni i nic.

    pzdr,
    dosinsky

    Dodano:
    Z pomoca piotr_go udalo mi sie rozwiklac problem. Okazuje sie ze numer sektora na karcie nie pokrywa sie z numerem bloku karty i co za tym idzie boot sector nie znajduje sie w zerowym bloku karty. W zerowym bloku umieszczona jest miedzy innymi informacja w ktorym bloku znajduje sie boot sector.
  • #15
    elektryk
    Level 42  
    DosinskY wrote:
    Dodano:
    Z pomoca piotr_go udalo mi sie rozwiklac problem. Okazuje sie ze numer sektora na karcie nie pokrywa sie z numerem bloku karty i co za tym idzie boot sector nie znajduje sie w zerowym bloku karty. W zerowym bloku umieszczona jest miedzy innymi informacja w ktorym bloku znajduje sie boot sector.
    A możesz to wyjaśnić? Najlepiej jakoś "rysunkowo" na podstawie przykładowego dumpa z karty.
  • #16
    DosinskY
    Level 18  
    Z checia wrzuce dumpy pojutrze...akurat przed chwila pozyczylem moja jedyna karte i nie mam dzisiaj mozliwosci ;)
    Ale tak w skrocie opisowo to u mnie, dla 1 partycji FAT16, wyglada to tak:
    - pod zerowym blokiem karty znajduje sie 512 bajtow, glownie 0x00. Dwa ostatnie bajty maja wartosci takie same jak boot sector czyli 0x55 i 0xAA. Ponadto znajduje sie tam informacja o numerze bloku w ktorym siedzi boot sector (u mnie windows tworzy go pod 0x33 blokiem, ale podejrzewam ze wszystkie wyzsze sektory mozna sobie beztrosko "przesunac do dolu" modyfikujac zerowy blok. Mam nadzieje ze za bardzo nie motam ;) )
    - bloki od 0x01 do 0x32 zawieraja wylacznie bajty o wartosci 0x00
    - blok 0x33, jak wczesniej pisalem, zawiera boot sektor i stanowi pierwszy sektor karty.

    pzdr
  • #17
    elektryk
    Level 42  
    DosinskY wrote:
    - pod zerowym blokiem karty znajduje sie 512 bajtow, glownie 0x00. Dwa ostatnie bajty maja wartosci takie same jak boot sector czyli 0x55 i 0xAA. Ponadto znajduje sie tam informacja o numerze bloku w ktorym siedzi boot sector (u mnie windows tworzy go pod 0x33 blokiem, ale podejrzewam ze wszystkie wyzsze sektory mozna sobie beztrosko "przesunac do dolu" modyfikujac zerowy blok. Mam nadzieje ze za bardzo nie motam ;) )
    - bloki od 0x01 do 0x32 zawieraja wylacznie bajty o wartosci 0x00
    - blok 0x33, jak wczesniej pisalem, zawiera boot sektor i stanowi pierwszy sektor karty.
    No i wsio się zgadza ten pierwszy "prawie pusty" sektor to MBR, on może być opcjonalnie pusty, jeśli jest na dysku tylko jedna partycja.
  • #18
    zbv
    Level 20  
    Tak przy okazji nadmienię że na wątku o 89c51snd1 są linki do żródeł w C (Keil) i jest tam całkiem fajnie bo łatwa do adaptacji zrobiona obsługa FAT12/16 i32.
  • #20
    szymtro
    Level 30  
    No i jak udąło ci sie z tym fat?

    Ja przedwczoraj w ramach testu sprawdziłem sobie klartę (nie mmc a smart media) i pomimo tego że formatowana jest na fat12 to żadne fat nie jest wykorzystywane. Moze dlatego ze pliki są mniejsze nizjeden sector/cluster (mam 512). KArta była 2MB.

    Są dwie tablicze fat alle obie wygladaja tak samo: FE,FF,FF i tak ze 12 razy FF. To od adresu 1000h do 1800 (fat1) i od 1800 do 4000h.
    Od adresu 4000h zaczyna siegłówny katalog plików (root) i jest on aż do 8000h (jest tam 512 wpisów max po 32 bajty każdy) Każdy taki wpis definiuje gdzie zaczyna sieopisywany plik/katalog. Adres będzie zaczynał sieod 8000h jako domyślne tyle tylko że empirycznie pierwszys katalog ma wpisane 02 (sektor od adresu 8000h) a fizycznie zaczyna dokładnie w 8000h. UStaliłem że: te 02=x ((x-02)*512+8000h) będzie definiowało gdzie zaczyna siedany plik/katalog. Sprawdziłęm (miałem na karcie kilka katalogów/plików) i rzeczywiście pasuje.

    Nie sprawdziłem jeszcze fat16 na większej karcie ale mam wrażenie że win xp podchodzi "luźno" do opisów fat12/16[/img]
  • #21
    avr_elektronik
    Level 14  
    Witam !
    Czy ktoś uruchomił odczyt/zapis na karcie SD z systemem plików FAT ?
    Testowałem ostatnio biblioteki ELM-a, ale nic mi z tego nie wyszło.
    Może ktoś mnie nakieruje jak to ruszyć.
    Pozdrawiam
  • #22
    User removed account
    User removed account  
  • #23
    avr_elektronik
    Level 14  
    ok, zasady troszkę znam , ale mam problem pod AVR GCC z odpaleniem bibliotek od obsługi kart MMC/SD oraz FAT
  • #24
    Klima
    Level 30  
    avr_elektronik wrote:
    Witam !
    Czy ktoś uruchomił odczyt/zapis na karcie SD z systemem plików FAT ?
    Testowałem ostatnio biblioteki ELM-a, ale nic mi z tego nie wyszło.
    Może ktoś mnie nakieruje jak to ruszyć.
    Pozdrawiam

    A konkretnie, to co ci działa/nie działa? Ja używałem wersji 0.06 bodajże i wszystko działa (tzn. tak mi się wydaje - chodzę po katalogach, tworzę pliki, czytam itd.). Uruchomiłem to na Atmedze32L. Planuję kiedyś się za to zabrać i zapisywać dane do pliku. Ale czasu brak.
  • #25
    avr_elektronik
    Level 14  
    Klima -> możesz wrzucić na forum źródło z obsługą FAT + MMC.
  • #26
    Klima
    Level 30  
    avr_elektronik wrote:
    Klima -> możesz wrzucić na forum źródło z obsługą FAT + MMC.
    Tu wszystko jest:
    http://elm-chan.org/fsw/ff/00index_e.html
    No i link do archiwum:
    http://elm-chan.org/fsw/ff/ffsample.zip
    Jest tam projekt na AVR, w sumie dość dokładnie opisany.
    Muszę jednak powiedzieć, że ostatnio mam z tą biblioteką problemy. Wyskakuje mi czasem błąd przy synchronizacji (f_sync) nie wiem, czym jest spowodowany.
  • #27
    Jacek31
    Conditionally unlocked
    Quote:
    “Power of 2” Binary Page Size Option
    “Power of 2” binary page size Configuration Register is a user-programmable nonvolatile register
    that allows the page size of the main memory to be configured for binary page size
    (512 bytes) or standard DataFlash page size (528 bytes). The “power of 2” page size is a onetime
    programmable configuration register and once the device is configured for “power
    of 2” page size, it cannot be reconfigured again. The devices are initially shipped with the
    page size set to 528 bytes.

    Może ktoś powiedzieć o co w tym chodzi, i jakie to ma znaczenie przy próbie zrobienia z takiej kości, pamięci w FAT16. Dlaczego strona może mieć 512 lub 528B, wielkości??
    To kawałek z noty katalogowej pamięci FLASH na SPI o rozmiarze 16MB.
  • #28
    gsn5a
    Level 12  
    Witam. Chciałbym poradzić się co do komunikacji mikrokontrolera z kartą mmc. ze strony:
    http://focus.ti.com/mcu/docs/mcusupporttechdocsc.tsp?sectionId=96&tabId=1502&abstractName=slaa281b
    Ściągnąłem sobie przykładowy kod programu. Nieco go pozmieniałem gdyż maminny rodzaj procesora msp w którym nie ma UART1 a jest tylkoUART0. nie wiem też dlaczego na schemacie pin 6 karty MMc jest podpięty do P5.6 zamiast do masy (ja podłączyłem go do masy). Pozostałe połączenia mam analogicznie jak na zamieszczonym w tym pdf'ie schemacie. Jedyne co udaje mi się uzyskać to poprawne odczytanie rozmiaru karty. Niestety w tym procesorku który posiadam (msp430f135 a nie msp430f169 jak w przykładzie TI) nie mogę zapisywać i odczytywać paczek 512B - zmieniłem więc to na paczki 256B. Problem jednak w tym że gdy próbuję coś zapisać do sektora karty to program nie potwierdza zapisu bloku. Nie wiem w czym tkwi problem. W programie niczego oprócz portów,zmiany Uarta1 na Uart0 oraz zmiany bufora 512B na 256B nie zmieniałem. Zastanawiam się czy problem tkwi ze złym podłączeniem karty do procesora ( jednak rozmiar karty jest odczytywany poprawnie) czy też w programie...
    Ja podłączyłem kartę MMC w sposób następujący:
    pin1 -------->P2.3 (port GPIO jako CS)
    pin2--------->MOSI Uarta0
    pin3--------->GND
    pin4--------->VCC (3.3V)
    pin5--------->SCK
    pin6--------->GND
    pin7--------->MISO
    Poznieważ procesor ten zasilany jest 3.3V wszystkie linie podłączone są bezpośrednio do karty MMC.
    Proszę kogoś obytego w tym temacie o uwagi!
    Pozdrawiam
  • #29
    kedzi1
    Level 18  
    Ja pisałem niedawno obsługę FAT16. Korzystałem z książki "Pamięci masowe w systemach mikroprocesorowych. Jest tam opisana obsługa dysków twardych i świetnie przedstawione systemy plików. Swoich źródeł nie mogę udostępnić bo to powstało w pracy.
  • #30
    Zbych_
    Level 25  
    gsn5a wrote:
    Niestety w tym procesorku który posiadam (msp430f135 a nie msp430f169 jak w przykładzie TI) nie mogę zapisywać i odczytywać paczek 512B - zmieniłem więc to na paczki 256B.


    Kartę musisz czytać i zapisywać pełnymi sektorami (512B). Przy odczycie możesz oczywiście pierwsze 256B zapisać w RAMie a drugie 256B wywalić w kosmos. Podobnie przy zapisie.