sync
This commit is contained in:
236
firmware/include/fs.h
Normal file
236
firmware/include/fs.h
Normal file
@@ -0,0 +1,236 @@
|
||||
#ifndef FS_H
|
||||
#define FS_H
|
||||
|
||||
#include <zephyr/fs/fs.h>
|
||||
|
||||
#define MAX_PATH_LEN 32U
|
||||
|
||||
typedef struct slot_info_t {
|
||||
size_t start_addr;
|
||||
size_t size;
|
||||
} slot_info_t;
|
||||
|
||||
typedef enum {
|
||||
FS_MSG_START,
|
||||
FS_MSG_CHUNK,
|
||||
FS_MSG_EOF,
|
||||
FS_MSG_ABORT
|
||||
} fs_msg_type_t;
|
||||
|
||||
typedef struct {
|
||||
fs_msg_type_t type;
|
||||
|
||||
/* Die Union spart RAM, da Start- und Chunk-Parameter
|
||||
nie gleichzeitig im selben Message-Paket benötigt werden. */
|
||||
union {
|
||||
/* Payload für FS_MSG_START */
|
||||
struct {
|
||||
/* Der String wird sicher in die Queue kopiert */
|
||||
char filename[MAX_PATH_LEN];
|
||||
uint32_t expected_size;
|
||||
uint32_t start_position;
|
||||
} start;
|
||||
|
||||
/* Payload für FS_MSG_CHUNK */
|
||||
struct {
|
||||
void *slab_ptr;
|
||||
uint32_t chunk_size;
|
||||
} chunk;
|
||||
};
|
||||
} fs_msg_t;
|
||||
|
||||
extern struct k_msgq fs_msgq;
|
||||
|
||||
/**
|
||||
* @brief Initializes the filesystem by mounting it
|
||||
*/
|
||||
int fs_init(void);
|
||||
|
||||
/**
|
||||
* @brief Puts the QSPI flash into deep sleep mode to save power
|
||||
*/
|
||||
int fs_pm_flash_suspend(void);
|
||||
|
||||
/**
|
||||
* @brief Resumes the QSPI flash from deep sleep mode
|
||||
*/
|
||||
int fs_pm_flash_resume(void);
|
||||
|
||||
/**
|
||||
* @brief Wrapper around fs_open that handles power management for the flash
|
||||
* Resumes the flash before opening and suspends it if opening fails
|
||||
* @param file Pointer to fs_file_t structure to be initialized
|
||||
* @param path Path to the file to open
|
||||
* @param mode Open flags (e.g. FS_O_READ, FS_O_WRITE)
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
int fs_pm_open(struct fs_file_t *file, const char *path, fs_mode_t mode);
|
||||
|
||||
/**
|
||||
* @brief Wrapper around fs_close that handles power management for the flash
|
||||
* Resumes the flash after closing and suspends it if closing fails
|
||||
* @param file Pointer to fs_file_t structure to be closed
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
int fs_pm_close(struct fs_file_t *file);
|
||||
|
||||
/**
|
||||
* @brief Wrapper around fs_opendir that handles power management for the flash
|
||||
* Resumes the flash before opening and suspends it if opening fails
|
||||
* @param dirp Pointer to fs_dir_t structure to be initialized
|
||||
* @param path Path to the directory to open
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
int fs_pm_opendir(struct fs_dir_t *dirp, const char *path);
|
||||
|
||||
/**
|
||||
* @brief Wrapper around fs_closedir that handles power management for the flash
|
||||
* Resumes the flash after closing and suspends it if closing fails
|
||||
* @param dirp Pointer to fs_dir_t structure to be closed
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
int fs_pm_closedir(struct fs_dir_t *dirp);
|
||||
|
||||
/**
|
||||
* @brief Unlinks (deletes) a file, ensuring the flash is active during the operation
|
||||
* @param path Path to the file to unlink
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
int fs_pm_unlink(const char *path);
|
||||
|
||||
/**
|
||||
* @brief Wrapper around fs_statvfs that handles power management for the flash
|
||||
* Resumes the flash before getting stats and suspends it afterwards
|
||||
* @param path Path to the filesystem to get stats for
|
||||
* @param stat Pointer to fs_statvfs structure to be filled with stats
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
int fs_pm_statvfs(const char *path, struct fs_statvfs *stat);
|
||||
|
||||
/**
|
||||
* @brief Wrapper around fs_stat that handles power management for the flash
|
||||
* Resumes the flash before stat and suspends it afterwards
|
||||
* @param path Path to file or directory
|
||||
* @param entry Pointer to fs_dirent structure to receive metadata
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
int fs_pm_stat(const char *path, struct fs_dirent *entry);
|
||||
|
||||
/**
|
||||
* @brief Wrapper around fs_mkdir that handles power management for the flash
|
||||
* Resumes the flash before creating the directory and suspends it afterwards
|
||||
* @param path Path to the directory to create
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
int fs_pm_mkdir(const char *path);
|
||||
|
||||
/**
|
||||
* @brief Wrapper around fs_rename that handles power management for the flash
|
||||
* Resumes the flash before renaming and suspends it afterwards
|
||||
* @param old_path Current path of the file or directory
|
||||
* @param new_path New path for the file or directory
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
int fs_pm_rename(const char *old_path, const char *new_path);
|
||||
|
||||
/**
|
||||
* @brief Recursively creates directories for the given path, ensuring the flash is active during the operation
|
||||
* @param path Path to the directory to create (can include multiple levels, e.g. "/dir1/dir2/dir3")
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
int fs_pm_mkdir_recursive(char *path);
|
||||
|
||||
/**
|
||||
* @brief Recursively removes a directory and all its contents, ensuring the flash is active during the operation
|
||||
* @param path Path to the directory to remove
|
||||
* @param max_len Maximum length of the path buffer
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
int fs_pm_rm_recursive(char *path, size_t max_len);
|
||||
|
||||
/**
|
||||
* @brief Gets the length of the audio data in a file, accounting for any metadata tags
|
||||
* @param fp Pointer to an open fs_file_t structure representing the audio file
|
||||
* @return Length of the audio data in bytes, or negative error code on failure
|
||||
*/
|
||||
int fs_get_audio_data_len(struct fs_file_t *fp);
|
||||
|
||||
/**
|
||||
* @brief Reads audio data from a file, ensuring that it does not read past the audio data limit
|
||||
* @param fp Pointer to an open fs_file_t structure representing the audio file
|
||||
* @param buffer Pointer to the buffer to read data into
|
||||
* @param len Maximum number of bytes to read
|
||||
* @param audio_limit Maximum byte offset for audio data (e.g. file size minus metadata)
|
||||
* @return Number of bytes read, or negative error code on failure
|
||||
*/
|
||||
int fs_read_audio(struct fs_file_t *fp, void *buffer, size_t len, size_t audio_limit);
|
||||
|
||||
/**
|
||||
* @brief Positions file pointer at start of tag payload if tags exist.
|
||||
* @param fp Pointer to an open fs_file_t structure representing the audio file
|
||||
* @param version Pointer to receive tag format version
|
||||
* @param payload_len Pointer to receive tag payload length in bytes
|
||||
* @return 0 on success, -ENOENT if no tags exist, negative error code on failure
|
||||
*/
|
||||
int fs_tag_open_read(struct fs_file_t *fp, uint8_t *version, size_t *payload_len);
|
||||
|
||||
/**
|
||||
* @brief Reads a chunk from current tag payload position.
|
||||
* @param fp Pointer to an open fs_file_t positioned in tag payload
|
||||
* @param buffer Destination buffer
|
||||
* @param len Maximum bytes to read
|
||||
* @return Number of bytes read, 0 at payload end, negative error code on failure
|
||||
*/
|
||||
ssize_t fs_tag_read_chunk(struct fs_file_t *fp, void *buffer, size_t len);
|
||||
|
||||
/**
|
||||
* @brief Setzt die Synchronisation für einen neuen Dateitransfer zurück.
|
||||
*/
|
||||
void fs_reset_transfer_sync(void);
|
||||
|
||||
/**
|
||||
* @brief Blockiert den aufrufenden Thread, bis der FS-Thread den Transfer
|
||||
* (EOF oder ABORT) vollständig auf dem Flash abgeschlossen hat.
|
||||
*/
|
||||
void fs_wait_for_transfer_complete(void);
|
||||
|
||||
/**
|
||||
* @brief Retrieves information about the firmware slot, such as start address and size
|
||||
* @param info Pointer to slot_info_t structure to be filled with slot information
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
int flash_get_slot_info(slot_info_t *info);
|
||||
|
||||
/**
|
||||
* @brief Initializes the flash for firmware upload, preparing it for receiving new firmware data
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
int flash_init_firmware_upload(void);
|
||||
|
||||
/**
|
||||
* @brief Writes a block of firmware data to the flash
|
||||
* @param buffer Pointer to the data buffer
|
||||
* @param length Length of the data buffer
|
||||
* @param is_last_block Indicates if this is the last block of the firmware
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
int flash_write_firmware_block(const uint8_t *buffer, size_t length, bool is_last_block);
|
||||
|
||||
/**
|
||||
* @brief Gets the page size of the internal flash, which is needed for proper write operations
|
||||
* @return Page size in bytes
|
||||
*/
|
||||
size_t fs_get_internal_flash_page_size(void);
|
||||
|
||||
/**
|
||||
* @brief Gets the size of the firmware slot, which is needed for proper write operations
|
||||
* @return Size in bytes
|
||||
*/
|
||||
size_t fs_get_fw_slot_size(void);
|
||||
|
||||
/**
|
||||
* @brief Gets the page size of the external flash, which is needed for proper write operations
|
||||
* @return Page size in bytes
|
||||
*/
|
||||
size_t fs_get_external_flash_page_size(void);
|
||||
#endif // FS_H
|
||||
Reference in New Issue
Block a user