logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

TMK_M 29 Lip 2004 20:41 4426 19
REKLAMA
  • #1 767681
    TMK_M
    Poziom 22  
    Posty: 671
    Pomógł: 38
    Ocena: 23
    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
  • REKLAMA
  • REKLAMA
  • #3 773441
    TMK_M
    Poziom 22  
    Posty: 671
    Pomógł: 38
    Ocena: 23
    A czy jest cos moze w jezyku polskim?
  • #4 783532
    marchewa101
    Poziom 17  
    Posty: 301
    Pomógł: 2
    Ocena: 8
    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
  • #5 783589
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    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
  • #6 783663
    marchewa101
    Poziom 17  
    Posty: 301
    Pomógł: 2
    Ocena: 8
    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
  • REKLAMA
  • #7 783691
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    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ć.
  • #8 783820
    marchewa101
    Poziom 17  
    Posty: 301
    Pomógł: 2
    Ocena: 8
    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
    ;)
  • #9 784070
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    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.
  • #10 784089
    marchewa101
    Poziom 17  
    Posty: 301
    Pomógł: 2
    Ocena: 8
    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:
  • #11 796949
    mzielin
    Poziom 22  
    Posty: 483
    Pomógł: 31
    Ocena: 16
    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.
  • #12 797466
    marchewa101
    Poziom 17  
    Posty: 301
    Pomógł: 2
    Ocena: 8
    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 :)
  • #13 798186
    mzielin
    Poziom 22  
    Posty: 483
    Pomógł: 31
    Ocena: 16
    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.
  • #14 798270
    marchewa101
    Poziom 17  
    Posty: 301
    Pomógł: 2
    Ocena: 8
    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
  • #15 799465
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    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)
  • REKLAMA
  • #17 802205
    marchewa101
    Poziom 17  
    Posty: 301
    Pomógł: 2
    Ocena: 8
    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/
  • #18 859187
    marchewa101
    Poziom 17  
    Posty: 301
    Pomógł: 2
    Ocena: 8
    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

    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;
    }
    



    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????
    Załączniki:
    • fat.zip (36.65 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #19 866180
    DariuszEE
    Poziom 17  
    Posty: 347
    Pomógł: 5
    Ocena: 33
    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
  • #20 866663
    marchewa101
    Poziom 17  
    Posty: 301
    Pomógł: 2
    Ocena: 8
    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

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy obsługi kart pamięci Flash za pomocą mikrokontrolera, ze szczególnym uwzględnieniem systemu plików FAT oraz problemów z implementacją na mikrokontrolerach AVR. Poruszono kwestie rozmiaru sektora (standardowo 512 bajtów, ale możliwe inne wartości zależne od producenta), struktury systemu FAT, tworzenia plików i zarządzania alokacją na nośniku. Wskazano na różnice między kartami CF a pamięciami DataFlash, które bardziej przypominają MMC i mogą wymagać innych procedur obsługi. Omówiono metody tworzenia obrazów dysków i partycji FAT na PC, które można następnie przesłać do mikrokontrolera przez port szeregowy. Podkreślono znaczenie znajomości lokalizacji katalogu głównego i tablic FAT w strukturze nośnika. Wskazano na dostępne biblioteki i źródła, m.in. avrlib z funkcjami FAT, oraz na trudności z implementacją funkcji zapisu i kopiowania plików. Poruszono także problem stabilności programu testowego na PC, prawdopodobnie związany z przepełnieniem bufora. Dyskusja zawierała linki do dokumentacji i specyfikacji FAT32 oraz sugestie dotyczące użycia RAM-dysku do testów. Wskazano, że uproszczenie obsługi FAT można osiągnąć modyfikując tylko niektóre bajty w tablicy FAT i danych, co zmniejsza obciążenie mikrokontrolera.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA