Merge branch 'mmc' of git@github.com:optixx/quickdev16 into mmc
Conflicts: avr/usbload/fat.h avr/usbload/file.c avr/usbload/testing.c
This commit is contained in:
commit
8d961dc446
@ -6,7 +6,8 @@
|
||||
|
||||
#include "fat.h"
|
||||
#include "file.h"
|
||||
#include "hardware.h"
|
||||
#include "mmc.h"
|
||||
#include "config.h"
|
||||
|
||||
struct Fat fat; // wichtige daten/variablen der fat
|
||||
struct File file; // wichtige dateibezogene daten/variablen
|
||||
|
||||
@ -5,12 +5,13 @@
|
||||
|
||||
// **************************************************************************************************************************
|
||||
// WICHTIGE SCHLATER: -> hier kann die code größe angepasst werden, zu lasten der funktionalität !
|
||||
#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 SMALL_FILE_SYSTEM 0 // wenn 1 dann ist kleines file system, wenn 0 dann komplette file unterstützung !
|
||||
#define WRITE 0 // wenn 1 dann ist write an, wenn 0 dann read only !
|
||||
#define OVER_WRITE 0 // 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 !
|
||||
|
||||
// 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"
|
||||
|
||||
|
||||
@ -2,11 +2,10 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "hardware.h"
|
||||
#include "mmc.h"
|
||||
#include "fat.h"
|
||||
#include "file.h"
|
||||
|
||||
|
||||
#include "config.h"
|
||||
|
||||
// *******************************************************************************************************************************
|
||||
// 2 möglichkeiten beim öffnen, datei existiert(return 1) oder muss angelegt werden(return 2)
|
||||
@ -17,10 +16,9 @@
|
||||
// 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.
|
||||
//*******************************************************************************************************************************
|
||||
uint8_t ffopen(char name[])
|
||||
{
|
||||
unsigned char ffopen(char name[]){
|
||||
|
||||
uint8_t file_flag = fat_loadFileDataFromDir(name); // prüfung ob datei vorhanden und evetuelles laden des file struct
|
||||
unsigned char file_flag=fat_loadFileDataFromDir(name); //prüfung ob datei vorhanden und evetuelles laden des file struct
|
||||
|
||||
if( file_flag==0 ){ /** Datei existiert, anlegen nicht nötig! **/
|
||||
fat_getFatChainClustersInRow( file.firstCluster ); // verkettete cluster aus der fat-chain suchen.
|
||||
@ -43,7 +41,6 @@ uint8_t ffopen(char name[])
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
//*******************************************************************************************************************************
|
||||
// schließt die datei operation ab. eigentlich nur nötig wenn geschrieben wurde. es gibt 2 möglichkeiten :
|
||||
// 1. die datei wird geschlossen und es wurde über die alte datei länge hinaus geschrieben.
|
||||
@ -75,17 +72,17 @@ uint8_t 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)
|
||||
{
|
||||
#if (WRITE==1)
|
||||
|
||||
uint16_t comp_cntOfBytes = file.cntOfBytes; // sicher nötig wegen schleife...
|
||||
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
|
||||
fat.sector[comp_cntOfBytes]=0x00; // beschreibt ungenutzte bytes mit 0x00
|
||||
comp_cntOfBytes++;
|
||||
}
|
||||
char name[13]; // zum sichern des dateinamens
|
||||
uint32_t 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
|
||||
@ -95,22 +92,25 @@ void fileUpdate(void)
|
||||
fat_writeSector(fat.currentSectorNr);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
// *******************************************************************************************************************************
|
||||
// offset byte wird übergeben. es wird durch die sektoren der datei gespult (gerechnet), bis der sektor mit dem offset byte erreicht
|
||||
// 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(uint32_t offset)
|
||||
{
|
||||
void ffseek(unsigned long int offset){
|
||||
|
||||
#if (WRITE==1)
|
||||
|
||||
#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
|
||||
#endif
|
||||
|
||||
fat_getFatChainClustersInRow(file.firstCluster); // suchen von anfang der cluster chain aus !
|
||||
uint32_t sec = fat.startSectors; // sektor variable zum durchgehen durch die sektoren
|
||||
unsigned long int sec=fat.startSectors; // sektor variable zum durchgehen durch die sektoren
|
||||
file.seek=0; // weil auch von anfang an der chain gesucht wird mit 0 initialisiert
|
||||
|
||||
while(offset>=512){ /** suchen des sektors in dem offset ist **/
|
||||
@ -229,14 +229,14 @@ uint8_t 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[])
|
||||
{
|
||||
#if (WRITE==1)
|
||||
|
||||
uint8_t i;
|
||||
uint16_t j;
|
||||
void ffmkdir(char name[]){
|
||||
|
||||
if (0 == fat_loadFileDataFromDir(name))
|
||||
return; // prüft ob dirname im dir schon vorhanden, wenn ja, abbruch !
|
||||
unsigned char i;
|
||||
unsigned int j;
|
||||
|
||||
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 ...
|
||||
@ -260,7 +260,7 @@ void ffmkdir(char name[])
|
||||
fat_makeRowDataEntry(1,".. ",0x10,fat.dir,0); // macht ".." eintrag des dirs
|
||||
fat_writeSector(fat_clustToSec(file.firstCluster)); // schreibt einträge auf karte !
|
||||
}
|
||||
|
||||
#endif //WRITE
|
||||
#endif // ffmkdir wegen atmega8
|
||||
#endif
|
||||
|
||||
|
||||
@ -29,6 +29,7 @@
|
||||
#include "sram.h"
|
||||
#include "debug.h"
|
||||
#include "crc.h"
|
||||
#include "config.h"
|
||||
#include "info.h"
|
||||
|
||||
#include "mmc.h"
|
||||
@ -127,9 +128,29 @@ void test_sdcard(void){
|
||||
|
||||
printf("Root dirlist\n");
|
||||
ffls();
|
||||
printf("FOLDER2 dirlist\n");
|
||||
ffcd("FOLDER1");
|
||||
ffls();
|
||||
|
||||
#if (WRITE==1)
|
||||
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
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user