mirror of
https://github.com/spicyjpeg/573in1.git
synced 2025-01-22 19:52:05 +01:00
Add FatFs library and IDE HDD driver stub
This commit is contained in:
parent
493387187d
commit
3b9680f434
@ -11,6 +11,10 @@ project(
|
||||
)
|
||||
|
||||
find_package(Python3 REQUIRED COMPONENTS Interpreter)
|
||||
find_program(
|
||||
CHDMAN_PATH chdman
|
||||
DOC "Path to MAME chdman tool (optional)"
|
||||
)
|
||||
|
||||
## Main executable
|
||||
|
||||
@ -21,6 +25,7 @@ add_executable(
|
||||
src/cartdata.cpp
|
||||
src/cartio.cpp
|
||||
src/gpu.cpp
|
||||
src/ide.cpp
|
||||
src/io.cpp
|
||||
src/main.cpp
|
||||
src/pad.cpp
|
||||
@ -44,6 +49,8 @@ add_executable(
|
||||
src/ps1/system.c
|
||||
src/ps1/system.s
|
||||
src/ps1/unhandledexc.c
|
||||
src/vendor/ff.c
|
||||
src/vendor/ffunicode.c
|
||||
src/vendor/miniz.c
|
||||
src/vendor/printf.c
|
||||
src/vendor/qrcodegen.c
|
||||
@ -58,11 +65,7 @@ target_compile_definitions(
|
||||
VERSION="${PROJECT_VERSION}"
|
||||
#ENABLE_ARGV=1
|
||||
ENABLE_PS1_CONTROLLER=1
|
||||
MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS=1
|
||||
MINIZ_NO_ARCHIVE_WRITING_APIS=1
|
||||
MINIZ_NO_STDIO=1
|
||||
MINIZ_NO_TIME=1
|
||||
PRINTF_DISABLE_SUPPORT_FLOAT=1
|
||||
ENABLE_I2C_LOGGING=1
|
||||
)
|
||||
|
||||
add_custom_command(
|
||||
@ -101,12 +104,25 @@ ps1_target_incbin(
|
||||
#add_custom_command(
|
||||
# COMMAND
|
||||
# "${Python3_EXECUTABLE}" "${PROJECT_SOURCE_DIR}/tools/buildCDImage.py"
|
||||
# "${PROJECT_SOURCE_DIR}/cd.json" cart_tool.iso
|
||||
# -s "${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/cd.json" cart_tool.iso
|
||||
# OUTPUT cart_tool.iso
|
||||
# DEPENDS cd.json cart_tool
|
||||
# COMMENT "Building CD-ROM image"
|
||||
# VERBATIM
|
||||
#)
|
||||
|
||||
# Add a dummy target that depends on the CD image to make sure it gets built.
|
||||
#add_custom_target(cd ALL DEPENDS cart_tool.iso)
|
||||
#if(EXISTS "${CHDMAN_PATH}")
|
||||
# add_custom_command(
|
||||
# COMMAND
|
||||
# "${CHDMAN_PATH}" createcd -f -i cart_tool.iso -o cart_tool.chd
|
||||
# OUTPUT cart_tool.chd
|
||||
# DEPENDS cart_tool.iso
|
||||
# COMMENT "Building MAME CHD image"
|
||||
# VERBATIM
|
||||
# )
|
||||
#
|
||||
# # Add a dummy target that depends on the CD image to ensure it gets built.
|
||||
# add_custom_target(cd ALL DEPENDS cart_tool.iso cart_tool.chd)
|
||||
#else()
|
||||
# add_custom_target(cd ALL DEPENDS cart_tool.iso)
|
||||
#endif()
|
||||
|
@ -1,4 +1,21 @@
|
||||
|
||||
# FatFs
|
||||
# https://elm-chan.org/fsw/ff/00index_e.html
|
||||
|
||||
Copyright (C) 2022, ChaN, all rights reserved.
|
||||
|
||||
FatFs module is an open source software. Redistribution and use of FatFs in
|
||||
source and binary forms, with or without modification, are permitted provided
|
||||
that the following condition is met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this condition and the following disclaimer.
|
||||
|
||||
This software is provided by the copyright holder and contributors "AS IS"
|
||||
and any warranties related to this software are DISCLAIMED.
|
||||
The copyright owner or contributors be NOT LIABLE for any damages caused
|
||||
by use of this software.
|
||||
|
||||
# miniz
|
||||
# https://github.com/richgel999/miniz
|
||||
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include <stdio.h>
|
||||
#include "ps1/gpucmd.h"
|
||||
#include "ps1/pcdrv.h"
|
||||
#include "vendor/ff.h"
|
||||
#include "vendor/miniz.h"
|
||||
#include "vendor/qrcodegen.h"
|
||||
#include "asset.hpp"
|
||||
@ -13,16 +14,16 @@ namespace asset {
|
||||
|
||||
/* Asset loader */
|
||||
|
||||
static constexpr uint32_t _ZIP_FLAGS =
|
||||
MZ_ZIP_FLAG_CASE_SENSITIVE | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY;
|
||||
|
||||
bool AssetLoader::openMemory(const void *zipData, size_t length) {
|
||||
//close();
|
||||
mz_zip_zero_struct(&_zip);
|
||||
|
||||
// Sorting the central directory in a zip with a small number of files is
|
||||
// just a waste of time.
|
||||
if (!mz_zip_reader_init_mem(
|
||||
&_zip, zipData, length,
|
||||
MZ_ZIP_FLAG_CASE_SENSITIVE | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY
|
||||
)) {
|
||||
if (!mz_zip_reader_init_mem(&_zip, zipData, length, _ZIP_FLAGS)) {
|
||||
LOG("zip init error, code=%d", mz_zip_get_last_error(&_zip));
|
||||
return false;
|
||||
}
|
||||
@ -32,16 +33,61 @@ bool AssetLoader::openMemory(const void *zipData, size_t length) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool AssetLoader::openFAT(const char *path) {
|
||||
auto error = f_open(&_fatFile, path, FA_READ | FA_OPEN_EXISTING);
|
||||
if (error) {
|
||||
LOG("FAT zip open error, code=%d", error);
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t fileSize = f_size(&_fatFile);
|
||||
|
||||
_zip.m_pIO_opaque = &_fatFile;
|
||||
_zip.m_pNeeds_keepalive = nullptr;
|
||||
_zip.m_pRead = [](
|
||||
void *opaque, uint64_t offset, void *data, size_t length
|
||||
) -> size_t {
|
||||
auto fatFile = reinterpret_cast<FIL *>(opaque);
|
||||
|
||||
auto error = f_lseek(fatFile, offset);
|
||||
if (error) {
|
||||
LOG("FAT zip seek error, code=%d", error);
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t actualLength;
|
||||
|
||||
error = f_read(fatFile, data, length, &actualLength);
|
||||
if (error) {
|
||||
LOG("FAT zip read error, code=%d", error);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return actualLength;
|
||||
};
|
||||
|
||||
if (!mz_zip_reader_init(&_zip, fileSize, _ZIP_FLAGS)) {
|
||||
LOG("FAT zip init error, code=%d", mz_zip_get_last_error(&_zip));
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG("length=0x%x", fileSize);
|
||||
ready = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool AssetLoader::openHost(const char *path) {
|
||||
if (pcdrvInit() < 0)
|
||||
return false;
|
||||
|
||||
_hostFile = pcdrvOpen(path, PCDRV_MODE_READ);
|
||||
if (_hostFile < 0)
|
||||
if (_hostFile < 0) {
|
||||
LOG("host zip open error, code=%d", _hostFile);
|
||||
return false;
|
||||
}
|
||||
|
||||
int length = pcdrvSeek(_hostFile, 0, PCDRV_SEEK_END);
|
||||
if (length < 0)
|
||||
int fileSize = pcdrvSeek(_hostFile, 0, PCDRV_SEEK_END);
|
||||
if (fileSize < 0)
|
||||
return false;
|
||||
|
||||
_zip.m_pIO_opaque = reinterpret_cast<void *>(_hostFile);
|
||||
@ -64,15 +110,12 @@ bool AssetLoader::openHost(const char *path) {
|
||||
return actualLength;
|
||||
};
|
||||
|
||||
if (!mz_zip_reader_init(
|
||||
&_zip, length,
|
||||
MZ_ZIP_FLAG_CASE_SENSITIVE | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY
|
||||
)) {
|
||||
LOG("zip init error, code=%d", mz_zip_get_last_error(&_zip));
|
||||
if (!mz_zip_reader_init(&_zip, fileSize, _ZIP_FLAGS)) {
|
||||
LOG("host zip init error, code=%d", mz_zip_get_last_error(&_zip));
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG("length=0x%x", length);
|
||||
LOG("length=0x%x", fileSize);
|
||||
ready = true;
|
||||
return true;
|
||||
}
|
||||
@ -82,6 +125,8 @@ void AssetLoader::close(void) {
|
||||
return;
|
||||
if (_hostFile >= 0)
|
||||
pcdrvClose(_hostFile);
|
||||
else
|
||||
f_close(&_fatFile);
|
||||
|
||||
mz_zip_reader_end(&_zip);
|
||||
ready = false;
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include "vendor/ff.h"
|
||||
#include "vendor/miniz.h"
|
||||
#include "vendor/qrcodegen.h"
|
||||
#include "gpu.hpp"
|
||||
@ -35,6 +36,7 @@ public:
|
||||
class AssetLoader {
|
||||
private:
|
||||
mz_zip_archive _zip;
|
||||
FIL _fatFile;
|
||||
int _hostFile;
|
||||
|
||||
public:
|
||||
@ -57,6 +59,7 @@ public:
|
||||
}
|
||||
|
||||
bool openMemory(const void *zipData, size_t length);
|
||||
bool openFAT(const char *path);
|
||||
bool openHost(const char *path);
|
||||
void close(void);
|
||||
size_t loadAsset(Asset &output, const char *path);
|
||||
|
59
src/ide.cpp
Normal file
59
src/ide.cpp
Normal file
@ -0,0 +1,59 @@
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include "ide.hpp"
|
||||
#include "vendor/diskio.h"
|
||||
|
||||
namespace ide {
|
||||
|
||||
/* Device class */
|
||||
|
||||
Device devices[2]{
|
||||
(DEV_PRIMARY), (DEV_SECONDARY)
|
||||
};
|
||||
|
||||
/* FatFs API glue */
|
||||
|
||||
extern "C" DSTATUS disk_initialize(uint8_t drive) {
|
||||
return RES_NOTRDY;
|
||||
}
|
||||
|
||||
extern "C" DSTATUS disk_status(uint8_t drive) {
|
||||
return RES_NOTRDY;
|
||||
}
|
||||
|
||||
extern "C" DRESULT disk_read(uint8_t drive, uint8_t *data, uint64_t lba, size_t length) {
|
||||
return RES_NOTRDY;
|
||||
}
|
||||
|
||||
extern "C" DRESULT disk_write(uint8_t drive, const uint8_t *data, uint64_t lba, size_t length) {
|
||||
return RES_NOTRDY;
|
||||
}
|
||||
|
||||
extern "C" DRESULT disk_ioctl(uint8_t drive, uint8_t cmd, void *buff) {
|
||||
switch (cmd) {
|
||||
case CTRL_SYNC:
|
||||
return RES_NOTRDY;
|
||||
|
||||
case GET_SECTOR_COUNT:
|
||||
return RES_NOTRDY;
|
||||
|
||||
case GET_SECTOR_SIZE:
|
||||
return RES_NOTRDY;
|
||||
|
||||
case GET_BLOCK_SIZE:
|
||||
return RES_NOTRDY;
|
||||
|
||||
case CTRL_TRIM:
|
||||
return RES_NOTRDY;
|
||||
|
||||
default:
|
||||
return RES_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" uint32_t get_fattime(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
145
src/ide.hpp
Normal file
145
src/ide.hpp
Normal file
@ -0,0 +1,145 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include "ps1/registers.h"
|
||||
|
||||
namespace ide {
|
||||
|
||||
/* Register definitions */
|
||||
|
||||
enum CS0Register {
|
||||
CS0_DATA = 0,
|
||||
CS0_ERROR = 1,
|
||||
CS0_FEATURES = 1,
|
||||
CS0_COUNT = 2,
|
||||
CS0_SECTOR = 3,
|
||||
CS0_CYLINDER_L = 4,
|
||||
CS0_CYLINDER_H = 5,
|
||||
CS0_DRIVE_SEL = 6,
|
||||
CS0_STATUS = 7,
|
||||
CS0_COMMAND = 7
|
||||
};
|
||||
|
||||
enum CS1Register {
|
||||
CS1_ALT_STATUS = 6,
|
||||
CS1_DEVICE_CTRL = 6
|
||||
};
|
||||
|
||||
enum StatusFlag : uint8_t {
|
||||
STATUS_ERR = 1 << 0, // Error
|
||||
STATUS_DRQ = 1 << 3, // Data request
|
||||
STATUS_DSC = 1 << 4, // Ready (ATA) / service (ATAPI)
|
||||
STATUS_DF = 1 << 5, // Device fault
|
||||
STATUS_DRDY = 1 << 6, // Device ready (ATA only)
|
||||
STATUS_BSY = 1 << 7 // Busy
|
||||
};
|
||||
|
||||
/* IDE protocol definitions */
|
||||
|
||||
enum IDECommand : uint_least8_t {
|
||||
IDE_NOP = 0x00,
|
||||
IDE_READ_PIO = 0x20,
|
||||
IDE_WRITE_PIO = 0x30,
|
||||
IDE_EXECUTE_DIAG = 0x90,
|
||||
IDE_PACKET = 0xa0, // ATAPI only
|
||||
IDE_ATAPI_IDENTIFY = 0xa1, // ATAPI only
|
||||
IDE_ERASE = 0xc0,
|
||||
IDE_READ_DMA = 0xc8,
|
||||
IDE_WRITE_DMA = 0xca,
|
||||
IDE_IDENTIFY = 0xec, // ATA only
|
||||
IDE_SET_FEATURES = 0xef
|
||||
};
|
||||
|
||||
enum IDEFeature : uint8_t {
|
||||
FEATURE_8BIT_DATA = 0x01,
|
||||
FEATURE_WRITE_CACHE = 0x02,
|
||||
FEATURE_TRANSFER_MODE = 0x03,
|
||||
FEATURE_RELEASE_IRQ = 0x5d,
|
||||
FEATURE_SERVICE_IRQ = 0x5e
|
||||
};
|
||||
|
||||
/* ATAPI protocol definitions */
|
||||
|
||||
enum ATAPICommand : uint8_t {
|
||||
ATAPI_TEST_UNIT_READY = 0x00,
|
||||
ATAPI_REQUEST_SENSE = 0x03,
|
||||
ATAPI_INQUIRY = 0x12,
|
||||
ATAPI_START_STOP_UNIT = 0x1b,
|
||||
ATAPI_PREVENT_REMOVAL = 0x1e,
|
||||
ATAPI_READ_CAPACITY = 0x25,
|
||||
ATAPI_READ10 = 0x28,
|
||||
ATAPI_SEEK = 0x2b,
|
||||
ATAPI_READ_SUBCHANNEL = 0x42,
|
||||
ATAPI_READ_TOC = 0x43,
|
||||
ATAPI_READ_HEADER = 0x44,
|
||||
ATAPI_PLAY_AUDIO = 0x45,
|
||||
ATAPI_PLAY_AUDIO_MSF = 0x47,
|
||||
ATAPI_PAUSE_RESUME = 0x4b,
|
||||
ATAPI_STOP = 0x4e,
|
||||
ATAPI_MODE_SELECT = 0x55,
|
||||
ATAPI_MODE_SENSE = 0x5a,
|
||||
ATAPI_LOAD_UNLOAD_CD = 0xa6,
|
||||
ATAPI_READ12 = 0xa8,
|
||||
ATAPI_READ_CD_MSF = 0xb9,
|
||||
ATAPI_SCAN = 0xba,
|
||||
ATAPI_SET_CD_SPEED = 0xbb,
|
||||
ATAPI_MECHANISM_STATUS = 0xbd,
|
||||
ATAPI_READ_CD = 0xbe
|
||||
};
|
||||
|
||||
enum ATAPISenseKey : uint8_t {
|
||||
SENSE_KEY_NO_SENSE = 0x0,
|
||||
SENSE_KEY_RECOVERED_ERROR = 0x1,
|
||||
SENSE_KEY_NOT_READY = 0x2,
|
||||
SENSE_KEY_MEDIUM_ERROR = 0x3,
|
||||
SENSE_KEY_HARDWARE_ERROR = 0x4,
|
||||
SENSE_KEY_ILLEGAL_REQUEST = 0x5,
|
||||
SENSE_KEY_UNIT_ATTENTION = 0x6,
|
||||
SENSE_KEY_DATA_PROTECT = 0x7,
|
||||
SENSE_KEY_ABORTED_COMMAND = 0xb,
|
||||
SENSE_KEY_MISCOMPARE = 0xe
|
||||
};
|
||||
|
||||
enum ATAPIStartStopMode : uint8_t {
|
||||
START_STOP_MODE_STOP_DISC = 0x0,
|
||||
START_STOP_MODE_START_DISC = 0x1,
|
||||
START_STOP_MODE_OPEN_TRAY = 0x2,
|
||||
START_STOP_MODE_CLOSE_TRAY = 0x3
|
||||
};
|
||||
|
||||
/* Device class */
|
||||
|
||||
enum DeviceFlag {
|
||||
DEV_IS_ATAPI = 1 << 0,
|
||||
DEV_LBA_LENGTH_48 = 1 << 1, // Device supports 48-bit LBA addressing
|
||||
DEV_PACKET_LENGTH_16 = 1 << 2, // Device requires 16-byte ATAPI packets
|
||||
DEV_PRIMARY = 0 << 4,
|
||||
DEV_SECONDARY = 1 << 4
|
||||
};
|
||||
|
||||
class Device {
|
||||
private:
|
||||
inline uint8_t _readCS0(CS0Register reg) {
|
||||
return uint8_t(SYS573_IDE_CS0_BASE[reg] & 0xff);
|
||||
}
|
||||
inline void _writeCS0(CS0Register reg, uint8_t value) {
|
||||
SYS573_IDE_CS0_BASE[reg] = value;
|
||||
}
|
||||
inline uint8_t _readCS1(CS0Register reg) {
|
||||
return uint8_t(SYS573_IDE_CS1_BASE[reg] & 0xff);
|
||||
}
|
||||
inline void _writeCS1(CS0Register reg, uint8_t value) {
|
||||
SYS573_IDE_CS1_BASE[reg] = value;
|
||||
}
|
||||
|
||||
public:
|
||||
uint32_t flags;
|
||||
|
||||
inline Device(uint32_t flags)
|
||||
: flags(flags) {}
|
||||
};
|
||||
|
||||
extern Device devices[2];
|
||||
|
||||
}
|
20
src/main.cpp
20
src/main.cpp
@ -34,14 +34,16 @@ int main(int argc, const char **argv) {
|
||||
continue;
|
||||
|
||||
switch (util::hash(arg, '=')) {
|
||||
//case "boot.rom"_h:
|
||||
//break;
|
||||
case "boot.rom"_h:
|
||||
//LOG("boot.rom=%s", &arg[9]);
|
||||
break;
|
||||
|
||||
//case "boot.from"_h:
|
||||
//break;
|
||||
case "boot.from"_h:
|
||||
//LOG("boot.from=%s", &arg[10]);
|
||||
break;
|
||||
|
||||
case "console"_h:
|
||||
initSerialIO(strtol(&arg[7], nullptr, 0));
|
||||
initSerialIO(strtol(&arg[8], nullptr, 0));
|
||||
util::logger.enableSyslog = true;
|
||||
break;
|
||||
|
||||
@ -81,10 +83,12 @@ int main(int argc, const char **argv) {
|
||||
|
||||
if (ptr && length)
|
||||
loader.openMemory(ptr, length);
|
||||
if (!loader.ready) {
|
||||
LOG("loading default resource archive");
|
||||
if (!loader.ready)
|
||||
loader.openFAT("1:/cart_tool/resources.zip");
|
||||
//if (!loader.ready)
|
||||
//loader.openHost("resources.zip");
|
||||
if (!loader.ready)
|
||||
loader.openMemory(_resources, _resourcesSize);
|
||||
}
|
||||
|
||||
io::clearWatchdog();
|
||||
|
||||
|
81
src/vendor/diskio.h
vendored
Normal file
81
src/vendor/diskio.h
vendored
Normal file
@ -0,0 +1,81 @@
|
||||
/*-----------------------------------------------------------------------/
|
||||
/ Low level disk interface modlue include file (C)ChaN, 2019 /
|
||||
/-----------------------------------------------------------------------*/
|
||||
|
||||
#ifndef _DISKIO_DEFINED
|
||||
#define _DISKIO_DEFINED
|
||||
|
||||
#include "ff.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Status of Disk Functions */
|
||||
typedef BYTE DSTATUS;
|
||||
|
||||
/* Results of Disk Functions */
|
||||
typedef enum {
|
||||
RES_OK = 0, /* 0: Successful */
|
||||
RES_ERROR, /* 1: R/W Error */
|
||||
RES_WRPRT, /* 2: Write Protected */
|
||||
RES_NOTRDY, /* 3: Not Ready */
|
||||
RES_PARERR /* 4: Invalid Parameter */
|
||||
} DRESULT;
|
||||
|
||||
|
||||
/*---------------------------------------*/
|
||||
/* Prototypes for disk control functions */
|
||||
|
||||
|
||||
DSTATUS disk_initialize (BYTE pdrv);
|
||||
DSTATUS disk_status (BYTE pdrv);
|
||||
DRESULT disk_read (BYTE pdrv, BYTE* buff, LBA_t sector, UINT count);
|
||||
DRESULT disk_write (BYTE pdrv, const BYTE* buff, LBA_t sector, UINT count);
|
||||
DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);
|
||||
|
||||
|
||||
/* Disk Status Bits (DSTATUS) */
|
||||
|
||||
#define STA_NOINIT 0x01 /* Drive not initialized */
|
||||
#define STA_NODISK 0x02 /* No medium in the drive */
|
||||
#define STA_PROTECT 0x04 /* Write protected */
|
||||
|
||||
|
||||
/* Command code for disk_ioctrl fucntion */
|
||||
|
||||
/* Generic command (Used by FatFs) */
|
||||
#define CTRL_SYNC 0 /* Complete pending write process (needed at FF_FS_READONLY == 0) */
|
||||
#define GET_SECTOR_COUNT 1 /* Get media size (needed at FF_USE_MKFS == 1) */
|
||||
#define GET_SECTOR_SIZE 2 /* Get sector size (needed at FF_MAX_SS != FF_MIN_SS) */
|
||||
#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at FF_USE_MKFS == 1) */
|
||||
#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at FF_USE_TRIM == 1) */
|
||||
|
||||
#if 0
|
||||
/* Generic command (Not used by FatFs) */
|
||||
#define CTRL_POWER 5 /* Get/Set power status */
|
||||
#define CTRL_LOCK 6 /* Lock/Unlock media removal */
|
||||
#define CTRL_EJECT 7 /* Eject media */
|
||||
#define CTRL_FORMAT 8 /* Create physical format on the media */
|
||||
|
||||
/* MMC/SDC specific ioctl command */
|
||||
#define MMC_GET_TYPE 10 /* Get card type */
|
||||
#define MMC_GET_CSD 11 /* Get CSD */
|
||||
#define MMC_GET_CID 12 /* Get CID */
|
||||
#define MMC_GET_OCR 13 /* Get OCR */
|
||||
#define MMC_GET_SDSTAT 14 /* Get SD status */
|
||||
#define ISDIO_READ 55 /* Read data form SD iSDIO register */
|
||||
#define ISDIO_WRITE 56 /* Write data to SD iSDIO register */
|
||||
#define ISDIO_MRITE 57 /* Masked write data to SD iSDIO register */
|
||||
|
||||
/* ATA/CF specific ioctl command */
|
||||
#define ATA_GET_REV 20 /* Get F/W revision */
|
||||
#define ATA_GET_MODEL 21 /* Get model name */
|
||||
#define ATA_GET_SN 22 /* Get serial number */
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
7084
src/vendor/ff.c
vendored
Normal file
7084
src/vendor/ff.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
425
src/vendor/ff.h
vendored
Normal file
425
src/vendor/ff.h
vendored
Normal file
@ -0,0 +1,425 @@
|
||||
/*----------------------------------------------------------------------------/
|
||||
/ FatFs - Generic FAT Filesystem module R0.15 /
|
||||
/-----------------------------------------------------------------------------/
|
||||
/
|
||||
/ Copyright (C) 2022, ChaN, all right reserved.
|
||||
/
|
||||
/ FatFs module is an open source software. Redistribution and use of FatFs in
|
||||
/ source and binary forms, with or without modification, are permitted provided
|
||||
/ that the following condition is met:
|
||||
|
||||
/ 1. Redistributions of source code must retain the above copyright notice,
|
||||
/ this condition and the following disclaimer.
|
||||
/
|
||||
/ This software is provided by the copyright holder and contributors "AS IS"
|
||||
/ and any warranties related to this software are DISCLAIMED.
|
||||
/ The copyright owner or contributors be NOT LIABLE for any damages caused
|
||||
/ by use of this software.
|
||||
/
|
||||
/----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
#ifndef FF_DEFINED
|
||||
#define FF_DEFINED 80286 /* Revision ID */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "vendorconfig.h" /* FatFs configuration options */
|
||||
|
||||
|
||||
/* Integer types used for FatFs API */
|
||||
|
||||
#if defined(_WIN32) /* Windows VC++ (for development only) */
|
||||
#define FF_INTDEF 2
|
||||
#include <windows.h>
|
||||
typedef unsigned __int64 QWORD;
|
||||
#include <float.h>
|
||||
#define isnan(v) _isnan(v)
|
||||
#define isinf(v) (!_finite(v))
|
||||
|
||||
#elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__cplusplus) /* C99 or later */
|
||||
#define FF_INTDEF 2
|
||||
#include <stdint.h>
|
||||
typedef unsigned int UINT; /* int must be 16-bit or 32-bit */
|
||||
typedef unsigned char BYTE; /* char must be 8-bit */
|
||||
typedef uint16_t WORD; /* 16-bit unsigned integer */
|
||||
typedef uint32_t DWORD; /* 32-bit unsigned integer */
|
||||
typedef uint64_t QWORD; /* 64-bit unsigned integer */
|
||||
typedef WORD WCHAR; /* UTF-16 character type */
|
||||
|
||||
#else /* Earlier than C99 */
|
||||
#define FF_INTDEF 1
|
||||
typedef unsigned int UINT; /* int must be 16-bit or 32-bit */
|
||||
typedef unsigned char BYTE; /* char must be 8-bit */
|
||||
typedef unsigned short WORD; /* 16-bit unsigned integer */
|
||||
typedef unsigned long DWORD; /* 32-bit unsigned integer */
|
||||
typedef WORD WCHAR; /* UTF-16 character type */
|
||||
#endif
|
||||
|
||||
|
||||
/* Type of file size and LBA variables */
|
||||
|
||||
#if FF_FS_EXFAT
|
||||
#if FF_INTDEF != 2
|
||||
#error exFAT feature wants C99 or later
|
||||
#endif
|
||||
typedef QWORD FSIZE_t;
|
||||
#if FF_LBA64
|
||||
typedef QWORD LBA_t;
|
||||
#else
|
||||
typedef DWORD LBA_t;
|
||||
#endif
|
||||
#else
|
||||
#if FF_LBA64
|
||||
#error exFAT needs to be enabled when enable 64-bit LBA
|
||||
#endif
|
||||
typedef DWORD FSIZE_t;
|
||||
typedef DWORD LBA_t;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/* Type of path name strings on FatFs API (TCHAR) */
|
||||
|
||||
#if FF_USE_LFN && FF_LFN_UNICODE == 1 /* Unicode in UTF-16 encoding */
|
||||
typedef WCHAR TCHAR;
|
||||
#define _T(x) L ## x
|
||||
#define _TEXT(x) L ## x
|
||||
#elif FF_USE_LFN && FF_LFN_UNICODE == 2 /* Unicode in UTF-8 encoding */
|
||||
typedef char TCHAR;
|
||||
#define _T(x) u8 ## x
|
||||
#define _TEXT(x) u8 ## x
|
||||
#elif FF_USE_LFN && FF_LFN_UNICODE == 3 /* Unicode in UTF-32 encoding */
|
||||
typedef DWORD TCHAR;
|
||||
#define _T(x) U ## x
|
||||
#define _TEXT(x) U ## x
|
||||
#elif FF_USE_LFN && (FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3)
|
||||
#error Wrong FF_LFN_UNICODE setting
|
||||
#else /* ANSI/OEM code in SBCS/DBCS */
|
||||
typedef char TCHAR;
|
||||
#define _T(x) x
|
||||
#define _TEXT(x) x
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/* Definitions of volume management */
|
||||
|
||||
#if FF_MULTI_PARTITION /* Multiple partition configuration */
|
||||
typedef struct {
|
||||
BYTE pd; /* Physical drive number */
|
||||
BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */
|
||||
} PARTITION;
|
||||
extern PARTITION VolToPart[]; /* Volume - Partition mapping table */
|
||||
#endif
|
||||
|
||||
#if FF_STR_VOLUME_ID
|
||||
#ifndef FF_VOLUME_STRS
|
||||
extern const char* VolumeStr[FF_VOLUMES]; /* User defied volume ID */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/* Filesystem object structure (FATFS) */
|
||||
|
||||
typedef struct {
|
||||
BYTE fs_type; /* Filesystem type (0:not mounted) */
|
||||
BYTE pdrv; /* Volume hosting physical drive */
|
||||
BYTE ldrv; /* Logical drive number (used only when FF_FS_REENTRANT) */
|
||||
BYTE n_fats; /* Number of FATs (1 or 2) */
|
||||
BYTE wflag; /* win[] status (b0:dirty) */
|
||||
BYTE fsi_flag; /* FSINFO status (b7:disabled, b0:dirty) */
|
||||
WORD id; /* Volume mount ID */
|
||||
WORD n_rootdir; /* Number of root directory entries (FAT12/16) */
|
||||
WORD csize; /* Cluster size [sectors] */
|
||||
#if FF_MAX_SS != FF_MIN_SS
|
||||
WORD ssize; /* Sector size (512, 1024, 2048 or 4096) */
|
||||
#endif
|
||||
#if FF_USE_LFN
|
||||
WCHAR* lfnbuf; /* LFN working buffer */
|
||||
#endif
|
||||
#if FF_FS_EXFAT
|
||||
BYTE* dirbuf; /* Directory entry block scratchpad buffer for exFAT */
|
||||
#endif
|
||||
#if !FF_FS_READONLY
|
||||
DWORD last_clst; /* Last allocated cluster */
|
||||
DWORD free_clst; /* Number of free clusters */
|
||||
#endif
|
||||
#if FF_FS_RPATH
|
||||
DWORD cdir; /* Current directory start cluster (0:root) */
|
||||
#if FF_FS_EXFAT
|
||||
DWORD cdc_scl; /* Containing directory start cluster (invalid when cdir is 0) */
|
||||
DWORD cdc_size; /* b31-b8:Size of containing directory, b7-b0: Chain status */
|
||||
DWORD cdc_ofs; /* Offset in the containing directory (invalid when cdir is 0) */
|
||||
#endif
|
||||
#endif
|
||||
DWORD n_fatent; /* Number of FAT entries (number of clusters + 2) */
|
||||
DWORD fsize; /* Number of sectors per FAT */
|
||||
LBA_t volbase; /* Volume base sector */
|
||||
LBA_t fatbase; /* FAT base sector */
|
||||
LBA_t dirbase; /* Root directory base sector (FAT12/16) or cluster (FAT32/exFAT) */
|
||||
LBA_t database; /* Data base sector */
|
||||
#if FF_FS_EXFAT
|
||||
LBA_t bitbase; /* Allocation bitmap base sector */
|
||||
#endif
|
||||
LBA_t winsect; /* Current sector appearing in the win[] */
|
||||
BYTE win[FF_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */
|
||||
} FATFS;
|
||||
|
||||
|
||||
|
||||
/* Object ID and allocation information (FFOBJID) */
|
||||
|
||||
typedef struct {
|
||||
FATFS* fs; /* Pointer to the hosting volume of this object */
|
||||
WORD id; /* Hosting volume's mount ID */
|
||||
BYTE attr; /* Object attribute */
|
||||
BYTE stat; /* Object chain status (b1-0: =0:not contiguous, =2:contiguous, =3:fragmented in this session, b2:sub-directory stretched) */
|
||||
DWORD sclust; /* Object data start cluster (0:no cluster or root directory) */
|
||||
FSIZE_t objsize; /* Object size (valid when sclust != 0) */
|
||||
#if FF_FS_EXFAT
|
||||
DWORD n_cont; /* Size of first fragment - 1 (valid when stat == 3) */
|
||||
DWORD n_frag; /* Size of last fragment needs to be written to FAT (valid when not zero) */
|
||||
DWORD c_scl; /* Containing directory start cluster (valid when sclust != 0) */
|
||||
DWORD c_size; /* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */
|
||||
DWORD c_ofs; /* Offset in the containing directory (valid when file object and sclust != 0) */
|
||||
#endif
|
||||
#if FF_FS_LOCK
|
||||
UINT lockid; /* File lock ID origin from 1 (index of file semaphore table Files[]) */
|
||||
#endif
|
||||
} FFOBJID;
|
||||
|
||||
|
||||
|
||||
/* File object structure (FIL) */
|
||||
|
||||
typedef struct {
|
||||
FFOBJID obj; /* Object identifier (must be the 1st member to detect invalid object pointer) */
|
||||
BYTE flag; /* File status flags */
|
||||
BYTE err; /* Abort flag (error code) */
|
||||
FSIZE_t fptr; /* File read/write pointer (Zeroed on file open) */
|
||||
DWORD clust; /* Current cluster of fpter (invalid when fptr is 0) */
|
||||
LBA_t sect; /* Sector number appearing in buf[] (0:invalid) */
|
||||
#if !FF_FS_READONLY
|
||||
LBA_t dir_sect; /* Sector number containing the directory entry (not used at exFAT) */
|
||||
BYTE* dir_ptr; /* Pointer to the directory entry in the win[] (not used at exFAT) */
|
||||
#endif
|
||||
#if FF_USE_FASTSEEK
|
||||
DWORD* cltbl; /* Pointer to the cluster link map table (nulled on open, set by application) */
|
||||
#endif
|
||||
#if !FF_FS_TINY
|
||||
BYTE buf[FF_MAX_SS]; /* File private data read/write window */
|
||||
#endif
|
||||
} FIL;
|
||||
|
||||
|
||||
|
||||
/* Directory object structure (DIR) */
|
||||
|
||||
typedef struct {
|
||||
FFOBJID obj; /* Object identifier */
|
||||
DWORD dptr; /* Current read/write offset */
|
||||
DWORD clust; /* Current cluster */
|
||||
LBA_t sect; /* Current sector (0:Read operation has terminated) */
|
||||
BYTE* dir; /* Pointer to the directory item in the win[] */
|
||||
BYTE fn[12]; /* SFN (in/out) {body[8],ext[3],status[1]} */
|
||||
#if FF_USE_LFN
|
||||
DWORD blk_ofs; /* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */
|
||||
#endif
|
||||
#if FF_USE_FIND
|
||||
const TCHAR* pat; /* Pointer to the name matching pattern */
|
||||
#endif
|
||||
} DIR;
|
||||
|
||||
|
||||
|
||||
/* File information structure (FILINFO) */
|
||||
|
||||
typedef struct {
|
||||
FSIZE_t fsize; /* File size */
|
||||
WORD fdate; /* Modified date */
|
||||
WORD ftime; /* Modified time */
|
||||
BYTE fattrib; /* File attribute */
|
||||
#if FF_USE_LFN
|
||||
TCHAR altname[FF_SFN_BUF + 1];/* Alternative file name */
|
||||
TCHAR fname[FF_LFN_BUF + 1]; /* Primary file name */
|
||||
#else
|
||||
TCHAR fname[12 + 1]; /* File name */
|
||||
#endif
|
||||
} FILINFO;
|
||||
|
||||
|
||||
|
||||
/* Format parameter structure (MKFS_PARM) */
|
||||
|
||||
typedef struct {
|
||||
BYTE fmt; /* Format option (FM_FAT, FM_FAT32, FM_EXFAT and FM_SFD) */
|
||||
BYTE n_fat; /* Number of FATs */
|
||||
UINT align; /* Data area alignment (sector) */
|
||||
UINT n_root; /* Number of root directory entries */
|
||||
DWORD au_size; /* Cluster size (byte) */
|
||||
} MKFS_PARM;
|
||||
|
||||
|
||||
|
||||
/* File function return code (FRESULT) */
|
||||
|
||||
typedef enum {
|
||||
FR_OK = 0, /* (0) Succeeded */
|
||||
FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */
|
||||
FR_INT_ERR, /* (2) Assertion failed */
|
||||
FR_NOT_READY, /* (3) The physical drive cannot work */
|
||||
FR_NO_FILE, /* (4) Could not find the file */
|
||||
FR_NO_PATH, /* (5) Could not find the path */
|
||||
FR_INVALID_NAME, /* (6) The path name format is invalid */
|
||||
FR_DENIED, /* (7) Access denied due to prohibited access or directory full */
|
||||
FR_EXIST, /* (8) Access denied due to prohibited access */
|
||||
FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */
|
||||
FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */
|
||||
FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */
|
||||
FR_NOT_ENABLED, /* (12) The volume has no work area */
|
||||
FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */
|
||||
FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */
|
||||
FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */
|
||||
FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */
|
||||
FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */
|
||||
FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */
|
||||
FR_INVALID_PARAMETER /* (19) Given parameter is invalid */
|
||||
} FRESULT;
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------------------------------------------------*/
|
||||
/* FatFs Module Application Interface */
|
||||
/*--------------------------------------------------------------*/
|
||||
|
||||
FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */
|
||||
FRESULT f_close (FIL* fp); /* Close an open file object */
|
||||
FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from the file */
|
||||
FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to the file */
|
||||
FRESULT f_lseek (FIL* fp, FSIZE_t ofs); /* Move file pointer of the file object */
|
||||
FRESULT f_truncate (FIL* fp); /* Truncate the file */
|
||||
FRESULT f_sync (FIL* fp); /* Flush cached data of the writing file */
|
||||
FRESULT f_opendir (DIR* dp, const TCHAR* path); /* Open a directory */
|
||||
FRESULT f_closedir (DIR* dp); /* Close an open directory */
|
||||
FRESULT f_readdir (DIR* dp, FILINFO* fno); /* Read a directory item */
|
||||
FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */
|
||||
FRESULT f_findnext (DIR* dp, FILINFO* fno); /* Find next file */
|
||||
FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */
|
||||
FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */
|
||||
FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */
|
||||
FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */
|
||||
FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of a file/dir */
|
||||
FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change timestamp of a file/dir */
|
||||
FRESULT f_chdir (const TCHAR* path); /* Change current directory */
|
||||
FRESULT f_chdrive (const TCHAR* path); /* Change current drive */
|
||||
FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */
|
||||
FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */
|
||||
FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn); /* Get volume label */
|
||||
FRESULT f_setlabel (const TCHAR* label); /* Set volume label */
|
||||
FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */
|
||||
FRESULT f_expand (FIL* fp, FSIZE_t fsz, BYTE opt); /* Allocate a contiguous block to the file */
|
||||
FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */
|
||||
FRESULT f_mkfs (const TCHAR* path, const MKFS_PARM* opt, void* work, UINT len); /* Create a FAT volume */
|
||||
FRESULT f_fdisk (BYTE pdrv, const LBA_t ptbl[], void* work); /* Divide a physical drive into some partitions */
|
||||
FRESULT f_setcp (WORD cp); /* Set current code page */
|
||||
int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */
|
||||
int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */
|
||||
int f_printf (FIL* fp, const TCHAR* str, ...); /* Put a formatted string to the file */
|
||||
TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the file */
|
||||
|
||||
/* Some API fucntions are implemented as macro */
|
||||
|
||||
#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize))
|
||||
#define f_error(fp) ((fp)->err)
|
||||
#define f_tell(fp) ((fp)->fptr)
|
||||
#define f_size(fp) ((fp)->obj.objsize)
|
||||
#define f_rewind(fp) f_lseek((fp), 0)
|
||||
#define f_rewinddir(dp) f_readdir((dp), 0)
|
||||
#define f_rmdir(path) f_unlink(path)
|
||||
#define f_unmount(path) f_mount(0, path, 0)
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------------------------------------------------*/
|
||||
/* Additional Functions */
|
||||
/*--------------------------------------------------------------*/
|
||||
|
||||
/* RTC function (provided by user) */
|
||||
#if !FF_FS_READONLY && !FF_FS_NORTC
|
||||
DWORD get_fattime (void); /* Get current time */
|
||||
#endif
|
||||
|
||||
|
||||
/* LFN support functions (defined in ffunicode.c) */
|
||||
|
||||
#if FF_USE_LFN >= 1
|
||||
WCHAR ff_oem2uni (WCHAR oem, WORD cp); /* OEM code to Unicode conversion */
|
||||
WCHAR ff_uni2oem (DWORD uni, WORD cp); /* Unicode to OEM code conversion */
|
||||
DWORD ff_wtoupper (DWORD uni); /* Unicode upper-case conversion */
|
||||
#endif
|
||||
|
||||
|
||||
/* O/S dependent functions (samples available in ffsystem.c) */
|
||||
|
||||
#if FF_USE_LFN == 3 /* Dynamic memory allocation */
|
||||
void* ff_memalloc (UINT msize); /* Allocate memory block */
|
||||
void ff_memfree (void* mblock); /* Free memory block */
|
||||
#endif
|
||||
#if FF_FS_REENTRANT /* Sync functions */
|
||||
int ff_mutex_create (int vol); /* Create a sync object */
|
||||
void ff_mutex_delete (int vol); /* Delete a sync object */
|
||||
int ff_mutex_take (int vol); /* Lock sync object */
|
||||
void ff_mutex_give (int vol); /* Unlock sync object */
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------------------------------------------------*/
|
||||
/* Flags and Offset Address */
|
||||
/*--------------------------------------------------------------*/
|
||||
|
||||
/* File access mode and open method flags (3rd argument of f_open) */
|
||||
#define FA_READ 0x01
|
||||
#define FA_WRITE 0x02
|
||||
#define FA_OPEN_EXISTING 0x00
|
||||
#define FA_CREATE_NEW 0x04
|
||||
#define FA_CREATE_ALWAYS 0x08
|
||||
#define FA_OPEN_ALWAYS 0x10
|
||||
#define FA_OPEN_APPEND 0x30
|
||||
|
||||
/* Fast seek controls (2nd argument of f_lseek) */
|
||||
#define CREATE_LINKMAP ((FSIZE_t)0 - 1)
|
||||
|
||||
/* Format options (2nd argument of f_mkfs) */
|
||||
#define FM_FAT 0x01
|
||||
#define FM_FAT32 0x02
|
||||
#define FM_EXFAT 0x04
|
||||
#define FM_ANY 0x07
|
||||
#define FM_SFD 0x08
|
||||
|
||||
/* Filesystem type (FATFS.fs_type) */
|
||||
#define FS_FAT12 1
|
||||
#define FS_FAT16 2
|
||||
#define FS_FAT32 3
|
||||
#define FS_EXFAT 4
|
||||
|
||||
/* File attribute bits for directory entry (FILINFO.fattrib) */
|
||||
#define AM_RDO 0x01 /* Read only */
|
||||
#define AM_HID 0x02 /* Hidden */
|
||||
#define AM_SYS 0x04 /* System */
|
||||
#define AM_DIR 0x10 /* Directory */
|
||||
#define AM_ARC 0x20 /* Archive */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* FF_DEFINED */
|
15593
src/vendor/ffunicode.c
vendored
Normal file
15593
src/vendor/ffunicode.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2
src/vendor/miniz.h
vendored
2
src/vendor/miniz.h
vendored
@ -115,7 +115,7 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
|
||||
#include "vendorconfig.h"
|
||||
|
||||
/* Defines to completely disable specific portions of miniz.c:
|
||||
If all macros here are defined the only functionality remaining will be CRC-32 and adler-32. */
|
||||
|
9
src/vendor/printf.c
vendored
9
src/vendor/printf.c
vendored
@ -34,14 +34,7 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#include "printf.h"
|
||||
|
||||
|
||||
// define this globally (e.g. gcc -DPRINTF_INCLUDE_CONFIG_H ...) to include the
|
||||
// printf_config.h header file
|
||||
// default: undefined
|
||||
#ifdef PRINTF_INCLUDE_CONFIG_H
|
||||
#include "printf_config.h"
|
||||
#endif
|
||||
#include "vendorconfig.h"
|
||||
|
||||
|
||||
// 'ntoa' conversion buffer size, this must be big enough to hold one converted
|
||||
|
52
src/vendor/vendorconfig.h
vendored
Normal file
52
src/vendor/vendorconfig.h
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
/* FatFs configuration */
|
||||
|
||||
#define FF_FS_READONLY 0
|
||||
#define FF_FS_MINIMIZE 0
|
||||
#define FF_USE_FIND 0
|
||||
#define FF_USE_MKFS 0
|
||||
#define FF_USE_FASTSEEK 0
|
||||
#define FF_USE_EXPAND 0
|
||||
#define FF_USE_CHMOD 0
|
||||
#define FF_USE_LABEL 1
|
||||
#define FF_USE_FORWARD 0
|
||||
#define FF_USE_STRFUNC 0
|
||||
|
||||
#define FF_CODE_PAGE 437
|
||||
#define FF_USE_LFN 2
|
||||
#define FF_MAX_LFN 255
|
||||
#define FF_LFN_UNICODE 0
|
||||
#define FF_LFN_BUF 255
|
||||
#define FF_SFN_BUF 12
|
||||
#define FF_FS_RPATH 0
|
||||
|
||||
#define FF_VOLUMES 2
|
||||
#define FF_STR_VOLUME_ID 0
|
||||
#define FF_MULTI_PARTITION 0
|
||||
|
||||
#define FF_MIN_SS 512
|
||||
#define FF_MAX_SS 4096
|
||||
#define FF_LBA64 1
|
||||
#define FF_MIN_GPT 0x10000000
|
||||
#define FF_USE_TRIM 1
|
||||
|
||||
#define FF_FS_TINY 0
|
||||
#define FF_FS_EXFAT 1
|
||||
#define FF_FS_NORTC 0
|
||||
#define FF_FS_NOFSINFO 0
|
||||
|
||||
#define FF_FS_LOCK 0
|
||||
#define FF_FS_REENTRANT 0
|
||||
|
||||
/* miniz configuration */
|
||||
|
||||
#define MINIZ_DISABLE_ZIP_READER_CRC32_CHECKS
|
||||
#define MINIZ_NO_ARCHIVE_WRITING_APIS
|
||||
#define MINIZ_NO_STDIO
|
||||
#define MINIZ_NO_TIME
|
||||
|
||||
/* printf configuration */
|
||||
|
||||
#define PRINTF_DISABLE_SUPPORT_FLOAT
|
Loading…
x
Reference in New Issue
Block a user