You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

187 lines
7.7 KiB

/*
It is an open source software to implement FAT file system to
small embedded systems. This is a free software and is opened for education,
research and commercial developments under license policy of following trems.
(C) 2013 vinxru
(C) 2010, ChaN, all right reserved.
It is a free software and there is NO WARRANTY.
No restriction on use. You can use, modify and redistribute it for
personal, non-profit or commercial use UNDER YOUR RESPONSIBILITY.
Redistributions of source code must retain the above copyright notice.
Version 0.99 5-05-2013
*/
#ifndef _FS_H_
#define _FS_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
/* Disable checking and kill the file system */
/* Ñ ïîìîùüþ ýòîãî ìàêðîñà ìîæíî îòêëþ÷èòü ïðîååðêè, ÷òî áû ñýêîíîìèòü ÏÇÓ è óáèòü ôàéëîâóþ ñèñòåìó.*/
/* #define FS_DISABLE_CHECK */
/* Two opened files */
/* Äâà îòêðûòûõ ôàéëà */
/* #define FS_DISABLE_SWAP */
/* Calculation of free disk space */
/* Îïðåäåëåíèå ñâîáîäíîãî ìåñòà íà äèñêå */
/* #define FS_DISABLE_GETFREESPACE */
/* Work buffer for filesystem */
/* Áóôåð äëÿ ðàáîòû ôàéëîâîé ñèñòåìû */
extern uint8_t buf[];
typedef struct
{
#ifndef FS_DISABLE_CHECK
uint8_t opened; /* ×òî îòêðûòî: OPENED_NONE, OPENED_FILE, OPENED_DIR */
#endif
uint8_t entry_able; /* Ðåçóëüòàò âûïîëíåíèÿ ôóíêöèè fs_dirread */
uint16_t entry_index; /* Íîìåð çàïèñè â êàòàëîãå */
uint32_t entry_cluster; /* Êëàñòåð çàïèñè â êàòàëîãå */
uint32_t entry_sector; /* Ñåêòîð çàïèñè â êàòàëîãå */
uint32_t entry_start_cluster; /* Ïåðâûé ñåêòîð ôàéëà èëè êàòàëîãà (0 - êîðíåâîé êàòàëîã FAT16) */
uint32_t ptr; /* Óêàçàòåëü ÷òåíèÿ/çàïèñè ôàéëà*/
uint32_t size; /* Ðàçìåð ôàéëà / File size */
uint32_t cluster; /* Òåêóùèé êëàñòåð ôàéëà */
uint32_t sector; /* Òåêóùèé ñåêòîð ôàéëà */
uint8_t changed; /* Ðàçìåð ôàéëà èçìåíèëñÿ, íàäî ñîõðàíèòü */
} File;
/* Error */
/* Îøèáêè ôàéëîâîé ñèñòåìû */
#define ERR_OK 0 // Íåò îøèáêè
#define ERR_NO_FILESYSTEM 1 // Ôàéëîâàÿ ñèñòåìà íå îáíàðóæåíà
#define ERR_DISK_ERR 2 // Îøèáêà ÷òåíèÿ/çàïèñè
#define ERR_NOT_OPENED 3 // Ôàéë/ïàïêà íå îòêðûòà
#define ERR_NO_PATH 4 // Ôàéë/ïàïêà íå íàéäåíà
#define ERR_DIR_FULL 5 // Ïàïêà ñîäåðæèò ìàêñèìàëüíîå êîë-âî ôàéëîâ
#define ERR_NO_FREE_SPACE 6 // Íåò ñâîáîäíîãî ìåñòà
#define ERR_DIR_NOT_EMPTY 7 // Íåëüçÿ óäàëèòü ïàïêó, îíà íå ïóñòà
#define ERR_FILE_EXISTS 8 // Ôàéë/ïàïêà ñ òàêèì èìåíåì óæå ñóùåñòâóåò
#define ERR_NO_DATA 9 // fs_file_wtotal=0 ïðè âûçîâå ôóíêöèè fs_write_begin
#define ERR_MAX_FILES 10 // Íå èñïîëüçóåòñÿ ôàéëîâîé ñèñòåìîé, ðåçåðâ
#define ERR_RECV_STRING 11 // Íå èñïîëüçóåòñÿ ôàéëîâîé ñèñòåìîé, ðåçåðâ
#define ERR_INVALID_COMMAND 12 // Íå èñïîëüçóåòñÿ ôàéëîâîé ñèñòåìîé, ðåçåðâ
#define ERR_ALREADY_OPENED 13 // Ôàéë óæå îòêðûò (fs_swap)
/* Filesystem variables. Can change */
/* Ïåðåìåííûå ôàéëîâîé ñèñòåìû. Ìîæíî èçìåíÿòü */
extern uint32_t fs_tmp;
extern uint8_t lastError; /* Ïîñëåäíÿÿ îøèáêà ôàéëîâîé ñèñòåìû èëè äèñêà */ // ÎÒÑÞÄÀ ÂÛÐÂÀË ÏÅÐÅÌÅÍÍÛÅ
extern uint16_t fs_wtotal; // Èñïîëüçóåòñÿ ôóíêöèÿìè fs_write_start, fs_write_end*/
extern uint8_t fs_type; /* FS_FAT16, FS_FAT32, FS_ERROR */
/* Maximal length of file name */
/* Ìàêñèìàëüíàÿ äëèíà èìåíè */
#define FS_MAXFILE 469
/* Result of fs_readdir */
/* Îïèñàòåëü ïðî÷èòàííûé ôóíêöèåé fs_readdir */
#define FS_DIRENTRY (buf + 480)
/* Functions. Returns not 0 if error occured. Destroy buf variable*/
/* Ôóíêöÿèè. Âîçðàùàþò íå 0, åñëè îøèáêà. Âñå ôóíêöèè ïîðòÿò buf */
uint8_t fs_init(); /* Èíèöèàëèàçöèÿ ôàéëîâîé ñèñòåìû / Init filesystem */
uint8_t fs_check(); /* Ïðîâåðêà íàëè÷èÿ äèñêà, è åñëè íóæíî, òî åãî èíèöèàëèçàöèÿ / Checking the disk and, if necessary, it will be initialized */
uint8_t fs_readdir(); /* Ïðî÷èòàòü ñîäåæèìîå ïàïêè â DIRENTRY / Read folder contents in DIRENTRY */
uint8_t fs_delete(); /* Óäàëèòü ôàéë èëè ïàïêó, èìÿ â buf / Delete file or folder, name in buf */
uint8_t fs_open0(uint8_t what); /* Îòêðûòü/ñîçäàòü ôàéë èëè ïàïêó, èìÿ â buf. Open/create file or foder, name in buf */
uint8_t fs_move0(); /* Ïåðåìåñòèòü ôàéë/ïàïêó. Move file or folder, source file must been opened, destination name in buf */
uint8_t fs_move(const char* from, const char* to); /* Ïåðåìåñòèòü ôàéë/ïàïêó. Move file or folder. */
uint8_t fs_lseek(uint32_t ptr, uint8_t mode); /* Óñòàíîâèòü óêàçàòåëü ÷òåíèÿ/çàïèñè ôàéëà, óâåëè÷èâàåò ðàçìåð ôàéëà. / Set file pointer, enlarge file size. */
uint8_t fs_tell(); /* Ïîëó÷èòü óêàçàòåëü ÷òåíèÿ/çàïèñè ôàéëà â fs_tmp / Get file pointer in fs_tmp. */
uint8_t fs_getfilesize(); /* Ïîëó÷èòü ðàçìåð ôàéëà / Get file size. */
uint8_t fs_read0(uint8_t* ptr, uint16_t len); /* Ïðî÷èòàòü èç ôàéëà. ÍÅËÜÇß ÂÛÕÎÄÈÒÜ ÇÀ ÏÐÅÄÅËÛ ÔÀÉËÀ! / Read from the file, DO NOT COME OUT FILE */
uint8_t fs_read(uint8_t* ptr, uint16_t len, uint16_t* readed); /* Ïðî÷èòàòü èç ôàéëà. / Read from the file. */
uint8_t fs_write(uint8_t* ptr, uint16_t len); /* Çàïèñàòü â ôàéë, óâåëè÷èâàåò ðàçìåð ôàéëà. / Çàïèñàòü â ôàéë, enlarge file size. */
uint8_t fs_write_eof(); /* Óñòàíîâèòü êîíåö ôàéëà, óìåíüøàåò ðàçìåð ôàéëà. / Set end of file, reduces file size */
uint8_t fs_gettotal(); /* Îáùåå ìåñòî íà äèñêå â fs_tmp â ìåãàáàéòàõ / Total disk space in fs_tmp (megabytes) */
#ifndef FS_DISABLE_SWAP
void fs_swap(); /* Ïåðåêëþ÷èòñÿ íà âòîðîé ôàéë / Switch to the second file */
#endif
#ifndef FS_DISABLE_GETFREESPACE
uint8_t fs_getfree(); /* Ñâîáîäíîå ìåñòî íà äèñêå â fs_tmp â ìåãàáàéòàõ / Free disk space in fs_tmp (megabytes) */
#endif
/* Ôóíêöèè íèæå ïîçâîëÿþò èñïîëüçîâàòü äëÿ çàïèñè áóôåð (buf).
* The functions below can be used to write the buffer (buf).
*
* wtotal = ðàçìåð äàííûõ äëÿ çàïèñè;
* while(wtotal) {
* fs_write_start(&wtotal);
* Êîïèðóåì fs_file_wlen áàéò â fs_file_wbuf
* Íè îäíà ôóíêöèÿ ÔÑ íå äîëæåà âûïîíÿòñüÿ ìåæäó íèìè
* fs_write_end(&wtotal);
* }
*
* See the source of fs_write
* Èëè ñìîòðè èñõîäíèêè fs_write
*/
#define fs_file_wlen (*(uint16_t*)&fs_tmp)
#define fs_file_woff ((uint16_t*)&fs_tmp)[1]
#define fs_file_wbuf (buf + fs_file_woff)
uint8_t fs_write_start();
uint8_t fs_write_end();
/* Derived from the function fs_open0 */
/* Ïðîèçâîäíûå îò ôóíêöèè fs_open0 */
uint8_t fs_open(); /* Îòêðûòü ôàéë */
uint8_t fs_opendir(); /* Îòêðûòü ïàïêó */
#define fs_openany() fs_open0(OPENED_NONE) /* Îòêðûòü ôàéë èëè ïàïêó */
#define fs_create() fs_open0(OPENED_FILE) /* Ñîçäàòü ôàéë */
#define fs_createdir() fs_open0(OPENED_DIR) /* Ñîçäàòü ïàïêó */
extern File fs_file;
/* Values ??fs_opened */
/* Çíà÷åíèÿ fs_opened */
#define OPENED_NONE 0
#define OPENED_FILE 1
#define OPENED_DIR 2
/* File attributes */
/* Àòðèáóòû ôàéëîâ */
#define AM_RDO 0x01 /* Read only */
#define AM_HID 0x02 /* Hidden */
#define AM_SYS 0x04 /* System */
#define AM_VOL 0x08 /* Volume label */
#define AM_DIR 0x10 /* Directory */
#define AM_ARC 0x20 /* Archive */
/* Fodler descriptor (FS_DIRENTRY) */
/* Îïèñàòåëü */
#define DIR_Name 0
#define DIR_Attr 11
#define DIR_NTres 12
#define DIR_CrtTime 14
#define DIR_CrtDate 16
#define DIR_FstClusHI 20
#define DIR_WrtTime 22
#define DIR_WrtDate 24
#define DIR_FstClusLO 26
#define DIR_FileSize 28
#ifdef __cplusplus
}
#endif
#endif