code cleanup
This commit is contained in:
parent
4a0740dd02
commit
8656beb769
@ -16,7 +16,8 @@ struct File file; // wichtige dateibezogene daten/variablen
|
||||
// schreibt sektor nummer:sec auf die karte (puffer:sector) !!
|
||||
// setzt bufferFlag=0 da puffer nicht dirty sein kann nach schreiben !
|
||||
// ***************************************************************************************************************
|
||||
unsigned char fat_writeSector(unsigned long int sec){
|
||||
unsigned char fat_writeSector(unsigned long int sec)
|
||||
{
|
||||
|
||||
fat.bufferDirty = 0; // buffer kann nicht dirty sein weil wird geschrieben
|
||||
return (mmc_write_sector(sec, fat.sector)); // schreiben von sektor puffer
|
||||
@ -28,7 +29,8 @@ unsigned char fat_writeSector(unsigned long int sec){
|
||||
// ***************************************************************************************************************
|
||||
// umrechnung cluster auf 1.sektor des clusters (möglicherweise mehrere sektoren/cluster) !
|
||||
// ***************************************************************************************************************
|
||||
unsigned long int fat_clustToSec(unsigned long int clust){
|
||||
unsigned long int fat_clustToSec(unsigned long int clust)
|
||||
{
|
||||
|
||||
return (fat.dataDirSec + 2 + ((clust - 2) * fat.secPerClust)); // errechnet den 1. sektor der sektoren des clusters
|
||||
}
|
||||
@ -36,7 +38,8 @@ unsigned long int fat_clustToSec(unsigned long int clust){
|
||||
// ***************************************************************************************************************
|
||||
// umrechnung sektor auf cluster (nicht die position im cluster selber!!)
|
||||
// ***************************************************************************************************************
|
||||
unsigned long int fat_secToClust(unsigned long int sec){
|
||||
unsigned long int fat_secToClust(unsigned long int sec)
|
||||
{
|
||||
|
||||
return ((sec - fat.dataDirSec - 2 + 2 * fat.secPerClust) / fat.secPerClust); // umkerhrfunktion von fat_clustToSec
|
||||
}
|
||||
@ -47,18 +50,21 @@ unsigned long int fat_secToClust(unsigned long int sec){
|
||||
// setzt currentSectorNr auf richtigen wert (also den sektor der gepuffert ist). es wird geprüft
|
||||
// ob der gepufferte sektor geändert wurde, wenn ja muss erst geschrieben werden, um diese daten nicht zu verlieren !
|
||||
// ***************************************************************************************************************
|
||||
unsigned char fat_loadSector(unsigned long int sec){
|
||||
unsigned char fat_loadSector(unsigned long int sec)
|
||||
{
|
||||
|
||||
if (sec != fat.currentSectorNr) { // nachladen nötig
|
||||
#if (WRITE==1)
|
||||
if(fat.bufferDirty==1) fat_writeSector(fat.currentSectorNr); // puffer diry, also vorher schreiben
|
||||
if (fat.bufferDirty == 1)
|
||||
fat_writeSector(fat.currentSectorNr); // puffer diry, also vorher schreiben
|
||||
#endif
|
||||
mmc_read_sector(sec, fat.sector); // neuen sektor laden
|
||||
fat.currentSectorNr = sec; // aktualisiert sektor nummer (nummer des gepufferten sektors)
|
||||
return (0);
|
||||
}
|
||||
|
||||
else return(0); // alles ok, daten sind schon da (sec==fat.currentSectorNr)
|
||||
else
|
||||
return (0); // alles ok, daten sind schon da (sec==fat.currentSectorNr)
|
||||
|
||||
return (1); // fehler
|
||||
}
|
||||
@ -71,13 +77,15 @@ unsigned char fat_loadSector(unsigned long int sec){
|
||||
|
||||
// datei lesen funktionen:
|
||||
|
||||
// fat_loadSector -> fat_loadRowOfSector -> fat_loadFileDataFromCluster -> fat_loadFileDataFromDir -> fat_loadFileDataFromDir -> fat_cd "daten chain"
|
||||
// fat_loadSector -> fat_loadRowOfSector -> fat_loadFileDataFromCluster -> fat_loadFileDataFromDir -> fat_loadFileDataFromDir -> fat_cd
|
||||
// "daten chain"
|
||||
|
||||
// ***************************************************************************************************************
|
||||
// läd die reihe:row des gepufferten sektors auf das struct:file. dort stehen dann
|
||||
// alle wichgigen daten wie: 1.cluster,länge bei dateien, name des eintrags, reihen nummer (im sektor), attribut use...
|
||||
// ***************************************************************************************************************
|
||||
unsigned char fat_loadRowOfSector(unsigned int row){
|
||||
unsigned char fat_loadRowOfSector(unsigned int row)
|
||||
{
|
||||
|
||||
unsigned char i;
|
||||
row = row << 5; // multipliziert mit 32 um immer auf zeilen anfang zu kommen (zeile 0=0,zeile 1=32,zeile 2=62 usw).
|
||||
@ -107,7 +115,8 @@ unsigned char fat_loadRowOfSector(unsigned int row){
|
||||
// namen:name. es werden die einzelnen sektoren nachgeladen auf puffer:sector vor dem bearbeiten.
|
||||
// wird die datei in dem cluster gefunden ist return 0 , sonst return1.
|
||||
// ***************************************************************************************************************
|
||||
unsigned char fat_loadFileDataFromCluster(unsigned long int sec , char name[]){
|
||||
unsigned char fat_loadFileDataFromCluster(unsigned long int sec, char name[])
|
||||
{
|
||||
|
||||
unsigned char r;
|
||||
unsigned char s = 0;
|
||||
@ -140,22 +149,29 @@ unsigned char fat_loadFileDataFromCluster(unsigned long int sec , char name[]){
|
||||
// die datei zu finden. es wird das komplette directory in dem man sich befindet durchsucht.
|
||||
// bei fat16 wird der rootDir berreich durchsucht, bei fat32 die cluster chain des rootDir.
|
||||
// ***************************************************************************************************************
|
||||
unsigned char fat_loadFileDataFromDir(char name[]){
|
||||
unsigned char fat_loadFileDataFromDir(char name[])
|
||||
{
|
||||
|
||||
unsigned int s;
|
||||
|
||||
if (fat.dir == 0 && fat.fatType == 16) { // IM ROOTDIR. fat16
|
||||
for(s=0;s<(unsigned int)(fat.dataDirSec+2-fat.rootDir);s++){ // zählt durch RootDir sektoren (errechnet anzahl rootDir sektoren).
|
||||
if(0==fat_loadFileDataFromCluster(fat.rootDir+s,name))return(0);// sucht die datei, wenn da, läd daten (1.cluster usw)
|
||||
for (s = 0; s < (unsigned int) (fat.dataDirSec + 2 - fat.rootDir); s++) { // zählt durch RootDir sektoren (errechnet anzahl
|
||||
// rootDir sektoren).
|
||||
if (0 == fat_loadFileDataFromCluster(fat.rootDir + s, name))
|
||||
return (0); // sucht die datei, wenn da, läd daten (1.cluster usw)
|
||||
}
|
||||
}
|
||||
|
||||
else {
|
||||
unsigned long int i;
|
||||
if(fat.dir==0 && fat.fatType==32)i=fat.rootDir; // IM ROOTDIR. fat32
|
||||
else i=fat.dir; // NICHT ROOTDIR
|
||||
while(!((i==0xfffffff&&fat.fatType==32)||(i==0xffff&&fat.fatType==16))){ // prüft ob weitere sektoren zum lesen da sind (fat32||fat16)
|
||||
if(0==fat_loadFileDataFromCluster(fat_clustToSec(i),name))return(0); // lät die daten der datei auf struct:file. datei gefunden (umrechnung auf absoluten sektor)
|
||||
if (fat.dir == 0 && fat.fatType == 32)
|
||||
i = fat.rootDir; // IM ROOTDIR. fat32
|
||||
else
|
||||
i = fat.dir; // NICHT ROOTDIR
|
||||
while (!((i == 0xfffffff && fat.fatType == 32) || (i == 0xffff && fat.fatType == 16))) { // prüft ob weitere sektoren zum
|
||||
// lesen da sind (fat32||fat16)
|
||||
if (0 == fat_loadFileDataFromCluster(fat_clustToSec(i), name))
|
||||
return (0); // lät die daten der datei auf struct:file. datei gefunden (umrechnung auf absoluten sektor)
|
||||
i = fat_getNextCluster(i); // liest nächsten cluster des dir-eintrags (unterverzeichniss größer 16 einträge)
|
||||
}
|
||||
}
|
||||
@ -170,7 +186,8 @@ unsigned char fat_loadFileDataFromDir(char name[]){
|
||||
// start immer im root Dir. start in root dir (dir==0).
|
||||
// es MUSS in das direktory gewechselt werden, in dem die datei zum lesen/anhängen ist (außer root, da startet mann)!
|
||||
// ***************************************************************************************************************
|
||||
unsigned char fat_cd(char name[]){
|
||||
unsigned char fat_cd(char name[])
|
||||
{
|
||||
|
||||
if (name[0] == 0) { // ZUM ROOTDIR FAT16/32
|
||||
fat.dir = 0; // root dir
|
||||
@ -201,7 +218,8 @@ unsigned char fat_cd(char name[]){
|
||||
// wird ein freier eintrag gefunden, ist die position der freien reihe auf file.row abzulesen und return (0).
|
||||
// der sektor mit der freien reihe ist auf dem puffer:sector gepuffert.
|
||||
// ****************************************************************************************************************
|
||||
unsigned char fat_getFreeRowOfCluster(unsigned long secStart){
|
||||
unsigned char fat_getFreeRowOfCluster(unsigned long secStart)
|
||||
{
|
||||
|
||||
unsigned int b; // zum durchgenen der sektor bytes
|
||||
unsigned char s = 0; // sektoren des clusters.
|
||||
@ -210,7 +228,8 @@ unsigned char fat_getFreeRowOfCluster(unsigned long secStart){
|
||||
file.row = 0; // neuer sektor(oder 1.sektor), reihen von vorne.
|
||||
if (0 == fat_loadSector(secStart + s)) { // laed sektor auf puffer fat.sector
|
||||
for (b = 0; b < 512; b = b + 32) { // zaehlt durch zeilen (0-15).
|
||||
if(fat.sector[b]==0x00||fat.sector[b]==0xE5)return(0); // prueft auf freihen eintrag (leer oder geloescht == OK!).
|
||||
if (fat.sector[b] == 0x00 || fat.sector[b] == 0xE5)
|
||||
return (0); // prueft auf freihen eintrag (leer oder geloescht == OK!).
|
||||
file.row++; // zählt reihe hoch (nächste reihe im sektor).
|
||||
}
|
||||
}
|
||||
@ -227,13 +246,17 @@ unsigned char fat_getFreeRowOfCluster(unsigned long secStart){
|
||||
// 1. sektor des freien clusters geladen. die reihe wird auf den ersten eintrag gesetzt, da frei.
|
||||
// anhand der reihe kann man nun den direktory eintrag vornehmen, und auf die karte schreiben.
|
||||
// ****************************************************************************************************************
|
||||
void fat_getFreeRowOfDir(unsigned long int dir){
|
||||
void fat_getFreeRowOfDir(unsigned long int dir)
|
||||
{
|
||||
|
||||
unsigned long int start = dir;
|
||||
|
||||
// solange bis ende cluster chain.
|
||||
while( !((dir==0xfffffff&&fat.fatType==32)||(dir==0xffff&&fat.fatType==16)) ){
|
||||
if(0==fat_getFreeRowOfCluster(fat_clustToSec(dir)))return; // freien eintrag in clustern, des dir gefunden !!
|
||||
while (!
|
||||
((dir == 0xfffffff && fat.fatType == 32)
|
||||
|| (dir == 0xffff && fat.fatType == 16))) {
|
||||
if (0 == fat_getFreeRowOfCluster(fat_clustToSec(dir)))
|
||||
return; // freien eintrag in clustern, des dir gefunden !!
|
||||
start = dir;
|
||||
dir = fat_getNextCluster(dir);
|
||||
} // wenn aus schleife raus, kein freier eintrag da -> neuer cluster nötig.
|
||||
@ -269,17 +292,21 @@ void fat_getFreeRowOfDir(unsigned long int dir){
|
||||
// erstellt eintrag in reihe:row, mit namen:name usw... !!
|
||||
// muss noch auf die karte geschrieben werden ! nicht optimiert auf geschwindigkeit.
|
||||
// ***************************************************************************************************************
|
||||
void fat_makeRowDataEntry(unsigned int row,char name[],unsigned char attrib,unsigned long int cluster,unsigned long int length){
|
||||
void fat_makeRowDataEntry(unsigned int row, char name[], unsigned char attrib,
|
||||
unsigned long int cluster, unsigned long int length)
|
||||
{
|
||||
|
||||
fat.bufferDirty = 1; // puffer beschrieben, also neue daten darin(vor lesen muss geschrieben werden)
|
||||
|
||||
row=row<<5; // multipliziert mit 32 um immer auf zeilen anfang zu kommen (zeile 0=0,zeile 1=32,zeile 2=62 ... zeile 15=480)
|
||||
row = row << 5; // multipliziert mit 32 um immer auf zeilen anfang zu kommen (zeile 0=0,zeile 1=32,zeile 2=62 ... zeile
|
||||
// 15=480)
|
||||
|
||||
unsigned char i; // byte zähler in reihe von sektor (32byte eintrag)
|
||||
unsigned char *bytesOfSec = &fat.sector[row]; // zeiger auf sector bytes
|
||||
void *vsector;
|
||||
|
||||
for(i=0;i<11;i++) *bytesOfSec++=name[i]; // namen schreiben
|
||||
for (i = 0; i < 11; i++)
|
||||
*bytesOfSec++ = name[i]; // namen schreiben
|
||||
|
||||
*bytesOfSec++ = attrib; // attrib schreiben
|
||||
|
||||
@ -307,19 +334,25 @@ void fat_makeRowDataEntry(unsigned int row,char name[],unsigned char attrib,unsi
|
||||
// sektor gepuffert. für fat16 im root dir muss andere funktion genutzt werden, als fat_getFreeRowOfDir (durchsucht nur dirs).
|
||||
// fat.rootDir enthält bei fat32 den start cluster des directory, bei fat16 den 1. sektor des rootDir bereichs!
|
||||
// ***************************************************************************************************************
|
||||
void fat_makeFileEntry(char name[],unsigned char attrib,unsigned long int length){
|
||||
void fat_makeFileEntry(char name[], unsigned char attrib,
|
||||
unsigned long int length)
|
||||
{
|
||||
|
||||
unsigned int s; // zähler für root dir sektoren fat16
|
||||
|
||||
if(fat.dir==0&&fat.fatType==32)fat_getFreeRowOfDir(fat.rootDir); // IM ROOT DIR (fat32)
|
||||
if (fat.dir == 0 && fat.fatType == 32)
|
||||
fat_getFreeRowOfDir(fat.rootDir); // IM ROOT DIR (fat32)
|
||||
|
||||
else if (fat.dir == 0 && fat.fatType == 16) { // IM ROOT DIR (fat16)
|
||||
for(s=0;s<(unsigned int)(fat.dataDirSec+2-fat.rootDir);s++){ // zählt durch RootDir sektoren (errechnet anzahl rootDir sektoren).
|
||||
if(0==fat_getFreeRowOfCluster(fat.rootDir+s))break; // geht durch sektoren des root dir.
|
||||
for (s = 0; s < (unsigned int) (fat.dataDirSec + 2 - fat.rootDir); s++) { // zählt durch RootDir sektoren (errechnet anzahl
|
||||
// rootDir sektoren).
|
||||
if (0 == fat_getFreeRowOfCluster(fat.rootDir + s))
|
||||
break; // geht durch sektoren des root dir.
|
||||
}
|
||||
}
|
||||
|
||||
else fat_getFreeRowOfDir(fat.dir); // NICHT ROOT DIR fat32/fat16
|
||||
else
|
||||
fat_getFreeRowOfDir(fat.dir); // NICHT ROOT DIR fat32/fat16
|
||||
|
||||
fat_makeRowDataEntry(file.row, name, attrib, file.firstCluster, length); // schreibt file eintrag auf puffer
|
||||
fat_writeSector(fat.currentSectorNr); // schreibt puffer auf karte
|
||||
@ -338,23 +371,25 @@ void fat_makeFileEntry(char name[],unsigned char attrib,unsigned long int length
|
||||
// erster daten cluster = 2, ende einer cluster chain 0xFFFF (fat16) oder 0xFFFFFFF, 0xFFFFFF8 (fat32),
|
||||
// stelle des clusters in der fat, hat als wert, den nächsten cluster. (1:1 gemapt)!
|
||||
// ***************************************************************************************************************
|
||||
unsigned long int fat_getNextCluster(unsigned long int oneCluster){
|
||||
unsigned long int fat_getNextCluster(unsigned long int oneCluster)
|
||||
{
|
||||
|
||||
// FAT 16**************FAT 16
|
||||
if (fat.fatType == 16) {
|
||||
unsigned long int i = oneCluster >> 8;; // (i=oneCluster/256)errechnet den sektor der fat in dem oneCluster ist (rundet immer ab)
|
||||
unsigned long int j=(oneCluster<<1)-(i<<9); // (j=(oneCluster-256*i)*2 == 2*oneCluster-512*i)errechnet das low byte von oneCluster
|
||||
unsigned long int j = (oneCluster << 1) - (i << 9); // (j=(oneCluster-256*i)*2 == 2*oneCluster-512*i)errechnet das low byte von
|
||||
// oneCluster
|
||||
|
||||
if (0 == fat_loadSector(i + fat.fatSec)) { // ob neu laden nötig, wird von fat_loadSector geprüft
|
||||
void *bytesOfSec = &fat.sector[j]; // zeiger auf puffer
|
||||
return *(unsigned short *) bytesOfSec; // da der ram auch little endian ist, kann einfach gecastet werden und gut :)
|
||||
}
|
||||
}
|
||||
|
||||
// FAT 32**************FAT 32
|
||||
else {
|
||||
unsigned long int i = oneCluster >> 7; // (i=oneCluster/128)errechnet den sektor der fat in dem oneCluster ist (rundet immer ab)
|
||||
unsigned long int j=(oneCluster<<2)-(i<<9); // (j=(oneCluster-128*i)*4 == oneCluster*4-512*i)errechnet das low byte von oneCluster
|
||||
unsigned long int j = (oneCluster << 2) - (i << 9); // (j=(oneCluster-128*i)*4 == oneCluster*4-512*i)errechnet das low byte von
|
||||
// oneCluster
|
||||
|
||||
if (0 == fat_loadSector(i + fat.fatSec)) { // ob neu laden nötig wird von fat_loadSector geprüft
|
||||
void *bytesOfSec = &fat.sector[j]; // zeiger auf puffer
|
||||
@ -372,13 +407,15 @@ unsigned long int fat_getNextCluster(unsigned long int oneCluster){
|
||||
// am stück,falls möglich. prüft ob der cluster neben offsetCluster dazu gehört...
|
||||
// setzt dann fat.endSectors und fat.startSectors. das -1 weil z.b. [95,98] = {95,96,97,98} = 4 sektoren
|
||||
// ***************************************************************************************************************
|
||||
void fat_getFatChainClustersInRow(unsigned long int offsetCluster){
|
||||
void fat_getFatChainClustersInRow(unsigned long int offsetCluster)
|
||||
{
|
||||
|
||||
unsigned int i = 0;
|
||||
fat.startSectors = fat_clustToSec(offsetCluster); // setzen des 1. sektors der datei
|
||||
fat.endSectors = fat.startSectors;
|
||||
do {
|
||||
if( (offsetCluster+1+i)==fat_getNextCluster(offsetCluster+i) ) fat.endSectors+=fat.secPerClust; // zählen der zusammenhängenden sektoren
|
||||
if ((offsetCluster + 1 + i) == fat_getNextCluster(offsetCluster + i))
|
||||
fat.endSectors += fat.secPerClust; // zählen der zusammenhängenden sektoren
|
||||
else {
|
||||
file.lastCluster = offsetCluster + i; // cluster daneben gehört nicht dazu, somit ist offset+i der letzte bekannte
|
||||
break;
|
||||
@ -395,17 +432,21 @@ void fat_getFatChainClustersInRow(unsigned long int offsetCluster){
|
||||
// erst wir der erste frei cluster gesucht, ab offsetCluster(iklusive) und dann wird geschaut, ob der
|
||||
// daneben auch frei ist. setzt dann fat.endSectors und fat.startSectors. das -1 weil z.b. [95,98] = {95,96,97,98} = 4 sektoren
|
||||
// ***************************************************************************************************************
|
||||
void fat_getFreeClustersInRow(unsigned long int offsetCluster){
|
||||
void fat_getFreeClustersInRow(unsigned long int offsetCluster)
|
||||
{
|
||||
|
||||
unsigned int i = 1; // variable für anzahl der zu suchenden sektoren
|
||||
while(fat_getNextCluster(offsetCluster)) offsetCluster++; // suche des 1. freien clusters
|
||||
while (fat_getNextCluster(offsetCluster))
|
||||
offsetCluster++; // suche des 1. freien clusters
|
||||
|
||||
fat.startSectors = fat_clustToSec(offsetCluster); // setzen des startsektors der freien sektoren (umrechnen von cluster zu sektoren)
|
||||
fat.endSectors = fat.startSectors;
|
||||
|
||||
do { // suche der nächsten freien
|
||||
if(0==fat_getNextCluster(offsetCluster+i) ) fat.endSectors+=fat.secPerClust; // zählen der zusammenhängenden sektoren
|
||||
else break; // cluster daneben ist nicht frei
|
||||
if (0 == fat_getNextCluster(offsetCluster + i))
|
||||
fat.endSectors += fat.secPerClust; // zählen der zusammenhängenden sektoren
|
||||
else
|
||||
break; // cluster daneben ist nicht frei
|
||||
} while (i++ < MAX_CLUSTERS_IN_ROW);
|
||||
|
||||
fat.endSectors += fat.secPerClust - 1; // -1 weil der erste sektor schon mit zählt z.b. [95,98] = 4 sektoren
|
||||
@ -417,7 +458,9 @@ void fat_getFreeClustersInRow(unsigned long int offsetCluster){
|
||||
// es ist wegen der fragmentierung der fat nötig, sich den letzten bekannten cluster zu merken,
|
||||
// damit man bei weiteren cluster in einer reihe die alten cluster noch dazu verketten kann (so sind lücken im verketten möglich).
|
||||
// ***************************************************************************************************************
|
||||
void fat_setClusterChain(unsigned long int startCluster,unsigned int endCluster){
|
||||
void fat_setClusterChain(unsigned long int startCluster,
|
||||
unsigned int endCluster)
|
||||
{
|
||||
|
||||
fat_setCluster(file.lastCluster, startCluster); // ende der chain setzen, bzw verketten der ketten
|
||||
|
||||
@ -439,12 +482,14 @@ void fat_setClusterChain(unsigned long int startCluster,unsigned int endCluster)
|
||||
// prüft ob buffer dirty (zu setztender cluster nicht in jetzt gepuffertem).
|
||||
// prüfung erfolgt in fat_loadSector, dann wird alter vorher geschrieben, sonst gehen dort daten verloren !!
|
||||
// ***************************************************************************************************************
|
||||
void fat_setCluster(unsigned long int cluster, unsigned long int content){
|
||||
void fat_setCluster(unsigned long int cluster, unsigned long int content)
|
||||
{
|
||||
|
||||
// FAT 16**************FAT 16
|
||||
if (fat.fatType == 16) {
|
||||
unsigned long int i = cluster >> 8; // (i=cluster/256)errechnet den sektor der fat in dem cluster ist (rundet immer ab)
|
||||
unsigned long int j=(cluster<<1)-(i<<9); // (j=(cluster-256*i)*2 == 2*cluster-512*i)errechnet das low byte von cluster
|
||||
unsigned long int j = (cluster << 1) - (i << 9); // (j=(cluster-256*i)*2 == 2*cluster-512*i)errechnet das low byte von
|
||||
// cluster
|
||||
|
||||
if (0 == fat_loadSector(i + fat.fatSec)) { // neu laden (fat_loadSector prüft ob schon gepuffert)
|
||||
void *bytesOfSec = &fat.sector[j]; // init des zeigers auf unterste adresse
|
||||
@ -452,11 +497,11 @@ void fat_setCluster(unsigned long int cluster, unsigned long int content){
|
||||
fat.bufferDirty = 1; // zeigt an, dass im aktuellen sector geschrieben wurde
|
||||
}
|
||||
}
|
||||
|
||||
// FAT 32**************FAT 32
|
||||
else {
|
||||
unsigned long int i = cluster >> 7; // (i=cluster/128)errechnet den sektor der fat in dem cluster ist (rundet immer ab)
|
||||
unsigned long int j=(cluster<<2)-(i<<9); //(j=(cluster-128*i)*4 == cluster*4-512*i)errechnet das low byte von cluster
|
||||
unsigned long int j = (cluster << 2) - (i << 9); // (j=(cluster-128*i)*4 == cluster*4-512*i)errechnet das low byte von
|
||||
// cluster
|
||||
|
||||
if (0 == fat_loadSector(i + fat.fatSec)) { // neu laden (fat_loadSector prüft ob schon gepuffert)
|
||||
void *bytesOfSec = &fat.sector[j]; // init des zeigers auf unterste adresse
|
||||
@ -471,7 +516,8 @@ void fat_setCluster(unsigned long int cluster, unsigned long int content){
|
||||
// löscht cluster chain, beginnend ab dem startCluster.
|
||||
// sucht cluster, setzt inhalt usw.. abschließend noch den cluster-chain ende markierten cluster löschen.
|
||||
// ***************************************************************************************************************
|
||||
void fat_delClusterChain(unsigned long int startCluster){
|
||||
void fat_delClusterChain(unsigned long int startCluster)
|
||||
{
|
||||
|
||||
unsigned long int nextCluster = startCluster; // tmp variable, wegen verketteter cluster..
|
||||
|
||||
@ -479,7 +525,9 @@ void fat_delClusterChain(unsigned long int startCluster){
|
||||
startCluster = nextCluster;
|
||||
nextCluster = fat_getNextCluster(startCluster);
|
||||
fat_setCluster(startCluster, 0x00000000);
|
||||
}while(!((nextCluster==0xfffffff&&fat.fatType==32)||(nextCluster==0xffff&&fat.fatType==16)));
|
||||
} while (!
|
||||
((nextCluster == 0xfffffff && fat.fatType == 32)
|
||||
|| (nextCluster == 0xffff && fat.fatType == 16)));
|
||||
fat_writeSector(fat.currentSectorNr);
|
||||
}
|
||||
|
||||
@ -491,7 +539,8 @@ void fat_delClusterChain(unsigned long int startCluster){
|
||||
// siehe auch Fatgen103.pdf. ist NICHT auf performance optimiert!
|
||||
// byte/sector, byte/cluster, anzahl der fats, sector/fat ... (halt alle wichtigen daten zum lesen ders datei systems!)
|
||||
// *****************************************************************<**********************************************
|
||||
unsigned char fat_loadFatData(unsigned long int sec){
|
||||
unsigned char fat_loadFatData(unsigned long int sec)
|
||||
{
|
||||
|
||||
// offset,size
|
||||
unsigned int rootEntCnt; // 17,2 größe die eine fat belegt
|
||||
@ -551,7 +600,8 @@ unsigned char fat_loadFatData(unsigned long int sec){
|
||||
// ************************************************************************************************<<***************
|
||||
// int fat sucht den 1. cluster des dateisystems (fat16/32) auch VBR genannt,
|
||||
// ************************************************************************************************<<***************
|
||||
unsigned char fat_initfat(void){
|
||||
unsigned char fat_initfat(void)
|
||||
{
|
||||
|
||||
unsigned long int secOfFirstPartition = 0; // ist 1. sektor der 1. partition aus dem MBR
|
||||
|
||||
@ -561,9 +611,12 @@ unsigned char fat_initfat(void){
|
||||
secOfFirstPartition = *(unsigned long int *) vsector;
|
||||
|
||||
// prüfung ob man schon im VBR gelesen hat (0x6964654d = "Medi")
|
||||
if(secOfFirstPartition==0x6964654d) return fat_loadFatData(0); //ist superfloppy
|
||||
if (secOfFirstPartition == 0x6964654d)
|
||||
return fat_loadFatData(0); // ist superfloppy
|
||||
|
||||
else {return fat_loadFatData(secOfFirstPartition);} // ist partitioniert...
|
||||
else {
|
||||
return fat_loadFatData(secOfFirstPartition);
|
||||
} // ist partitioniert...
|
||||
}
|
||||
|
||||
return (1);
|
||||
@ -577,7 +630,8 @@ unsigned char fat_initfat(void){
|
||||
// wandelt z.b. "t.txt" -> "T TXT" oder "main.c" in "MAIN C " => also immer 8.3 und upper case letter
|
||||
// VORSICHT es werden keine Prüfungen gemacht !
|
||||
// *****************************************************************************************************************
|
||||
char * fat_str(char *str){
|
||||
char *fat_str(char *str)
|
||||
{
|
||||
|
||||
unsigned char i;
|
||||
unsigned char j = 0;
|
||||
@ -586,16 +640,20 @@ char * fat_str(char *str){
|
||||
|
||||
strcpy(tmp, str);
|
||||
|
||||
for(i=0;i<11;i++)str[i]=' '; // als vorbereitung alles mit leerzeichen füllen
|
||||
for (i = 0; i < 11; i++)
|
||||
str[i] = ' '; // als vorbereitung alles mit leerzeichen füllen
|
||||
str[11] = '\0';
|
||||
|
||||
i = 0;
|
||||
|
||||
do {
|
||||
c = toupper(tmp[j]);
|
||||
if(c=='\0')return str;
|
||||
if(c!='.')str[i]=c;
|
||||
else i=7;
|
||||
if (c == '\0')
|
||||
return str;
|
||||
if (c != '.')
|
||||
str[i] = c;
|
||||
else
|
||||
i = 7;
|
||||
i++;
|
||||
j++;
|
||||
} while (i < 12);
|
||||
@ -605,4 +663,3 @@ char * fat_str(char *str){
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@ -8,7 +8,8 @@
|
||||
#define SMALL_FILE_SYSTEM 0 // wenn 1 dann ist kleines file system, wenn 0 dann komplette file unterstützung !
|
||||
#define WRITE 1 // wenn 1 dann ist write an, wenn 0 dann read only !
|
||||
#define OVER_WRITE 1 // wenn 1 dann kann ffwrite dateien überschreiben (nicht performant), wenn 0 dann nur normales schreiben !
|
||||
#define MAX_CLUSTERS_IN_ROW 256 // gibt an wie viele cluster am stück ohne fat lookup geschrieben bzw gelesen werden können, wenn die fat nicht fragmentiert ist !
|
||||
#define MAX_CLUSTERS_IN_ROW 256 // gibt an wie viele cluster am stück ohne fat lookup geschrieben bzw gelesen werden können, wenn
|
||||
// die fat nicht fragmentiert ist !
|
||||
|
||||
// 1. fat_getFreeRowOfCluster -> fat_getFreeRowOfDir -> fat_makeRowDataEntry -> fat_makeFileEntry -> fat_writeSector "eintrag gemacht !!"
|
||||
// 2. fat_loadSector -> fat_loadRowOfSector -> fat_loadFileDataFromCluster -> fat_loadFileDataFromDir (-> fat_cd) "daten chain"
|
||||
@ -24,7 +25,8 @@
|
||||
extern void fat_setCluster(unsigned long int cluster, unsigned long int content); // setzt cluster inhalt in der fat
|
||||
extern void fat_delClusterChain(unsigned long int startCluster); // löscht cluster-chain in der fat
|
||||
extern void fat_getFreeRowOfDir(unsigned long int dir); // durchsucht directory nach feiem eintrag
|
||||
extern void fat_makeFileEntry(char name[],unsigned char attrib,unsigned long int length);
|
||||
extern void fat_makeFileEntry(char name[], unsigned char attrib,
|
||||
unsigned long int length);
|
||||
extern unsigned char fat_loadSector(unsigned long int sec); // läd übergebenen absoluten sektor
|
||||
extern unsigned char fat_loadFileDataFromDir(char name[]); // durchsucht das aktuelle directory
|
||||
extern unsigned char fat_cd(char *); // wechselt directory (start im rootDir)
|
||||
@ -32,10 +34,14 @@
|
||||
extern unsigned char fat_getFreeRowOfCluster(unsigned long secStart); // durchsucht cluster nach freiem eintrag
|
||||
extern void fat_getFreeClustersInRow(unsigned long int offsetCluster); // sucht zusammenhängende freie cluster aus der fat
|
||||
extern void fat_getFatChainClustersInRow(unsigned long int offsetCluster); // sucht fat-chain cluster die zusammenhängen
|
||||
extern void fat_makeRowDataEntry(unsigned int row,char name[],unsigned char attrib,unsigned long int cluster,unsigned long int length);
|
||||
extern void fat_makeRowDataEntry(unsigned int row, char name[],
|
||||
unsigned char attrib,
|
||||
unsigned long int cluster,
|
||||
unsigned long int length);
|
||||
extern unsigned char fat_loadRowOfSector(unsigned int); // läd reihe des geladen sektors auf struct:file
|
||||
extern unsigned char fat_loadFileDataFromCluster(unsigned long int sec, char name[]); // durchsucht die reihen des geladenen sektors
|
||||
extern void fat_setClusterChain(unsigned long int newOffsetCluster,unsigned int length);
|
||||
extern void fat_setClusterChain(unsigned long int newOffsetCluster,
|
||||
unsigned int length);
|
||||
extern char *fat_str(char *str); // wandelt einen string so, dass er der fat konvention entspricht !
|
||||
|
||||
|
||||
@ -45,7 +51,8 @@
|
||||
extern struct Fat { // fat daten (1.cluster, root-dir, dir usw.)
|
||||
unsigned char sector[512]; // der puffer für sektoren !
|
||||
unsigned char bufferDirty; // puffer wurde beschrieben, sector muss geschrieben werden bevor er neu geladen wird
|
||||
unsigned long int currentSectorNr;// aktuell geladener Sektor (in sector) //beschleunigt wenn z.b 2* 512 byte puffer vorhanden, oder bei fat operationen im gleichen sektor
|
||||
unsigned long int currentSectorNr; // aktuell geladener Sektor (in sector) //beschleunigt wenn z.b 2* 512 byte puffer vorhanden, oder
|
||||
// bei fat operationen im gleichen sektor
|
||||
unsigned long int dir; // Direktory zeiger rootDir=='0' sonst(1.Cluster des dir; start auf root)
|
||||
unsigned long int rootDir; // Sektor(f16)/Cluster(f32) nr root directory
|
||||
unsigned long int dataDirSec; // Sektor nr data area
|
||||
@ -68,9 +75,3 @@
|
||||
} file;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -17,7 +17,8 @@
|
||||
// danach wird der dateieintrag gemacht(auf karte). dort wird auch geprüft ob genügend platz im aktuellen verzeichniss existiert.
|
||||
// möglicherweise wird der 1. cluster der datei nochmal geändert. jetzt ist der erste frei sektor bekannt und es kann geschrieben werden.
|
||||
// *******************************************************************************************************************************
|
||||
unsigned char ffopen(char name[]){
|
||||
unsigned char ffopen(char name[])
|
||||
{
|
||||
|
||||
unsigned char file_flag = fat_loadFileDataFromDir(name); // prüfung ob datei vorhanden und evetuelles laden des file struct
|
||||
|
||||
@ -27,7 +28,6 @@ unsigned char ffopen(char name[]){
|
||||
file.lastCluster = fat_secToClust(fat.endSectors); // letzter bekannter cluster der datei
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if (WRITE==1) // anlegen ist schreiben !
|
||||
else { /** Datei existiert nicht, also anlegen ! (nur wenn schreiben option an ist)**/
|
||||
fat_getFreeClustersInRow(2); // leere cluster suchen, ab cluster 2.
|
||||
@ -52,13 +52,16 @@ unsigned char ffopen(char name[]){
|
||||
// und die neue datei länge muss ermitt weden. abschließend wird entweder (fall 2) nur der aktuelle sektor geschrieben, oder
|
||||
// der aktuallisierte datei eintrag und die cluster (diese werden verkettet, siehe fileUpdate() ).
|
||||
// *******************************************************************************************************************************
|
||||
unsigned char ffclose(void){
|
||||
unsigned char ffclose(void)
|
||||
{
|
||||
|
||||
#if (WRITE==1) /** 2 möglichkeiten beim schließen !! (lesend spielt keine rolle, nichts muss geupdatet werden) **/
|
||||
|
||||
if( file.length < (file.seek+file.cntOfBytes) ) fileUpdate(); /** 1.) es wurde über die alte datei größe hinaus geschrieben **/
|
||||
if (file.length < (file.seek + file.cntOfBytes))
|
||||
fileUpdate(); /** 1.) es wurde über die alte datei größe hinaus geschrieben **/
|
||||
|
||||
else if( fat.bufferDirty==1) fat_writeSector( fat.currentSectorNr ); /** 2.) nicht über alte datei länge hinaus **/
|
||||
else if (fat.bufferDirty == 1)
|
||||
fat_writeSector(fat.currentSectorNr); /** 2.) nicht über alte datei länge hinaus **/
|
||||
|
||||
#endif
|
||||
|
||||
@ -72,7 +75,8 @@ unsigned char ffclose(void){
|
||||
// füllt den aktuell beschriebenen sektor mit 0x00, da sonst die datei nicht richtig angezeigt wird.
|
||||
// darf nur während schreibe operationen aufgerufen werden !
|
||||
// *******************************************************************************************************************************
|
||||
void fileUpdate(void){
|
||||
void fileUpdate(void)
|
||||
{
|
||||
|
||||
unsigned int comp_cntOfBytes = file.cntOfBytes; // sicher nötig wegen schleife...
|
||||
while (comp_cntOfBytes < 512) { // sektor ist beschrieben worden, daher nötigenfalls mit 00 füllen
|
||||
@ -80,7 +84,8 @@ void fileUpdate(void){
|
||||
comp_cntOfBytes++;
|
||||
}
|
||||
char name[13]; // zum sichern des dateinamens
|
||||
unsigned long int save_length = file.cntOfBytes + file.seek; // muss gesichert werden, wird sonst von der karte geladen und verändert !
|
||||
unsigned long int save_length = file.cntOfBytes + file.seek; // muss gesichert werden, wird sonst von der karte geladen und
|
||||
// verändert !
|
||||
strcpy(name, (char *) file.name); // muss gesichert werden, wird sonst von der karte geladen und verändert !
|
||||
|
||||
fat_setClusterChain(fat_secToClust(fat.startSectors), fat_secToClust(fat.currentSectorNr)); // verketten der geschriebenen cluster
|
||||
@ -96,10 +101,12 @@ void fileUpdate(void){
|
||||
// ist, dann wird der sektor geladen und der zähler für die bytes eines sektors gesetzt. wenn das byte nicht in den sektoren ist,
|
||||
// die "vorgesucht" wurden, müssen noch weitere sektoren der datei gesucht werden (sec > fat.endSectors).
|
||||
// *******************************************************************************************************************************
|
||||
void ffseek(unsigned long int offset){
|
||||
void ffseek(unsigned long int offset)
|
||||
{
|
||||
|
||||
#if (OVER_WRITE==1) // man muss den dateieintrag updaten, um die daten zu retten !!
|
||||
if( file.seek > file.length ) fileUpdate(); // fat verketten und datei update auf der karte !
|
||||
if (file.seek > file.length)
|
||||
fileUpdate(); // fat verketten und datei update auf der karte !
|
||||
#endif
|
||||
|
||||
fat_getFatChainClustersInRow(file.firstCluster); // suchen von anfang der cluster chain aus !
|
||||
@ -129,7 +136,8 @@ void ffseek(unsigned long int offset){
|
||||
// wechselt verzeichniss. start immer im root Dir.
|
||||
// MUSS in das direktory gewechselt werden, in dem die datei zum lesen/schreiben ist !
|
||||
// *******************************************************************************************************************************
|
||||
unsigned char ffcd(char name[]){
|
||||
unsigned char ffcd(char name[])
|
||||
{
|
||||
return (fat_cd(name));
|
||||
}
|
||||
|
||||
@ -140,7 +148,8 @@ unsigned char ffcd(char name[]){
|
||||
// eintrag in der reihe ist (nicht gelöscht, nicht frei usw). die sektoren des clusters werden nachgeladen.
|
||||
// die dateien werden mit namen und datei größe angezeigt.
|
||||
// *******************************************************************************************************************************
|
||||
void lsRowsOfClust (unsigned long int start_sec){
|
||||
void lsRowsOfClust(unsigned long int start_sec)
|
||||
{
|
||||
|
||||
unsigned char row; // reihen
|
||||
unsigned char sec = 0; // sektoren
|
||||
@ -148,7 +157,8 @@ void lsRowsOfClust (unsigned long int start_sec){
|
||||
fat_loadSector(start_sec + sec); // sektoren des clusters laden
|
||||
for (row = 0; row < 16; row++) { // geht durch reihen des sektors
|
||||
fat_loadRowOfSector(row); // reihe eines sektors (auf dem puffer) laden
|
||||
if( (file.attrib==0x20||file.attrib==0x10) && (file.name[0]!=0xE5 && file.name[0]!=0x00) ){
|
||||
if ((file.attrib == 0x20 || file.attrib == 0x10)
|
||||
&& (file.name[0] != 0xE5 && file.name[0] != 0x00)) {
|
||||
printf("Name:%s Size:%li\n", file.name, file.length);
|
||||
}
|
||||
}
|
||||
@ -161,21 +171,27 @@ void lsRowsOfClust (unsigned long int start_sec){
|
||||
// unterscheidung ob man sich im rootDir befindet nötig, weil bei fat16 im root dir eine bestimmt anzahl sektoren durchsucht
|
||||
// werden müssen und bei fat32 ab einem start cluster ! ruft lsRowsOfClust auf um cluster/sektoren anzuzeigen.
|
||||
// *******************************************************************************************************************************
|
||||
void ffls(void){
|
||||
void ffls(void)
|
||||
{
|
||||
|
||||
unsigned long int clust; // cluster
|
||||
unsigned int s; // fat16 root dir sektoren
|
||||
|
||||
if (fat.dir == 0 && fat.fatType == 16) { // IM ROOTDIR. fat16
|
||||
for(s=0;s<(unsigned int)(fat.dataDirSec+2-fat.rootDir);s++){ // zählt durch RootDir sektoren (errechnet anzahl rootDir sektoren).
|
||||
for (s = 0; s < (unsigned int) (fat.dataDirSec + 2 - fat.rootDir); s++) { // zählt durch RootDir sektoren (errechnet anzahl
|
||||
// rootDir sektoren).
|
||||
lsRowsOfClust(fat.rootDir + s); // zeigt reihen eines root dir clust an
|
||||
}
|
||||
}
|
||||
|
||||
else {
|
||||
if(fat.dir==0 && fat.fatType==32)clust=fat.rootDir; // IM ROOTDIR. fat32
|
||||
else clust=fat.dir; // NICHT ROOT DIR
|
||||
while( !((clust==0xfffffff&&fat.fatType==32)||(clust==0xffff&&fat.fatType==16)) ){ // prüft ob weitere sektoren zum lesen da sind (fat32||fat16)
|
||||
if (fat.dir == 0 && fat.fatType == 32)
|
||||
clust = fat.rootDir; // IM ROOTDIR. fat32
|
||||
else
|
||||
clust = fat.dir; // NICHT ROOT DIR
|
||||
while (!((clust == 0xfffffff && fat.fatType == 32) || (clust == 0xffff && fat.fatType == 16))) { // prüft ob weitere
|
||||
// sektoren zum lesen da
|
||||
// sind (fat32||fat16)
|
||||
lsRowsOfClust(fat_clustToSec(clust)); // zeigt reihen des clusters an
|
||||
clust = fat_getNextCluster(clust); // liest nächsten cluster des dir-eintrags
|
||||
}
|
||||
@ -189,9 +205,11 @@ void ffls(void){
|
||||
// die variable fat.dir enthält den start cluster des direktory in dem man sich grade befindet, anhand diesem,
|
||||
// kann der "." bzw ".." eintrag im ersten sektor des direktory ausgelesen und das parent direktory bestimmt werden.
|
||||
// *******************************************************************************************************************************
|
||||
unsigned char ffcdLower(void){
|
||||
unsigned char ffcdLower(void)
|
||||
{
|
||||
|
||||
if(fat.dir==0)return(1); // im root dir, man kann nicht höher !
|
||||
if (fat.dir == 0)
|
||||
return (1); // im root dir, man kann nicht höher !
|
||||
|
||||
fat_loadSector(fat_clustToSec(fat.dir)); // läd 1. sektor des aktuellen direktory.
|
||||
fat_loadRowOfSector(1); // ".." eintrag (parent dir) ist 0 wenn parent == root
|
||||
@ -211,12 +229,14 @@ unsigned char ffcdLower(void){
|
||||
// der "." hat den 1. cluster des eigenen dirs. der ".." eintrag ist der 1. cluster des parent dirs.
|
||||
// ein dir wird immer mit 0x00 initialisiert ! also alle einträge der sektoren des clusters ( bis auf . und .. einträge)!
|
||||
// *******************************************************************************************************************************
|
||||
void ffmkdir(char name[]){
|
||||
void ffmkdir(char name[])
|
||||
{
|
||||
|
||||
unsigned char i;
|
||||
unsigned int j;
|
||||
|
||||
if(0==fat_loadFileDataFromDir(name))return ; // prüft ob dirname im dir schon vorhanden, wenn ja, abbruch !
|
||||
if (0 == fat_loadFileDataFromDir(name))
|
||||
return; // prüft ob dirname im dir schon vorhanden, wenn ja, abbruch !
|
||||
|
||||
// cluster in fat setzen, und ordner eintrg im aktuellen verzeichniss machen.
|
||||
fat_getFreeClustersInRow(2); // holt neue freie cluster, ab cluster 2 ...
|
||||
@ -252,21 +272,23 @@ void ffmkdir(char name[]){
|
||||
// löscht datei/ordner aus aktuellem verzeichniss, wenn es die datei gibt.
|
||||
// löscht dateien und ordner rekursiv !
|
||||
// *******************************************************************************************************************************
|
||||
unsigned char ffrm(char name[]){
|
||||
unsigned char ffrm(char name[])
|
||||
{
|
||||
|
||||
if (0 == fat_loadFileDataFromDir(name)) { // datei oder ordner ist vorhanden, nur dann lösch operation
|
||||
|
||||
if (file.attrib != 0x10) { // ist datei.
|
||||
fat.sector[file.row << 5] = 0xE5; // datei gelöscht markieren (file.row*32, damit man auf reihen anfang kommt)
|
||||
if ((file.row - 1) >= 0) { // gibt es einen eintrag davor ?
|
||||
if(fat.sector[(file.row<<5)-21]==0x0f)fat.sector[(file.row<<5)-32]=0xE5; // langer datei eintag auch gelöscht.
|
||||
if (fat.sector[(file.row << 5) - 21] == 0x0f)
|
||||
fat.sector[(file.row << 5) - 32] = 0xE5; // langer datei eintag auch gelöscht.
|
||||
}
|
||||
fat.bufferDirty = 1; // eintrag in puffer gemacht.
|
||||
if(0==fat_getNextCluster(file.firstCluster)) return(0); // 1.cluster ist leer ?!?
|
||||
if (0 == fat_getNextCluster(file.firstCluster))
|
||||
return (0); // 1.cluster ist leer ?!?
|
||||
fat_delClusterChain(file.firstCluster); // löscht die zu der datei gehörige cluster-chain aus der fat.
|
||||
return (0);
|
||||
}
|
||||
|
||||
// TODO noch nicht optimal. zu viele schreib vorgänge beim löschen von datei einträgen. max bis zu 16/sektor !
|
||||
else { // ist ordner, dann rekursiv löschen !!
|
||||
#ifndef __AVR_ATmega8__ // mega8 zu klein für die funktionalität....
|
||||
@ -278,7 +300,8 @@ unsigned char ffrm(char name[]){
|
||||
|
||||
fat.sector[file.row << 5] = 0xE5; // löscht dir eintrag
|
||||
if ((file.row - 1) >= 0) { // gibt es einen eintrag davor (langer datei eintrag)?
|
||||
if(fat.sector[(file.row<<5)-21]==0x0f)fat.sector[(file.row<<5)-32]=0xE5; // langer datei eintag auch gelöscht
|
||||
if (fat.sector[(file.row << 5) - 21] == 0x0f)
|
||||
fat.sector[(file.row << 5) - 32] = 0xE5; // langer datei eintag auch gelöscht
|
||||
}
|
||||
fat.bufferDirty = 1; // puffer eintrag gemacht
|
||||
|
||||
@ -292,12 +315,14 @@ unsigned char ffrm(char name[]){
|
||||
do { // geht durch reihen des sektors
|
||||
fat_loadRowOfSector(i);
|
||||
|
||||
if(file.attrib!=0x10 && file.attrib!=0x00 && file.name[0]!=0xE5){ // ist kein ordner,noch nicht gelöscht, kein freier eintrag
|
||||
if (file.attrib != 0x10 && file.attrib != 0x00 && file.name[0] != 0xE5) { // ist kein ordner,noch nicht
|
||||
// gelöscht, kein freier eintrag
|
||||
fat.sector[i << 5] = 0xE5; // erster eintrag der reihe als gelöscht markiert
|
||||
fat.bufferDirty = 1; // puffer eintrag gemacht
|
||||
if (file.attrib == 0x20) { // ist datei!
|
||||
fat_delClusterChain(file.firstCluster); // ist datei, dann cluster-chain der datei löschen
|
||||
fat_loadSector(fat_clustToSec(clustsOfDir)+cntSecOfClust); // sektor neu laden, weil löschen der chain, den puffer nutzt.
|
||||
fat_loadSector(fat_clustToSec(clustsOfDir) + cntSecOfClust); // sektor neu laden, weil löschen der
|
||||
// chain, den puffer nutzt.
|
||||
}
|
||||
}
|
||||
|
||||
@ -345,7 +370,11 @@ unsigned char ffrm(char name[]){
|
||||
|
||||
cntSecOfClust = 0; // neuer cluster -> sektoren von vorne.
|
||||
clustsOfDir = fat_getNextCluster(clustsOfDir); // sucht neuen cluster der cluster-chain.
|
||||
}while( !((clustsOfDir==0xfffffff && fat.fatType==32) || (clustsOfDir==0xffff && fat.fatType==16)) ); // geht durch cluster des dirs.
|
||||
} while (!((clustsOfDir == 0xfffffff && fat.fatType == 32) || (clustsOfDir == 0xffff && fat.fatType == 16))); // geht
|
||||
// durch
|
||||
// cluster
|
||||
// des
|
||||
// dirs.
|
||||
fat_delClusterChain(own); // hier landet man, wenn der ordner voll war (auf cluster "ebene")!!
|
||||
#endif
|
||||
}
|
||||
@ -363,7 +392,8 @@ unsigned char ffrm(char name[]){
|
||||
// liest 512 bytes aus dem puffer fat.sector. dann werden neue 512 bytes der datei geladen, sind nicht genügend verkettete
|
||||
// sektoren in einer reihe bekannt, wird in der fat nachgeschaut. dann werden weiter bekannte nachgeladen...
|
||||
// *******************************************************************************************************************************
|
||||
inline unsigned char ffread(void){
|
||||
inline unsigned char ffread(void)
|
||||
{
|
||||
|
||||
if (file.cntOfBytes == 512) { /** EINEN SEKTOR GLESEN (ab hier 2 möglichkeiten !) **/
|
||||
file.cntOfBytes = 0; // byte zähler zurück setzen
|
||||
@ -387,7 +417,8 @@ inline unsigned char ffread(void){
|
||||
// zusammenhängende sektoren bekannt sein, werden die alten verkettet und neue gesucht. es ist nötig sich den letzten bekannten
|
||||
// einer kette zu merken -> file.lastCluster, um auch nicht zusammenhängende cluster verketten zu können (fat_setClusterChain macht das)!
|
||||
// *******************************************************************************************************************************
|
||||
inline void ffwrite(unsigned char c){
|
||||
inline void ffwrite(unsigned char c)
|
||||
{
|
||||
|
||||
fat.sector[file.cntOfBytes++] = c; // schreiben des chars auf den puffer sector und zähler erhöhen (pre-increment)
|
||||
fat.bufferDirty = 1; // puffer dirty weil geschrieben und noch nicht auf karte.
|
||||
@ -416,9 +447,11 @@ inline void ffwrite(unsigned char c){
|
||||
// sektoren bekannt sein(datenmenge zu groß), werden die alten verkettet und neue gesucht. es ist nötig sich den letzten bekannten einer
|
||||
// kette zu merken -> file.lastCluster, um auch nicht zusammenhängende cluster verketten zu können (fat_setClusterChain macht das)!
|
||||
// es ist beim überschreiben nötig, die schon beschriebenen sektoren der datei zu laden, damit man die richtigen daten
|
||||
// hat. das ist blöd, weil so ein daten overhead von 50% entsteht. da lesen aber schneller als schreiben geht, verliert man nicht 50% an geschwindigkeit.
|
||||
// hat. das ist blöd, weil so ein daten overhead von 50% entsteht. da lesen aber schneller als schreiben geht, verliert man nicht 50% an
|
||||
// geschwindigkeit.
|
||||
// *******************************************************************************************************************************
|
||||
inline void ffwrite(unsigned char c){
|
||||
inline void ffwrite(unsigned char c)
|
||||
{
|
||||
|
||||
fat.sector[file.cntOfBytes++] = c; // schreiben des chars auf den puffer sector und zähler erhöhen (pre-increment)
|
||||
fat.bufferDirty = 1; // puffer dirty weil geschrieben und noch nicht auf karte.
|
||||
@ -432,9 +465,9 @@ inline void ffwrite(unsigned char c){
|
||||
if (file.seek > file.length) { // außerhalb der datei !!
|
||||
fat_setClusterChain(fat_secToClust(fat.startSectors), fat_secToClust(fat.endSectors)); // verketten der beschriebenen.
|
||||
fat_getFreeClustersInRow(file.lastCluster); // neue leere sektoren benötigt, also suchen.
|
||||
}
|
||||
else {
|
||||
fat_getFatChainClustersInRow( fat_getNextCluster(file.lastCluster) ); // noch innerhalb der datei, deshlab verkettete suchen.
|
||||
} else {
|
||||
fat_getFatChainClustersInRow(fat_getNextCluster(file.lastCluster)); // noch innerhalb der datei, deshlab verkettete
|
||||
// suchen.
|
||||
}
|
||||
fat.currentSectorNr = fat.startSectors - 1; // setzen des 1. sektors der neuen reihe zum schreiben.
|
||||
}
|
||||
@ -448,16 +481,10 @@ inline void ffwrite(unsigned char c){
|
||||
// *******************************************************************************************************************************
|
||||
// schreibt string auf karte, siehe ffwrite()
|
||||
// *******************************************************************************************************************************
|
||||
inline void ffwrites(const char *s ){
|
||||
while (*s) ffwrite(*s++);
|
||||
inline void ffwrites(const char *s)
|
||||
{
|
||||
while (*s)
|
||||
ffwrite(*s++);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -24,12 +24,9 @@
|
||||
void lsRowsOfClust(unsigned long int start_sec); // zeigt reihen eines clusters an, ab start_sec
|
||||
void fileUpdate(void); // updatet datei eintrag auf karte
|
||||
|
||||
// **************************************************************************************************************************// #######################################################################################################################
|
||||
// **************************************************************************************************************************//
|
||||
// #######################################################################################################################
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,29 +1,26 @@
|
||||
/*#######################################################################################
|
||||
Connect AVR to MMC/SD
|
||||
|
||||
Copyright (C) 2004 Ulrich Radig
|
||||
|
||||
Bei Fragen und Verbesserungen wendet euch per EMail an
|
||||
|
||||
mail@ulrichradig.de
|
||||
|
||||
oder im Forum meiner Web Page : www.ulrichradig.de
|
||||
|
||||
Dieses Programm ist freie Software. Sie können es unter den Bedingungen der
|
||||
GNU General Public License, wie von der Free Software Foundation veröffentlicht,
|
||||
weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder
|
||||
(nach Ihrer Option) jeder späteren Version.
|
||||
|
||||
Die Veröffentlichung dieses Programms erfolgt in der Hoffnung,
|
||||
daß es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE,
|
||||
sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT
|
||||
FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
|
||||
|
||||
Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
|
||||
Programm erhalten haben.
|
||||
Falls nicht, schreiben Sie an die Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
#######################################################################################*/
|
||||
/*
|
||||
* ####################################################################################### Connect AVR to MMC/SD
|
||||
*
|
||||
* Copyright (C) 2004 Ulrich Radig
|
||||
*
|
||||
* Bei Fragen und Verbesserungen wendet euch per EMail an
|
||||
*
|
||||
* mail@ulrichradig.de
|
||||
*
|
||||
* oder im Forum meiner Web Page : www.ulrichradig.de
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License, wie von der Free Software
|
||||
* Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder (nach Ihrer Option) jeder
|
||||
* späteren Version.
|
||||
*
|
||||
* Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE,
|
||||
* sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU
|
||||
* General Public License.
|
||||
*
|
||||
* Sie sollten eine Kopie der GNU General Public License zusammen mit diesem Programm erhalten haben. Falls nicht, schreiben Sie an die
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
* #######################################################################################
|
||||
*/
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <util/delay.h>
|
||||
@ -221,4 +218,3 @@ uint8_t mmc_read_csd(uint8_t * Buffer)
|
||||
mmc_read_block(cmd, Buffer, 16);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
/*#######################################################################################
|
||||
Connect ARM to MMC/SD
|
||||
|
||||
Copyright (C) 2004 Ulrich Radig
|
||||
#######################################################################################*/
|
||||
/*
|
||||
* ####################################################################################### Connect ARM to MMC/SD
|
||||
*
|
||||
* Copyright (C) 2004 Ulrich Radig #######################################################################################
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _MMC_H
|
||||
|
||||
@ -124,26 +124,12 @@ void test_sdcard(void){
|
||||
printf("fatinit failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("Root dirlist\n");
|
||||
ffls();
|
||||
printf("FOLDER2 dirlist\n");
|
||||
ffcd("FOLDER1");
|
||||
ffls();
|
||||
char datei[12]="test.txt"; // hier muss platz für 11 zeichen sein (8.3), da fat_str diesen string benutzt !!
|
||||
fat_str(datei);
|
||||
ffrm( datei ); // löschen der datei/ordner falls vorhanden
|
||||
printf("open %s\n",datei);
|
||||
ffopen( datei );
|
||||
printf("write %s\n",datei);
|
||||
ffwrites((char*)"Hallo Datei :)");
|
||||
ffwrite(0x0D);
|
||||
ffwrite(0x0A);
|
||||
printf("close %s\n",datei);
|
||||
ffclose();
|
||||
printf("open %s\n",datei);
|
||||
ffopen( datei );
|
||||
printf("open %s\n",datei);
|
||||
unsigned long int seek=file.length; // eine variable setzen und runterzählen bis 0 geht am schnellsten !
|
||||
do{
|
||||
printf("%c",ffread()); // liest ein zeichen und gibt es über uart aus !
|
||||
}while(--seek); // liest solange bytes da sind (von datei länge bis 0)
|
||||
ffclose(); // schließt datei
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -2,6 +2,8 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>currentDocument</key>
|
||||
<string>poc/avr_usbload/sram.c</string>
|
||||
<key>documents</key>
|
||||
<array>
|
||||
<dict>
|
||||
@ -19,7 +21,125 @@
|
||||
<integer>271</integer>
|
||||
<key>metaData</key>
|
||||
<dict>
|
||||
<key>avr/bootloader/bootloader.c</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>11</integer>
|
||||
<key>line</key>
|
||||
<integer>231</integer>
|
||||
</dict>
|
||||
<key>columnSelection</key>
|
||||
<false/>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>189</integer>
|
||||
<key>selectFrom</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>8</integer>
|
||||
<key>line</key>
|
||||
<integer>231</integer>
|
||||
</dict>
|
||||
<key>selectTo</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>14</integer>
|
||||
<key>line</key>
|
||||
<integer>231</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>avr/bootloader/config.h</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>0</integer>
|
||||
<key>line</key>
|
||||
<integer>22</integer>
|
||||
</dict>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>avr/usbload/fat.c</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>0</integer>
|
||||
<key>line</key>
|
||||
<integer>207</integer>
|
||||
</dict>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>613</integer>
|
||||
</dict>
|
||||
<key>avr/usbload/fat.h</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>28</integer>
|
||||
<key>line</key>
|
||||
<integer>21</integer>
|
||||
</dict>
|
||||
<key>columnSelection</key>
|
||||
<false/>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>0</integer>
|
||||
<key>selectFrom</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>23</integer>
|
||||
<key>line</key>
|
||||
<integer>21</integer>
|
||||
</dict>
|
||||
<key>selectTo</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>34</integer>
|
||||
<key>line</key>
|
||||
<integer>21</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>avr/usbload/file.c</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>45</integer>
|
||||
<key>line</key>
|
||||
<integer>135</integer>
|
||||
</dict>
|
||||
<key>columnSelection</key>
|
||||
<false/>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>109</integer>
|
||||
<key>selectFrom</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>41</integer>
|
||||
<key>line</key>
|
||||
<integer>135</integer>
|
||||
</dict>
|
||||
<key>selectTo</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>45</integer>
|
||||
<key>line</key>
|
||||
<integer>135</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>avr/usbload/file.h</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
@ -33,6 +153,208 @@
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>avr/usbload/main.c</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>0</integer>
|
||||
<key>line</key>
|
||||
<integer>25</integer>
|
||||
</dict>
|
||||
<key>columnSelection</key>
|
||||
<false/>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>293</integer>
|
||||
<key>selectFrom</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>0</integer>
|
||||
<key>line</key>
|
||||
<integer>24</integer>
|
||||
</dict>
|
||||
<key>selectTo</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>0</integer>
|
||||
<key>line</key>
|
||||
<integer>25</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>avr/usbload/mmc.c</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>0</integer>
|
||||
<key>line</key>
|
||||
<integer>224</integer>
|
||||
</dict>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>173</integer>
|
||||
</dict>
|
||||
<key>avr/usbload/mmc.h</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>0</integer>
|
||||
<key>line</key>
|
||||
<integer>39</integer>
|
||||
</dict>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>avr/usbload/shared_memory.h</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>0</integer>
|
||||
<key>line</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>avr/usbload/testing.c</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>17</integer>
|
||||
<key>line</key>
|
||||
<integer>130</integer>
|
||||
</dict>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>31</integer>
|
||||
</dict>
|
||||
<key>avr/usbload/testing.h</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>0</integer>
|
||||
<key>line</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>poc/avr_sdcard/fat.c</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>0</integer>
|
||||
<key>line</key>
|
||||
<integer>38</integer>
|
||||
</dict>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>poc/avr_sdcard/fat.h</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>4</integer>
|
||||
<key>line</key>
|
||||
<integer>63</integer>
|
||||
</dict>
|
||||
<key>columnSelection</key>
|
||||
<false/>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>23</integer>
|
||||
<key>selectFrom</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>1</integer>
|
||||
<key>line</key>
|
||||
<integer>63</integer>
|
||||
</dict>
|
||||
<key>selectTo</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>9</integer>
|
||||
<key>line</key>
|
||||
<integer>63</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>poc/avr_sdcard/main.c</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>12</integer>
|
||||
<key>line</key>
|
||||
<integer>170</integer>
|
||||
</dict>
|
||||
<key>columnSelection</key>
|
||||
<false/>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>137</integer>
|
||||
<key>selectFrom</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>1</integer>
|
||||
<key>line</key>
|
||||
<integer>170</integer>
|
||||
</dict>
|
||||
<key>selectTo</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>20</integer>
|
||||
<key>line</key>
|
||||
<integer>170</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>poc/avr_sdcard/main.lst</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>0</integer>
|
||||
<key>line</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>poc/avr_usbload/sram.c</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
<dict>
|
||||
<key>column</key>
|
||||
<integer>0</integer>
|
||||
<key>line</key>
|
||||
<integer>22</integer>
|
||||
</dict>
|
||||
<key>firstVisibleColumn</key>
|
||||
<integer>0</integer>
|
||||
<key>firstVisibleLine</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>snes/banktest/LoadGraphics.asm</key>
|
||||
<dict>
|
||||
<key>caret</key>
|
||||
@ -62,6 +384,26 @@
|
||||
<integer>211</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>openDocuments</key>
|
||||
<array>
|
||||
<string>avr/usbload/mmc.c</string>
|
||||
<string>avr/usbload/testing.h</string>
|
||||
<string>avr/usbload/testing.c</string>
|
||||
<string>poc/avr_sdcard/fat.c</string>
|
||||
<string>poc/avr_sdcard/fat.h</string>
|
||||
<string>poc/avr_sdcard/main.lst</string>
|
||||
<string>avr/bootloader/config.h</string>
|
||||
<string>avr/bootloader/bootloader.c</string>
|
||||
<string>poc/avr_sdcard/main.c</string>
|
||||
<string>poc/avr_usbload/sram.c</string>
|
||||
<string>avr/usbload/file.c</string>
|
||||
<string>avr/usbload/file.h</string>
|
||||
<string>avr/usbload/mmc.h</string>
|
||||
<string>avr/usbload/shared_memory.h</string>
|
||||
<string>avr/usbload/fat.c</string>
|
||||
<string>avr/usbload/fat.h</string>
|
||||
<string>avr/usbload/main.c</string>
|
||||
</array>
|
||||
<key>showFileHierarchyDrawer</key>
|
||||
<false/>
|
||||
<key>showFileHierarchyPanel</key>
|
||||
@ -80,7 +422,7 @@
|
||||
<true/>
|
||||
<key>subItems</key>
|
||||
<dict>
|
||||
<key>usbload</key>
|
||||
<key>bootloader</key>
|
||||
<dict>
|
||||
<key>isExpanded</key>
|
||||
<true/>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user