Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Obsługa kart pamięci Flash za pomocą mikrokontrolera

TMK_M 29 Lip 2004 20:41 3835 19
  • #1 29 Lip 2004 20:41
    TMK_M
    Poziom 22  

    Witam!
    Ostatnio w EP pojawiły sie artykuly o obsludze kart pamieci flash, a ja zawalilem sprawe bo zapozno sie o tym dowiedzialem, gdyz jest juz cz.5.
    Ztad teraz zwracam sie z prosba do was czy nie zarzucicie na forum skanow tych artykulow z EP, lub innych o tej tematyce.
    POZDRAWIAM

    0 19
  • #4 08 Sie 2004 19:01
    marchewa101
    Poziom 17  

    Mam zamiar wykorzystywac system plikow fat do zarzadzania pamiecia DataFlash (512kB i 2MB (bajty))
    na elektrodzie bylo pare ladnych linkow do opisow fat i wybralem ten:
    http://hubbard.engr.scu.edu/embedded/avr/avrlib/docs/html/index.html File List --> fat.c

    tylko jest jeden problem, a nawet dwa ;)
    1. tam jest urzywany on do obslugi dysku twardego, a ja cce zamiecin na data flash,
    i z tego co zaulwazylem to funkcja
    ataReadSectors( DRIVE0, PartInfo.prStartLBA, 1, SectorBuffer );
    diziala w ten soposob ze podawana jest dysk(niepotrzebne), sektor, ilosc sektorow do pobrania (zawsze 1), i buffor do ktorego ma wpisac zawartosc sektora.
    i powstaje pytanie ile bajtow to jest sektor - 512B??

    2. i nie wiem jeszcze jak uzyc funkcji:
    unsigned long fatGetDirEntry (unsigned int entry, unsigned int count);
    z tego co sie domyslam to entry to jest jakis miejsce pliku/katalogu, ale nic wiecej

    i jeszcze jest trzecie pytanie mniej zwiazane z konkretnym programem.
    3. jak stworzyc plik, ktory pozniej wgram do pamieci, zawierajacy sformatowany system pliku.
    Przyokazji moglbym na nim testowac prgram przed wgraniem go na proca przy uzyciu gcc na pc'ta
    wiem ze napewno sie da to jakos zrobic na linuxie, moze na łindołsie tez.

    prawdopodobnie komenda, ale nie wiem jak to zrobic:
    mkfs.vfat
    fsck.vfat

    a potem dobze by bylo to zamontowac, by wrzucic pare plikow :)
    mount ~/obraz_dysku /mnt/obraz_dysku -t vfat -o loop=/dev/loop0

    0
  • #5 08 Sie 2004 19:39
    elektryk
    Poziom 42  

    1. Standard to sektor 512B, ale jest to zapisane w strukturach dysku jako zmienna więc są możliwe inne rozmiary.
    3. Aby stworzyć plik musisz:
    - znaleźć wolną jednostke alokacji w tablicy FAT
    - zaznaczyć ją jako zajęta
    - (jeśli rozmiar pliku > rozmiar jednostki alokacji to utworzyć w tablicy FAT odpowiedni "łańcuch" jednostek alokacji
    - uaktualnić kopie FAT
    - znaleźć katalog (np katalog główny)
    - dodać wpis do katalogu (wpis zawiera min. nazwe pliku, nr pierwszej jednostki alokacji, rozmiar, date utworzenia i atrybuty)
    - (jeśli brakuje miejsca na nowy wpis to "wydłużyć" katalog o następny sektor [w przypadku głównego katalogu to jest limit na stałe dla FAT16, dla FAT32 też można "wydłużać" o kolejne sektory])
    - znaleźć numer sektora fizycznego na podstawie jednostki alokacji i tam zapisać dane
    - (zapisać opcjonalnie następne sektory pliku)
    Wszystko w nawiasach jest opcjonalne i zależne od przypadku

    Polecenie mkfs.xxxxx tworzy system pliku na danym nośniku a fsck.xxxxx dokonuje analizy i naprawia uszkodzenia. Jeśli chodzi o testowanie to polecam czytnik na USB zamiast czytnika podpinanego pod IDE gdyż mozna na bieżąco wyjmować karte z układu z procesorem i podpinać pod komputer.

    UPS, troche pomyliłem pytanko, chyba nie o to chodzi, ale napisałem sporo na ten temat i teraz szkoda kasować. Chyba koledze chodziło jak z poziomu komputera stworzyć plik zawierający obraz karty:
    mkfs.vfat /dev/urządzenie
    mount /dev/urzadzeni /mnt/karta
    cp plik /mnt/karta
    unmount /mnt/karta <= tak dla pewności że cache się zapisał
    cat /dev/urzadzenie > obraz_karty

    0
  • #6 08 Sie 2004 20:22
    marchewa101
    Poziom 17  

    wielkie dzieki...
    czyli jesli mam komende odczytujaca sektor z dysku to moge odczytac np 1024 bajty jezeli mam fat przygotowany do takiego sektora?

    Z tym tworzeniem plikow tez mi sie przyda, bo napewno bez tego tez sie nie obejdzie ;)

    tylko jest cos takiego ze nie mam podlaczonej tej pamieci do komputrka bo to jest pamiec z spi podlaczona do uC (mam butterflaya)
    i zwiazku z tym nie mam urzadzenia /dev/urządzenie odpowiadajacemu karcie...

    chyab ze by uzyc cos ala wirtualne uzadzenie, sformatowac je (z odpowiednia wielkoscia 512,2048kB) i potem stworzyc obraz,

    nastepnie ten obraz zapomoca uC wyslac przez port szeregowy
    jesli sie da to przez:
    cat obraz_data_flesza > /dev/ttyS0 (po wczesniejszym ustawieniu parametrow transmisji),
    a jezeli nie przez jakis wlasnorecznie napisany programik

    0
  • #7 08 Sie 2004 20:41
    elektryk
    Poziom 42  

    marchewa101 napisał:
    czyli jesli mam komende odczytujaca sektor z dysku to moge odczytac np 1024 bajty jezeli mam fat przygotowany do takiego sektora?
    Nie, sektor ma tyle ile zdedecydował jego producent, i w przypadku kart CF(i pewnie też dysków) jest instrukcja co przepisuje taką "tablice" danych do bufora odczytu.
    marchewa101 napisał:
    tylko jest cos takiego ze nie mam podlaczonej tej pamieci do komputrka bo to jest pamiec z spi podlaczona do uC (mam butterflaya)
    i zwiazku z tym nie mam urzadzenia /dev/urządzenie odpowiadajacemu karcie...
    chyab ze by uzyc cos ala wirtualne uzadzenie, sformatowac je (z odpowiednia wielkoscia 512,2048kB) i potem stworzyc obraz,
    A może RAMdysk? Do początkowych eksperymentów jednak polecam kupić sobie czytnik, bo można porównywać dane odczytane przez procesor z rzeczywistym stanem na karcie, ale bez tego też można się obyć.

    0
  • #8 08 Sie 2004 21:57
    marchewa101
    Poziom 17  

    Cytat:
    Nie, sektor ma tyle ile zdedecydował jego producent, i w przypadku kart CF(i pewnie też dysków) jest instrukcja co przepisuje taką "tablice" danych do bufora odczytu.

    dobrze ze mowisz bo, specjalnie zrobilem procedure ktora zamienia bufor standardowy karty na sektor 512B :D

    Cytat:
    Do początkowych eksperymentów jednak polecam kupić sobie czytnik, bo można porównywać dane odczytane przez procesor z rzeczywistym stanem na karcie, ale bez tego też można się obyć.

    Funkcji odczytujacej dane z karty jestem pewien, bo sprawdzalem czy dziala. A wogole nie wiem jak bym podlaczyl tego robaszka do czytnika, i czy czytnik sie komunikuje w spi

    Cytat:
    A może RAMdysk?

    a z Ramdyskiem to pokombinuje :)

    Zmiana
    Wlasnie sie zorientowalem ze stworzenie obrazu odpowiednio sformatowanego jest idiotycznie proste ;)
    wystarczy stowrzyc plik o odpowiedniej wielkosci i wydac komende:
    mkfs.vfat plik_obrazu.img
    ;)

    0
  • #9 09 Sie 2004 00:18
    elektryk
    Poziom 42  

    marchewa101 napisał:
    Funkcji odczytujacej dane z karty jestem pewien, bo sprawdzalem czy dziala. A wogole nie wiem jak bym podlaczyl tego robaszka do czytnika, i czy czytnik się komunikuje w spi
    Zapomniałem że to DataFlash a nie CF, już wiem dlaczego ;) wg mnie procedury dotyczą kart CF, a DataFlash bardziej przypomina MMC.

    0
  • #10 09 Sie 2004 00:41
    marchewa101
    Poziom 17  

    Cytat:
    Zapomniałem że to DataFlash a nie CF, już wiem dlaczego wg mnie procedury dotyczą kart CF, a DataFlash bardziej przypomina MMC.


    no moze ;)

    jak narazie sie bawie na pc'tku ruruchomic ten skrypcik i zamiast zczytac z karty zczytuje dane z pliku :)

    i narazie doszedlem do tego ze zrobilem bardzo dobra partycje FAT, ale ja wsumie potrzebuje nie tylko partycje, ale takze to co je definiuje na dysku (to co jest przed) :D
    i nie wiem jak to padziewstwo uzyskac ;)
    a tak sie cieszylem ze juz mam gotowy obraz :evil:

    ale i tak sie ciesze ze udalo mi sie to uruchomic na pc, a nie marnowac cykle programowania procesorka. :)

    Zmiana
    a.. jak powiem programikowi ze ma odczytywac dane z /dev/hda to dziala,
    przynajmniej inicjalizacja :D

    Zmiana
    Stworzylem plik o wielkosci odpowiadajacej karcie,
    dd if=/dev/zero of=/mnt/plik.txt bs=540672 count=1
    wlaczylem fdiska
    fdisk /mnt/plik.txt
    ustawilem ilosc cylindrow (1024)
    stworzylem nowa partycje

    i mam efekt odwrotny do poprzedniego:
    - mam stworzone tablice,
    - nie mam sformatowanego do FAT:D
    ja sie pokroje :evil:

    0
  • #11 16 Sie 2004 19:02
    mzielin
    Poziom 22  

    Kiedyś zamiast pisać wszysko od podstaw, stworzyłem pod windą kilka plików, a potem tylko modyfikowałem odpowiednie wpisy w obszarze FAT. Karta CF pracowała w trybie R/W, nie jako ATA.

    0
  • #12 16 Sie 2004 23:41
    marchewa101
    Poziom 17  

    mzielin-->

    Cytat:
    Kiedyś zamiast pisać wszysko od podstaw, stworzyłem pod windą kilka plików, a potem tylko modyfikowałem odpowiednie wpisy w obszarze FAT. Karta CF pracowała w trybie R/W, nie jako ATA.

    tzn do kogo mowisz, bo zglupialem ;)

    .. i zupelnie nie kapuje o jakich plikach i wpisach mowisz.
    No i nie zabardzo wiem o co ci chodzi z tym tryber ATA i R/W

    Podsumowanie: nic nie wywnioskowalem z twojej wypowiedzi :)

    0
  • #13 17 Sie 2004 12:52
    mzielin
    Poziom 22  

    No trudno, nie moja wina.
    Karta CF może pracować w conajmniej 2 trybach pracy:
    a) udaje standardowy dysk ATA (ale nie wszystkie tryby pracy są dostępne)
    b) jako pamięć o dostępie swobodnym - podajesz jej adres komórki i dokonujesz odczytu/zapisu.
    Wszystkie te informacje są w notach katalogowych np: Sandiska.
    Uprzedzając twoje pytanie, że po co piszę o CF, skoro masz co innego - algorytm postępowania w obu przypadkach jest identyczny.
    Zamiast tworzyć odpowiednie procedury obsługujące cały podsystem FAT, a nie potrzebujesz wielu i o różnych długościach plików wystarczy modyfikować tylko niektóre bajty w obszarze FAT'u (i oczywiście bajty tam gdzie są dane). Początki plików będą miały zawsze takie same położenie. Mikrokontroler ma więc znacznie mniej roboty.

    0
  • #14 17 Sie 2004 13:33
    marchewa101
    Poziom 17  

    mzielin-->
    dzieki za wytlumaczenie
    i dobze ze mnie uprzedziles bo niepotrzebnie wyslalbym takie ptanie :D

    Cytat:
    Zamiast tworzyć odpowiednie procedury obsługujące cały podsystem FAT, a nie potrzebujesz wielu i o różnych długościach plików wystarczy modyfikować tylko niektóre bajty w obszarze FAT'u (i oczywiście bajty tam gdzie są dane). Początki plików będą miały zawsze takie same położenie. Mikrokontroler ma więc znacznie mniej roboty.


    Faktycznie skrocilo by to znacznie obciazenie procka.. tylko .. jak narazie to nie moge dojsc... zeby wogole obsluzyc FAT..

    Bo wiem gdzie sa zapisane informacje odnoscie partycji (wielkosc, polozenie),
    moge tez odczytac...
    ale nie mam kompletnie pojecia jak ulozone sa informacje o katalogach/plikach...
    czyli w ktorym miejscu mam tego szukac...

    jak probowalem uzyc jakis gotowych proceur... to to niedzialalo odczytywanie/zapisywanie plikow/katalogow...
    .. a testowalem to u siebie an pc - funkcje odczytu i zapisu dokonywalem na obrazie mojego dysku

    0
  • #15 18 Sie 2004 00:18
    elektryk
    Poziom 42  

    marchewa101 napisał:
    Bo wiem gdzie sa zapisane informacje odnoscie partycji (wielkosc, polozenie),
    moge tez odczytac...
    ale nie mam kompletnie pojecia jak ulozone sa informacje o katalogach/plikach...
    czyli w ktorym miejscu mam tego szukac...
    Hmm, musisz zacząć od znalezienia katalogu głównego, znajduje się on za tablicami FAT, a jego adres można obliczyć na podstawie ilości tablic FAT (raczej będą), rozmiaru tablicy FAT, i takiej wartosci z bootsektora która oznacza ilość sektorów pomieniętych (czy pustych, albo jakoś tak, chyba domyślnie to jest wartość 1)

    0
  • #17 19 Sie 2004 12:50
    marchewa101
    Poziom 17  

    elektryk:

    Cytat:
    Hmm, musisz zacząć od znalezienia katalogu głównego, znajduje się on za tablicami FAT, a jego adres można obliczyć na podstawie ilości tablic FAT (raczej będą), rozmiaru tablicy FAT, i takiej wartosci z bootsektora która oznacza ilość sektorów pomieniętych (czy pustych, albo jakoś tak, chyba domyślnie to jest wartość 1)

    ... twoje wypowiedz napewno pomoze mi w zrozumieniu systemu FAT,
    ale obstawiam ze nie zapisze w C dla AVR'a takiego wzoru:
    miejsce_katalogu_glownego = miejsce tablicy < ilosc_tablic_fat * x + (Taka_wartosc_z_bootsektora_ktora_oznacza_ilosc_sektorow_( ominietych || pustych ) || 1) * y;
    prawdopododobnie by nie dzialalo :D
    .. ale tak na serio to mzoe twoja wypowiedz mi pomoze w zrozumieniu specyfikacji

    ps: .. a jak sie robi taka quote ze pisze: "marchewa napisal:"?

    mzielin:
    Cytat:
    Zajrzyj do postu: jest tam specyfikacja FAT32.

    Juz lookam, szkoda tylko ze po angielsku, bo u mnie z tym cienko, no ale wsumie nie spodziewalem sie Polskiego ;D
    Mam nadzieje ze dojde do tego jak to wszysko dziala ;)

    Zmiana
    Jak ktoś chce się zapoznać z specyfikacją po polsku to zapraszam: ;)
    http://rainbow.mimuw.edu.pl/SO/Projekt02-03/

    0
  • #18 17 Wrz 2004 17:45
    marchewa101
    Poziom 17  

    Trochę się przeciągnoł ten temat bo miałęm malo czasu, a teraz jestem chory więc czasu przybyło ;)
    No ale mam teraz kolejny problem, nie jest on dokłądnie związany z fatem, ale z moim błędem, ale nie wiem jakim ;)

    Program testuje na PC'cie i program mi się wysypuje w funkcji czytającej z pliku, ale zupełnie nie wiem dlaczego.
    fukcją wywołującą odczytywanie to "uint32_t dir(uint32_t entry, uint16_t count)"
    fukcja odczytująca to "unsigned char PlikIdentify(void)"

    wywala mi jak funkcja dir zarząda czytanie sektora "35", ale jak gdzieś w programie wypisze precedure:
    ReadSector(35,buff);
    to program wykona ją poprawnie ;)
    i juz nie wiem o co chodzi

    Calość programu jest w załączniku

    Code:
    uint32_t dir(uint32_t entry, uint16_t count)
    
    {
       if (debug >= 5) printf("entry: %X count: %X \n", entry, count);
       if (entry==0)
       {
          entry=(count / 16) + 0x03;
          count=count % 16;
       } else
       {
          entry=entry*4+0x1B;
          for (;count>=16;count-=16)
          {
             entry=clusfat(entry);
             if (IsFAT32)
             {
                if (entry>=0x0FFFFFF8)
                   return FALSE;
             } else {
                if (entry>=0xFFF8)
                   return FALSE;
             }
          }
       }
       if (debug >= 5) printf("PO: entry: %X count: %X \n", entry, count);
       if (active_clus != entry)
       {
          if (debug >= 7) printf("czytanie sektora\n");
          ReadSector(entry, buff);
          if (debug >= 7) printf("przeczytano sektor\n");
          active_clus = entry;
       }
       strcpy(name,((struct direntry *)(buff+(count*32)))->DIR_Name);




       if (debug >= 7) printf("skopiowano nazwe pliku\n");
       attr=((struct direntry *)(buff+(count*32)))->DIR_Attr;
       if (debug >= 7) printf("skopiowano atrybuty\n");
       if (IsFAT32)
          return (((struct direntry *)(buff+(count*32)))->DIR_FstClusHI << 16) + ((struct direntry *)(buff+(count*32)))->DIR_FstClusLO;
       else
          return ((struct direntry *)(buff+(count*32)))->DIR_FstClusLO;
    }



    Code:
    FILE *fd;
    

    unsigned char PlikReadSector (unsigned int lba, unsigned char *buf)
    {
       long lba2 = lba * 512;
       if (debug >= 7) printf("rozpoczeto czytanie sektora: %X i bajtu: %u \n", lba, lba*512);
       //lseek(fd,lba*512,SEEK_SET);
       fseek(fd,lba2,SEEK_SET);
       if (debug >= 7) printf("przeszukje odpowiedniego sektora\n");
       //read(fd,buf,512);
       fread(buf,0x200, 0x1, fd);
       if (debug >= 7) printf("przeczytany sektor\n");
       return TRUE;
    }

    unsigned char PlikIdentify(void)
    {
       //fd =  open("/dev/fd0", O_RDONLY); //O_RDWR O_RDONLY
       //fd =  open("obraz.img", O_RDONLY); //O_RDWR O_RDONLY
       fd = fopen("obraz.img", "r");
       //fd =  open("/dev/hda1", O_RDONLY); //O_RDWR O_RDONLY
       /*if (fd==-1){
          printf("Błąd w odczycie pliku\n");
          return FALSE;
       } else {
          printf("Odczytano plik\n");
          return TRUE;
       }*/
    }


    ps: czemu nie mozna dodawac załączników z rozszeżeniem bz2????

    0
  • #19 21 Wrz 2004 17:26
    DariuszEE
    Poziom 17  

    Witam

    Myślę iż najprostszym rozwiązaniem jest skorzystanie z
    SOURCES od Yampp-a czyli odtwarzacza MP3 ten gość dość długo się tym już zajmuje i udostępnia źródła

    a mając żródło najprościej jest samemu się nauczyć reszty

    Darek

    0
  • #20 21 Wrz 2004 21:27
    marchewa101
    Poziom 17  

    DariuszEE-->
    yampp mnie zabardzo nie interesuje, poniewaz obsluga fat'u zostala przystosowana do dzialania mp3 playera.
    program jest dosc malo czytelny.
    i najwiekszy problem jest ten ze nie ma to funkcji zapisu i kopiowania, na których mi zalezy,
    ale aktualnie mam problem z.. prawdopodobnie jakims przepelnieniem bufora, ale nie moge tego wykryc, wiec chcialem by ktos popatrzyl na moj programik i zobaczyl czy cos jest nie tak.
    przypominam ze jest to program w C, ktory aktualnie dziala lub nie ;) na PC'cie

    0
  Szukaj w 5mln produktów