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

FAT32 [C][ATMEGA16] -> długie nazwy

maly_elektronik 27 Cze 2009 18:38 1796 9
REKLAMA
  • #1 6710882
    maly_elektronik
    Poziom 23  
    Witam :)

    Od jakiegoś czasu walczę z zaimplementowaniem FAT'u 32 (karty SD/MMC) na procesorze atmega16 :)
    Wszystko ładnie wychodzi ale pojawił się problem związane z długimi nazwami :( :arrow: Mianowicie nie mogę wpaść na pomysł / znaleźć w sieci jakiegoś gotowego "algorytmu" aby skleić tą nazwę do "kupy" :)
    I dlatego zwracam się do Was z prośbą szanowni forumowicze gdyż z pewnością ktoś już się uporał z takim problemem :)

    Pozdrawiam maly_elektronik :)
  • REKLAMA
  • #2 6711490
    d.d
    Poziom 20  
    Mi pomogła ta LINK strona .
    Sprawdzasz flagę (Flag byte) jeśli jest 0x0F to jest to LFN (Long File Names) ja nie sprawdzam czy jest to ostatni LFN ale możesz to robić , wypada też sprawdzić czy nie jest skasowany .
    Ja robię tak :
    Z tablicy fat odczytuje paczki po 32B
    sprawdzam czy plik nie jest usunięty i czy flaga == 0x0F jeśli tak to-
    zapisuje nazwę do bufora
    odczytuje kolejną paczkę 32B jeśli flaga == 0x0F to dodaje dalej do bufora jeśli flaga != 0x0F to w buforze znajduje się pełna nazwa a w tej paczce jest nazwa skrócona i reszta danych . Nazwa zapisana jest od tyłu .
    Na tej stronie jest wszystko opisane mi przydał się jeszcze program WinHex ale tylko do potwierdzania tego co wyczytałem .
  • REKLAMA
  • #3 6711741
    maly_elektronik
    Poziom 23  
    Albo ja się trochę źle wyraziłem albo ty mnie trochę opacznie zrozumiałeś :) Nie chodzi mi o to na jakiej zasadzie się odczytuje długie nazwy (skasowany plik ->E5h czy atrybut długich nazw 0Fh) :) Ale o to jak to zrealizować :) W jaki sposób poszczególne bajty ładować do tablicy :?: Mam nadzieję że teraz trochę bardziej sprecyzowałem mój problem :)

    Dokładnie w jaki sposób to sprawdzasz skoro nazwa nie jest ciągiem bajtów tylko znajdują się w niej dodatkowe bajty danych :?:

    Coś udało mi się wykrzesać :) :arrow: Kod który pokaże działą (prawie) poprawnie :
    
    unsigned long FindFileNr(unsigned int FileNr,unsigned char *name_buffer, unsigned char *buffer)
    {
     unsigned long index, index2, FirstCluster;
     unsigned long index3=0;
     unsigned int index4=0;
     unsigned char in, index0;
     NextClus=RootDirCluster;
    
     while(1)
     { 
      for(index2=0; index2<SectorPerCluster; index2++)
      { 
       sd_read_sector((RootDirAddr+index2),buffer);
       for(index=0; index<BytesPerSector; index+=32)
       {
        struct DirStruct *dir = (struct DirStruct*)&buffer[index]; 
         struct LongName  *ptr2 = (struct LongName*)&buffer[index];    
        if((dir->attrib) == 0x0F)
        {
           if(((dir->name[0]) >= 0x41) && ((dir->createDate) == 0x0000))
           {
             index3=0;
            name_buffer[index3] = (ptr2->letter6a);
            name_buffer[(index3+=1)] = (ptr2->letter5a);
            name_buffer[(index3+=1)] = (ptr2->letter4a);
            name_buffer[(index3+=1)] = (ptr2->letter3a);
            name_buffer[(index3+=1)] = (ptr2->letter2a);
            name_buffer[(index3+=1)] = (ptr2->letter1a); 
            goto next1;
           }
         
            name_buffer[(index3+=1)] = (ptr2->letter13a);
            name_buffer[(index3+=1)] = (ptr2->letter12a);
            name_buffer[(index3+=1)] = (ptr2->letter11a);
            name_buffer[(index3+=1)] = (ptr2->letter10a);
            name_buffer[(index3+=1)] = (ptr2->letter9a);
            name_buffer[(index3+=1)] = (ptr2->letter8a);   
            name_buffer[(index3+=1)] = (ptr2->letter7a);
            name_buffer[(index3+=1)] = (ptr2->letter6a);
            name_buffer[(index3+=1)] = (ptr2->letter5a);
            name_buffer[(index3+=1)] = (ptr2->letter4a);
            name_buffer[(index3+=1)] = (ptr2->letter3a);
            name_buffer[(index3+=1)] = (ptr2->letter2a);    
            name_buffer[(index3+=1)] = (ptr2->letter1a);   
           next1:
            name_index = index3;
        }
        if((dir->name[0] != 0xE5) && (dir->name[0] != 0x00) && (dir->attrib != 0x0F))
        index4++;
    	
    	if(index4 == FileNr)
    	{
    	 FirstCluster |=(dir->firstClusterHI);
    	 FirstCluster<<=16;
    	 FirstCluster |=(dir->firstClusterLO);
            // transmitString(dir->name);
                for(in=0;in<11;in++)
                FileName[in] = dir->name[in];
    	// name_buffer[(index3+1)] = (dir->name[0]);
    		/***********************************wyswietlanie nazwy*******************************/
    			if(name_index <= 11)
    			{
    			 for(index0=0; index0<11; index0++)
    			  USART_Transmit(FileName[index0]);
     				name_index=0;
    			}
    			else
    			{
    			 for(index0=(name_index+1);index0>0;index0--)
    			  USART_Transmit(name_buffer[index0]);
    				name_index=0;
    			} 
    		/**************************************************************************************/
             return FirstCluster;
            }
       } 
      }
      NextClus=(NextCluster(NextClus,buffer));
    
      if(NextClus >= 0x0FFFFFF8) return 0;
      RootDirAddr = (FirstClusterSector(NextClus));
     }
     read_fat_info(buffer);
    } 
    

    Jedyne co robi źle to zamiast zapisywanie każdej nazwy od nowa w name_buffer to za każdym razem przesówa tablice o tyle bajtów ile zajmuje nowa nazwa (i niby ładnie działa ale do momentu zapełnienia się całej tablicy i wtedy program się wiesza :( )
  • #4 6713365
    rsikon
    Poziom 26  
    maly_elektronik -> mozesz udostepnic swoj caly kod?? albo podeslac go na meila? rsikon(_at_)tlen.pl
  • REKLAMA
  • #5 6714208
    maly_elektronik
    Poziom 23  
    W jakim celu mam udostępnić ten kod :?: Jeżeli do sprawdzenia to powyższa funkcja powinna wystarczyć :)
  • #6 6714492
    rsikon
    Poziom 26  
    Tez zaczynam sie "meczyc" z fatem na SD, chcialem posilkowac sie Twoim kodem.
  • #7 6714702
    d.d
    Poziom 20  
    Tu LINK masz gotowca na ATmega8 i 32 sprawdzałem to i działa wzorując się częściowo na tym napisałem po swojemu ale tylko dla tego że potrzebowałem zaoszczędzić FLASH i RAM.

    maly_elektronik
    Uporałeś się już z problemem ?? bo z tego co piszesz to wygląda na jakąś drobnostkę . Trochę nie chce mi się analizować twojego kodu może jak dodasz trochę komentarzy to będzie bardziej czytelny :) .
  • #8 6714779
    maly_elektronik
    Poziom 23  
    d.d -> do końca nie wiem czy uporałem się z problemem, najprawdopodobniej polega/polegał on na strukturach (z niewyjaśnionych mi przyczyn po jakimś czasie program się wiesza, co dziwna w przypadkowych miejscach)

    rsikon -> na razie nie udostępniam mojego kodu, mam nadzieję że dość szybko opracuje cały kod i dopiero wtedy wrzucę go na forum :)
    Osobiście nie polecam strony dharamanitech ale całkiem ładnie jest to rozpracowane w FatFs :)

    P.S Postaram się na bieżąco uaktualniać poprawkę do błędu może ktoś z niej kiedyś skorzysta :)

    Pozdrawiam maly_elektronik
  • #9 6715029
    rsikon
    Poziom 26  
    :) ja raczej przed urlopem nie skoncze, licze na Ciebie ;)

    moze jak wroce - koncem lipca, to juz bedziesz miał temat zamkniety ;)

    Pozdrawiam
    Radzio
  • REKLAMA
  • #10 6715147
    maly_elektronik
    Poziom 23  
    Teoretycznie FAT32 jest gotowy :) Nie udostępniłem go jeszcze tylko dlatego iż jest przystosowany do mojego odtwarzacza mp3 :) Kwestia jego optymalizacji + może w przyszłości tworzenie, edycja plików i ich atrybutów :)

    Pozdrawiam maly_elektronik
REKLAMA