From fd566980a25a6ca635762cf17b1b3604688db070 Mon Sep 17 00:00:00 2001 From: vasilito Date: Tue, 30 Jun 2026 14:31:04 +0300 Subject: [PATCH] Add CLI tools: hisocli, hisofat, hisogpt with HisoCrc32 --- src/hisocli/build.sh | 37 + src/hisocli/crc32.c | 305 ++++ src/hisocli/fat_io_lib/buildlib.sh | 35 + src/hisocli/fat_io_lib/include/fat_access.h | 133 ++ src/hisocli/fat_io_lib/include/fat_cache.h | 13 + src/hisocli/fat_io_lib/include/fat_defs.h | 128 ++ src/hisocli/fat_io_lib/include/fat_filelib.h | 146 ++ src/hisocli/fat_io_lib/include/fat_format.h | 15 + src/hisocli/fat_io_lib/include/fat_list.h | 161 ++ src/hisocli/fat_io_lib/include/fat_misc.h | 63 + src/hisocli/fat_io_lib/include/fat_opts.h | 90 + src/hisocli/fat_io_lib/include/fat_string.h | 20 + src/hisocli/fat_io_lib/include/fat_table.h | 20 + src/hisocli/fat_io_lib/include/fat_types.h | 69 + src/hisocli/fat_io_lib/include/fat_write.h | 14 + src/hisocli/fat_io_lib/lib/libfat_io_32.a | Bin 0 -> 45670 bytes src/hisocli/fat_io_lib/lib/libfat_io_64.a | Bin 0 -> 58226 bytes src/hisocli/fat_io_lib/lib/libfat_io_aa64.a | Bin 0 -> 47506 bytes src/hisocli/fat_io_lib/lib/libfat_io_m64e.a | Bin 0 -> 78786 bytes src/hisocli/fat_io_lib/release/API.txt | 22 + src/hisocli/fat_io_lib/release/COPYRIGHT.txt | 345 ++++ .../fat_io_lib/release/Configuration.txt | 53 + src/hisocli/fat_io_lib/release/History.txt | 24 + src/hisocli/fat_io_lib/release/License.txt | 10 + .../fat_io_lib/release/Media Access API.txt | 40 + src/hisocli/fat_io_lib/release/example.c | 87 + src/hisocli/fat_io_lib/release/fat_access.c | 904 ++++++++++ src/hisocli/fat_io_lib/release/fat_access.h | 133 ++ src/hisocli/fat_io_lib/release/fat_cache.c | 91 + src/hisocli/fat_io_lib/release/fat_cache.h | 13 + src/hisocli/fat_io_lib/release/fat_defs.h | 128 ++ src/hisocli/fat_io_lib/release/fat_filelib.c | 1603 +++++++++++++++++ src/hisocli/fat_io_lib/release/fat_filelib.h | 146 ++ src/hisocli/fat_io_lib/release/fat_format.c | 532 ++++++ src/hisocli/fat_io_lib/release/fat_format.h | 15 + src/hisocli/fat_io_lib/release/fat_list.h | 161 ++ src/hisocli/fat_io_lib/release/fat_misc.c | 505 ++++++ src/hisocli/fat_io_lib/release/fat_misc.h | 63 + src/hisocli/fat_io_lib/release/fat_opts.h | 90 + src/hisocli/fat_io_lib/release/fat_string.c | 514 ++++++ src/hisocli/fat_io_lib/release/fat_string.h | 20 + src/hisocli/fat_io_lib/release/fat_table.c | 478 +++++ src/hisocli/fat_io_lib/release/fat_table.h | 20 + src/hisocli/fat_io_lib/release/fat_types.h | 69 + src/hisocli/fat_io_lib/release/fat_write.c | 373 ++++ src/hisocli/fat_io_lib/release/fat_write.h | 14 + src/hisocli/fat_io_lib/release/version.txt | 1 + src/hisocli/hisocli.c | 120 ++ src/hisocli/hisocli.h | 138 ++ src/hisocli/hisocli_64 | Bin 0 -> 810544 bytes src/hisocli/hisofat.c | 159 ++ src/hisocli/hisogpt.c | 223 +++ src/hisocli/partresize.c | 683 +++++++ src/hisofat/build.sh | 30 + src/hisofat/fat_io_lib/buildlib.sh | 43 + src/hisofat/fat_io_lib/fat_io_lib.zip | Bin 0 -> 55500 bytes src/hisofat/hisofat_linux.c | 159 ++ src/hisogpt/build.sh | 32 + src/hisogpt/crc32.c | 315 ++++ src/hisogpt/hisogpt.c | 323 ++++ 60 files changed, 9928 insertions(+) create mode 100644 src/hisocli/build.sh create mode 100644 src/hisocli/crc32.c create mode 100644 src/hisocli/fat_io_lib/buildlib.sh create mode 100644 src/hisocli/fat_io_lib/include/fat_access.h create mode 100644 src/hisocli/fat_io_lib/include/fat_cache.h create mode 100644 src/hisocli/fat_io_lib/include/fat_defs.h create mode 100644 src/hisocli/fat_io_lib/include/fat_filelib.h create mode 100644 src/hisocli/fat_io_lib/include/fat_format.h create mode 100644 src/hisocli/fat_io_lib/include/fat_list.h create mode 100644 src/hisocli/fat_io_lib/include/fat_misc.h create mode 100644 src/hisocli/fat_io_lib/include/fat_opts.h create mode 100644 src/hisocli/fat_io_lib/include/fat_string.h create mode 100644 src/hisocli/fat_io_lib/include/fat_table.h create mode 100644 src/hisocli/fat_io_lib/include/fat_types.h create mode 100644 src/hisocli/fat_io_lib/include/fat_write.h create mode 100644 src/hisocli/fat_io_lib/lib/libfat_io_32.a create mode 100644 src/hisocli/fat_io_lib/lib/libfat_io_64.a create mode 100644 src/hisocli/fat_io_lib/lib/libfat_io_aa64.a create mode 100644 src/hisocli/fat_io_lib/lib/libfat_io_m64e.a create mode 100644 src/hisocli/fat_io_lib/release/API.txt create mode 100644 src/hisocli/fat_io_lib/release/COPYRIGHT.txt create mode 100644 src/hisocli/fat_io_lib/release/Configuration.txt create mode 100644 src/hisocli/fat_io_lib/release/History.txt create mode 100644 src/hisocli/fat_io_lib/release/License.txt create mode 100644 src/hisocli/fat_io_lib/release/Media Access API.txt create mode 100644 src/hisocli/fat_io_lib/release/example.c create mode 100644 src/hisocli/fat_io_lib/release/fat_access.c create mode 100644 src/hisocli/fat_io_lib/release/fat_access.h create mode 100644 src/hisocli/fat_io_lib/release/fat_cache.c create mode 100644 src/hisocli/fat_io_lib/release/fat_cache.h create mode 100644 src/hisocli/fat_io_lib/release/fat_defs.h create mode 100644 src/hisocli/fat_io_lib/release/fat_filelib.c create mode 100644 src/hisocli/fat_io_lib/release/fat_filelib.h create mode 100644 src/hisocli/fat_io_lib/release/fat_format.c create mode 100644 src/hisocli/fat_io_lib/release/fat_format.h create mode 100644 src/hisocli/fat_io_lib/release/fat_list.h create mode 100644 src/hisocli/fat_io_lib/release/fat_misc.c create mode 100644 src/hisocli/fat_io_lib/release/fat_misc.h create mode 100644 src/hisocli/fat_io_lib/release/fat_opts.h create mode 100644 src/hisocli/fat_io_lib/release/fat_string.c create mode 100644 src/hisocli/fat_io_lib/release/fat_string.h create mode 100644 src/hisocli/fat_io_lib/release/fat_table.c create mode 100644 src/hisocli/fat_io_lib/release/fat_table.h create mode 100644 src/hisocli/fat_io_lib/release/fat_types.h create mode 100644 src/hisocli/fat_io_lib/release/fat_write.c create mode 100644 src/hisocli/fat_io_lib/release/fat_write.h create mode 100644 src/hisocli/fat_io_lib/release/version.txt create mode 100644 src/hisocli/hisocli.c create mode 100644 src/hisocli/hisocli.h create mode 100755 src/hisocli/hisocli_64 create mode 100644 src/hisocli/hisofat.c create mode 100644 src/hisocli/hisogpt.c create mode 100644 src/hisocli/partresize.c create mode 100644 src/hisofat/build.sh create mode 100644 src/hisofat/fat_io_lib/buildlib.sh create mode 100644 src/hisofat/fat_io_lib/fat_io_lib.zip create mode 100644 src/hisofat/hisofat_linux.c create mode 100644 src/hisogpt/build.sh create mode 100644 src/hisogpt/crc32.c create mode 100644 src/hisogpt/hisogpt.c diff --git a/src/hisocli/build.sh b/src/hisocli/build.sh new file mode 100644 index 0000000..ae41e38 --- /dev/null +++ b/src/hisocli/build.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +rm -f hisocli_64 +rm -f hisocli_32 +rm -f hisocli_aa64 +rm -f hisocli_m64e + +SRCS="hisocli.c hisofat.c hisogpt.c crc32.c partresize.c" + +gcc -specs "/usr/local/musl/lib/musl-gcc.specs" -Os -static -D_FILE_OFFSET_BITS=64 $SRCS -Ifat_io_lib/include fat_io_lib/lib/libfat_io_64.a -o hisocli_64 + +/opt/diet32/bin/diet -Os gcc -D_FILE_OFFSET_BITS=64 -m32 $SRCS -Ifat_io_lib/include fat_io_lib/lib/libfat_io_32.a -o hisocli_32 + + +#gcc -O2 -D_FILE_OFFSET_BITS=64 $SRCS -Ifat_io_lib/include fat_io_lib/lib/libfat_io_64.a -o hisocli_64 +#gcc -m32 -O2 -D_FILE_OFFSET_BITS=64 $SRCS -Ifat_io_lib/include fat_io_lib/lib/libfat_io_32.a -o hisocli_32 + +aarch64-buildroot-linux-uclibc-gcc -static -O2 -D_FILE_OFFSET_BITS=64 $SRCS -Ifat_io_lib/include fat_io_lib/lib/libfat_io_aa64.a -o hisocli_aa64 +mips64el-linux-musl-gcc -mips64r2 -mabi=64 -static -O2 -D_FILE_OFFSET_BITS=64 $SRCS -Ifat_io_lib/include fat_io_lib/lib/libfat_io_m64e.a -o hisocli_m64e + + +if [ -e hisocli_64 ] && [ -e hisocli_32 ] && [ -e hisocli_aa64 ] && [ -e hisocli_m64e ]; then + echo -e "\n===== success $name =======\n" + + strip --strip-all hisocli_32 + strip --strip-all hisocli_64 + aarch64-buildroot-linux-uclibc-strip --strip-all hisocli_aa64 + mips64el-linux-musl-strip --strip-all hisocli_m64e + + [ -d ../INSTALL/tool/i386/ ] && mv hisocli_32 ../INSTALL/tool/i386/hisocli + [ -d ../INSTALL/tool/x86_64/ ] && mv hisocli_64 ../INSTALL/tool/x86_64/hisocli + [ -d ../INSTALL/tool/aarch64/ ] && mv hisocli_aa64 ../INSTALL/tool/aarch64/hisocli + [ -d ../INSTALL/tool/mips64el/ ] && mv hisocli_m64e ../INSTALL/tool/mips64el/hisocli +else + echo -e "\n===== failed =======\n" + exit 1 +fi diff --git a/src/hisocli/crc32.c b/src/hisocli/crc32.c new file mode 100644 index 0000000..7f835cc --- /dev/null +++ b/src/hisocli/crc32.c @@ -0,0 +1,305 @@ +/****************************************************************************** + * hisogpt.c ---- hiperiso gpt util + * + * Copyright (c) 2020, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include + +#define VOID void +#define CHAR char +#define UINT64 unsigned long long +#define UINT32 unsigned int +#define UINT16 unsigned short +#define CHAR16 unsigned short +#define UINT8 unsigned char + +UINT32 g_crc_table[256] = { + 0x00000000, + 0x77073096, + 0xEE0E612C, + 0x990951BA, + 0x076DC419, + 0x706AF48F, + 0xE963A535, + 0x9E6495A3, + 0x0EDB8832, + 0x79DCB8A4, + 0xE0D5E91E, + 0x97D2D988, + 0x09B64C2B, + 0x7EB17CBD, + 0xE7B82D07, + 0x90BF1D91, + 0x1DB71064, + 0x6AB020F2, + 0xF3B97148, + 0x84BE41DE, + 0x1ADAD47D, + 0x6DDDE4EB, + 0xF4D4B551, + 0x83D385C7, + 0x136C9856, + 0x646BA8C0, + 0xFD62F97A, + 0x8A65C9EC, + 0x14015C4F, + 0x63066CD9, + 0xFA0F3D63, + 0x8D080DF5, + 0x3B6E20C8, + 0x4C69105E, + 0xD56041E4, + 0xA2677172, + 0x3C03E4D1, + 0x4B04D447, + 0xD20D85FD, + 0xA50AB56B, + 0x35B5A8FA, + 0x42B2986C, + 0xDBBBC9D6, + 0xACBCF940, + 0x32D86CE3, + 0x45DF5C75, + 0xDCD60DCF, + 0xABD13D59, + 0x26D930AC, + 0x51DE003A, + 0xC8D75180, + 0xBFD06116, + 0x21B4F4B5, + 0x56B3C423, + 0xCFBA9599, + 0xB8BDA50F, + 0x2802B89E, + 0x5F058808, + 0xC60CD9B2, + 0xB10BE924, + 0x2F6F7C87, + 0x58684C11, + 0xC1611DAB, + 0xB6662D3D, + 0x76DC4190, + 0x01DB7106, + 0x98D220BC, + 0xEFD5102A, + 0x71B18589, + 0x06B6B51F, + 0x9FBFE4A5, + 0xE8B8D433, + 0x7807C9A2, + 0x0F00F934, + 0x9609A88E, + 0xE10E9818, + 0x7F6A0DBB, + 0x086D3D2D, + 0x91646C97, + 0xE6635C01, + 0x6B6B51F4, + 0x1C6C6162, + 0x856530D8, + 0xF262004E, + 0x6C0695ED, + 0x1B01A57B, + 0x8208F4C1, + 0xF50FC457, + 0x65B0D9C6, + 0x12B7E950, + 0x8BBEB8EA, + 0xFCB9887C, + 0x62DD1DDF, + 0x15DA2D49, + 0x8CD37CF3, + 0xFBD44C65, + 0x4DB26158, + 0x3AB551CE, + 0xA3BC0074, + 0xD4BB30E2, + 0x4ADFA541, + 0x3DD895D7, + 0xA4D1C46D, + 0xD3D6F4FB, + 0x4369E96A, + 0x346ED9FC, + 0xAD678846, + 0xDA60B8D0, + 0x44042D73, + 0x33031DE5, + 0xAA0A4C5F, + 0xDD0D7CC9, + 0x5005713C, + 0x270241AA, + 0xBE0B1010, + 0xC90C2086, + 0x5768B525, + 0x206F85B3, + 0xB966D409, + 0xCE61E49F, + 0x5EDEF90E, + 0x29D9C998, + 0xB0D09822, + 0xC7D7A8B4, + 0x59B33D17, + 0x2EB40D81, + 0xB7BD5C3B, + 0xC0BA6CAD, + 0xEDB88320, + 0x9ABFB3B6, + 0x03B6E20C, + 0x74B1D29A, + 0xEAD54739, + 0x9DD277AF, + 0x04DB2615, + 0x73DC1683, + 0xE3630B12, + 0x94643B84, + 0x0D6D6A3E, + 0x7A6A5AA8, + 0xE40ECF0B, + 0x9309FF9D, + 0x0A00AE27, + 0x7D079EB1, + 0xF00F9344, + 0x8708A3D2, + 0x1E01F268, + 0x6906C2FE, + 0xF762575D, + 0x806567CB, + 0x196C3671, + 0x6E6B06E7, + 0xFED41B76, + 0x89D32BE0, + 0x10DA7A5A, + 0x67DD4ACC, + 0xF9B9DF6F, + 0x8EBEEFF9, + 0x17B7BE43, + 0x60B08ED5, + 0xD6D6A3E8, + 0xA1D1937E, + 0x38D8C2C4, + 0x4FDFF252, + 0xD1BB67F1, + 0xA6BC5767, + 0x3FB506DD, + 0x48B2364B, + 0xD80D2BDA, + 0xAF0A1B4C, + 0x36034AF6, + 0x41047A60, + 0xDF60EFC3, + 0xA867DF55, + 0x316E8EEF, + 0x4669BE79, + 0xCB61B38C, + 0xBC66831A, + 0x256FD2A0, + 0x5268E236, + 0xCC0C7795, + 0xBB0B4703, + 0x220216B9, + 0x5505262F, + 0xC5BA3BBE, + 0xB2BD0B28, + 0x2BB45A92, + 0x5CB36A04, + 0xC2D7FFA7, + 0xB5D0CF31, + 0x2CD99E8B, + 0x5BDEAE1D, + 0x9B64C2B0, + 0xEC63F226, + 0x756AA39C, + 0x026D930A, + 0x9C0906A9, + 0xEB0E363F, + 0x72076785, + 0x05005713, + 0x95BF4A82, + 0xE2B87A14, + 0x7BB12BAE, + 0x0CB61B38, + 0x92D28E9B, + 0xE5D5BE0D, + 0x7CDCEFB7, + 0x0BDBDF21, + 0x86D3D2D4, + 0xF1D4E242, + 0x68DDB3F8, + 0x1FDA836E, + 0x81BE16CD, + 0xF6B9265B, + 0x6FB077E1, + 0x18B74777, + 0x88085AE6, + 0xFF0F6A70, + 0x66063BCA, + 0x11010B5C, + 0x8F659EFF, + 0xF862AE69, + 0x616BFFD3, + 0x166CCF45, + 0xA00AE278, + 0xD70DD2EE, + 0x4E048354, + 0x3903B3C2, + 0xA7672661, + 0xD06016F7, + 0x4969474D, + 0x3E6E77DB, + 0xAED16A4A, + 0xD9D65ADC, + 0x40DF0B66, + 0x37D83BF0, + 0xA9BCAE53, + 0xDEBB9EC5, + 0x47B2CF7F, + 0x30B5FFE9, + 0xBDBDF21C, + 0xCABAC28A, + 0x53B39330, + 0x24B4A3A6, + 0xBAD03605, + 0xCDD70693, + 0x54DE5729, + 0x23D967BF, + 0xB3667A2E, + 0xC4614AB8, + 0x5D681B02, + 0x2A6F2B94, + 0xB40BBE37, + 0xC30C8EA1, + 0x5A05DF1B, + 0x2D02EF8D +}; + +UINT32 HisoCrc32(VOID *Buffer, UINT32 Length) +{ + UINT32 i; + UINT8 *Ptr = Buffer; + UINT32 Crc = 0xFFFFFFFF; + + for (i = 0; i < Length; i++, Ptr++) + { + Crc = (Crc >> 8) ^ g_crc_table[(UINT8) Crc ^ *Ptr]; + } + + return Crc ^ 0xffffffff; +} + diff --git a/src/hisocli/fat_io_lib/buildlib.sh b/src/hisocli/fat_io_lib/buildlib.sh new file mode 100644 index 0000000..fe6bb2f --- /dev/null +++ b/src/hisocli/fat_io_lib/buildlib.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +rm -rf include +rm -rf lib + +cd release +#/opt/diet64/bin/diet -Os gcc -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c +gcc -specs "/usr/local/musl/lib/musl-gcc.specs" -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c +ar -rc libfat_io_64.a *.o +rm -f *.o + + +gcc -m32 -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c +ar -rc libfat_io_32.a *.o +rm -f *.o + + +aarch64-linux-gnu-gcc -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c +ar -rc libfat_io_aa64.a *.o +rm -f *.o + + +mips64el-linux-musl-gcc -mips64r2 -mabi=64 -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c +ar -rc libfat_io_m64e.a *.o +rm -f *.o + +cd - + + +mkdir lib +mkdir include + +mv release/*.a lib/ +cp -a release/*.h include/ + diff --git a/src/hisocli/fat_io_lib/include/fat_access.h b/src/hisocli/fat_io_lib/include/fat_access.h new file mode 100644 index 0000000..1752387 --- /dev/null +++ b/src/hisocli/fat_io_lib/include/fat_access.h @@ -0,0 +1,133 @@ +#ifndef __FAT_ACCESS_H__ +#define __FAT_ACCESS_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#define FAT_INIT_OK 0 +#define FAT_INIT_MEDIA_ACCESS_ERROR (-1) +#define FAT_INIT_INVALID_SECTOR_SIZE (-2) +#define FAT_INIT_INVALID_SIGNATURE (-3) +#define FAT_INIT_ENDIAN_ERROR (-4) +#define FAT_INIT_WRONG_FILESYS_TYPE (-5) +#define FAT_INIT_WRONG_PARTITION_TYPE (-6) +#define FAT_INIT_STRUCT_PACKING (-7) + +#define FAT_DIR_ENTRIES_PER_SECTOR (FAT_SECTOR_SIZE / FAT_DIR_ENTRY_SIZE) + +//----------------------------------------------------------------------------- +// Function Pointers +//----------------------------------------------------------------------------- +typedef int (*fn_diskio_read) (uint32 sector, uint8 *buffer, uint32 sector_count); +typedef int (*fn_diskio_write)(uint32 sector, uint8 *buffer, uint32 sector_count); + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct disk_if +{ + // User supplied function pointers for disk IO + fn_diskio_read read_media; + fn_diskio_write write_media; +}; + +// Forward declaration +struct fat_buffer; + +struct fat_buffer +{ + uint8 sector[FAT_SECTOR_SIZE * FAT_BUFFER_SECTORS]; + uint32 address; + int dirty; + uint8 * ptr; + + // Next in chain of sector buffers + struct fat_buffer *next; +}; + +typedef enum eFatType +{ + FAT_TYPE_16, + FAT_TYPE_32 +} tFatType; + +struct fatfs +{ + // Filesystem globals + uint8 sectors_per_cluster; + uint32 cluster_begin_lba; + uint32 rootdir_first_cluster; + uint32 rootdir_first_sector; + uint32 rootdir_sectors; + uint32 fat_begin_lba; + uint16 fs_info_sector; + uint32 lba_begin; + uint32 fat_sectors; + uint32 next_free_cluster; + uint16 root_entry_count; + uint16 reserved_sectors; + uint8 num_of_fats; + tFatType fat_type; + + // Disk/Media API + struct disk_if disk_io; + + // [Optional] Thread Safety + void (*fl_lock)(void); + void (*fl_unlock)(void); + + // Working buffer + struct fat_buffer currentsector; + + // FAT Buffer + struct fat_buffer *fat_buffer_head; + struct fat_buffer fat_buffers[FAT_BUFFERS]; +}; + +struct fs_dir_list_status +{ + uint32 sector; + uint32 cluster; + uint8 offset; +}; + +struct fs_dir_ent +{ + char filename[FATFS_MAX_LONG_FILENAME]; + uint8 is_dir; + uint32 cluster; + uint32 size; + +#if FATFS_INC_TIME_DATE_SUPPORT + uint16 access_date; + uint16 write_time; + uint16 write_date; + uint16 create_date; + uint16 create_time; +#endif +}; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_init(struct fatfs *fs); +uint32 fatfs_lba_of_cluster(struct fatfs *fs, uint32 Cluster_Number); +int fatfs_sector_reader(struct fatfs *fs, uint32 Startcluster, uint32 offset, uint8 *target); +int fatfs_sector_read(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count); +int fatfs_sector_write(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count); +int fatfs_read_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target); +int fatfs_write_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target); +void fatfs_show_details(struct fatfs *fs); +uint32 fatfs_get_root_cluster(struct fatfs *fs); +uint32 fatfs_get_file_entry(struct fatfs *fs, uint32 Cluster, char *nametofind, struct fat_dir_entry *sfEntry); +int fatfs_sfn_exists(struct fatfs *fs, uint32 Cluster, char *shortname); +int fatfs_update_file_length(struct fatfs *fs, uint32 Cluster, char *shortname, uint32 fileLength); +int fatfs_mark_file_deleted(struct fatfs *fs, uint32 Cluster, char *shortname); +void fatfs_list_directory_start(struct fatfs *fs, struct fs_dir_list_status *dirls, uint32 StartCluster); +int fatfs_list_directory_next(struct fatfs *fs, struct fs_dir_list_status *dirls, struct fs_dir_ent *entry); +int fatfs_update_timestamps(struct fat_dir_entry *directoryEntry, int create, int modify, int access); + +#endif diff --git a/src/hisocli/fat_io_lib/include/fat_cache.h b/src/hisocli/fat_io_lib/include/fat_cache.h new file mode 100644 index 0000000..348d5d3 --- /dev/null +++ b/src/hisocli/fat_io_lib/include/fat_cache.h @@ -0,0 +1,13 @@ +#ifndef __FAT_CACHE_H__ +#define __FAT_CACHE_H__ + +#include "fat_filelib.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_cache_init(struct fatfs *fs, FL_FILE *file); +int fatfs_cache_get_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 *pNextCluster); +int fatfs_cache_set_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 nextCluster); + +#endif diff --git a/src/hisocli/fat_io_lib/include/fat_defs.h b/src/hisocli/fat_io_lib/include/fat_defs.h new file mode 100644 index 0000000..5fe8d6a --- /dev/null +++ b/src/hisocli/fat_io_lib/include/fat_defs.h @@ -0,0 +1,128 @@ +#ifndef __FAT_DEFS_H__ +#define __FAT_DEFS_H__ + +#include "fat_opts.h" +#include "fat_types.h" + +//----------------------------------------------------------------------------- +// FAT32 Offsets +// Name Offset +//----------------------------------------------------------------------------- + +// Boot Sector +#define BS_JMPBOOT 0 // Length = 3 +#define BS_OEMNAME 3 // Length = 8 +#define BPB_BYTSPERSEC 11 // Length = 2 +#define BPB_SECPERCLUS 13 // Length = 1 +#define BPB_RSVDSECCNT 14 // Length = 2 +#define BPB_NUMFATS 16 // Length = 1 +#define BPB_ROOTENTCNT 17 // Length = 2 +#define BPB_TOTSEC16 19 // Length = 2 +#define BPB_MEDIA 21 // Length = 1 +#define BPB_FATSZ16 22 // Length = 2 +#define BPB_SECPERTRK 24 // Length = 2 +#define BPB_NUMHEADS 26 // Length = 2 +#define BPB_HIDDSEC 28 // Length = 4 +#define BPB_TOTSEC32 32 // Length = 4 + +// FAT 12/16 +#define BS_FAT_DRVNUM 36 // Length = 1 +#define BS_FAT_BOOTSIG 38 // Length = 1 +#define BS_FAT_VOLID 39 // Length = 4 +#define BS_FAT_VOLLAB 43 // Length = 11 +#define BS_FAT_FILSYSTYPE 54 // Length = 8 + +// FAT 32 +#define BPB_FAT32_FATSZ32 36 // Length = 4 +#define BPB_FAT32_EXTFLAGS 40 // Length = 2 +#define BPB_FAT32_FSVER 42 // Length = 2 +#define BPB_FAT32_ROOTCLUS 44 // Length = 4 +#define BPB_FAT32_FSINFO 48 // Length = 2 +#define BPB_FAT32_BKBOOTSEC 50 // Length = 2 +#define BS_FAT32_DRVNUM 64 // Length = 1 +#define BS_FAT32_BOOTSIG 66 // Length = 1 +#define BS_FAT32_VOLID 67 // Length = 4 +#define BS_FAT32_VOLLAB 71 // Length = 11 +#define BS_FAT32_FILSYSTYPE 82 // Length = 8 + +//----------------------------------------------------------------------------- +// FAT Types +//----------------------------------------------------------------------------- +#define FAT_TYPE_FAT12 1 +#define FAT_TYPE_FAT16 2 +#define FAT_TYPE_FAT32 3 + +//----------------------------------------------------------------------------- +// FAT32 Specific Statics +//----------------------------------------------------------------------------- +#define SIGNATURE_POSITION 510 +#define SIGNATURE_VALUE 0xAA55 +#define PARTITION1_TYPECODE_LOCATION 450 +#define FAT32_TYPECODE1 0x0B +#define FAT32_TYPECODE2 0x0C +#define PARTITION1_LBA_BEGIN_LOCATION 454 +#define PARTITION1_SIZE_LOCATION 458 + +#define FAT_DIR_ENTRY_SIZE 32 +#define FAT_SFN_SIZE_FULL 11 +#define FAT_SFN_SIZE_PARTIAL 8 + +//----------------------------------------------------------------------------- +// FAT32 File Attributes and Types +//----------------------------------------------------------------------------- +#define FILE_ATTR_READ_ONLY 0x01 +#define FILE_ATTR_HIDDEN 0x02 +#define FILE_ATTR_SYSTEM 0x04 +#define FILE_ATTR_SYSHID 0x06 +#define FILE_ATTR_VOLUME_ID 0x08 +#define FILE_ATTR_DIRECTORY 0x10 +#define FILE_ATTR_ARCHIVE 0x20 +#define FILE_ATTR_LFN_TEXT 0x0F +#define FILE_HEADER_BLANK 0x00 +#define FILE_HEADER_DELETED 0xE5 +#define FILE_TYPE_DIR 0x10 +#define FILE_TYPE_FILE 0x20 + +//----------------------------------------------------------------------------- +// Time / Date details +//----------------------------------------------------------------------------- +#define FAT_TIME_HOURS_SHIFT 11 +#define FAT_TIME_HOURS_MASK 0x1F +#define FAT_TIME_MINUTES_SHIFT 5 +#define FAT_TIME_MINUTES_MASK 0x3F +#define FAT_TIME_SECONDS_SHIFT 0 +#define FAT_TIME_SECONDS_MASK 0x1F +#define FAT_TIME_SECONDS_SCALE 2 +#define FAT_DATE_YEAR_SHIFT 9 +#define FAT_DATE_YEAR_MASK 0x7F +#define FAT_DATE_MONTH_SHIFT 5 +#define FAT_DATE_MONTH_MASK 0xF +#define FAT_DATE_DAY_SHIFT 0 +#define FAT_DATE_DAY_MASK 0x1F +#define FAT_DATE_YEAR_OFFSET 1980 + +//----------------------------------------------------------------------------- +// Other Defines +//----------------------------------------------------------------------------- +#define FAT32_LAST_CLUSTER 0xFFFFFFFF +#define FAT32_INVALID_CLUSTER 0xFFFFFFFF + +STRUCT_PACK_BEGIN +struct fat_dir_entry STRUCT_PACK +{ + uint8 Name[11]; + uint8 Attr; + uint8 NTRes; + uint8 CrtTimeTenth; + uint8 CrtTime[2]; + uint8 CrtDate[2]; + uint8 LstAccDate[2]; + uint16 FstClusHI; + uint8 WrtTime[2]; + uint8 WrtDate[2]; + uint16 FstClusLO; + uint32 FileSize; +} STRUCT_PACKED; +STRUCT_PACK_END + +#endif diff --git a/src/hisocli/fat_io_lib/include/fat_filelib.h b/src/hisocli/fat_io_lib/include/fat_filelib.h new file mode 100644 index 0000000..a40a28f --- /dev/null +++ b/src/hisocli/fat_io_lib/include/fat_filelib.h @@ -0,0 +1,146 @@ +#ifndef __FAT_FILELIB_H__ +#define __FAT_FILELIB_H__ + +#include "fat_opts.h" +#include "fat_access.h" +#include "fat_list.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#ifndef SEEK_CUR + #define SEEK_CUR 1 +#endif + +#ifndef SEEK_END + #define SEEK_END 2 +#endif + +#ifndef SEEK_SET + #define SEEK_SET 0 +#endif + +#ifndef EOF + #define EOF (-1) +#endif + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct sFL_FILE; + +struct cluster_lookup +{ + uint32 ClusterIdx; + uint32 CurrentCluster; +}; + +typedef struct sFL_FILE +{ + uint32 parentcluster; + uint32 startcluster; + uint32 bytenum; + uint32 filelength; + int filelength_changed; + char path[FATFS_MAX_LONG_FILENAME]; + char filename[FATFS_MAX_LONG_FILENAME]; + uint8 shortfilename[11]; + +#ifdef FAT_CLUSTER_CACHE_ENTRIES + uint32 cluster_cache_idx[FAT_CLUSTER_CACHE_ENTRIES]; + uint32 cluster_cache_data[FAT_CLUSTER_CACHE_ENTRIES]; +#endif + + // Cluster Lookup + struct cluster_lookup last_fat_lookup; + + // Read/Write sector buffer + uint8 file_data_sector[FAT_SECTOR_SIZE]; + uint32 file_data_address; + int file_data_dirty; + + // File fopen flags + uint8 flags; +#define FILE_READ (1 << 0) +#define FILE_WRITE (1 << 1) +#define FILE_APPEND (1 << 2) +#define FILE_BINARY (1 << 3) +#define FILE_ERASE (1 << 4) +#define FILE_CREATE (1 << 5) + + struct fat_node list_node; +} FL_FILE; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- + +// External +void fl_init(void); +void fl_attach_locks(void (*lock)(void), void (*unlock)(void)); +int fl_attach_media(fn_diskio_read rd, fn_diskio_write wr); +void fl_shutdown(void); + +// Standard API +void* fl_fopen(const char *path, const char *modifiers); +void fl_fclose(void *file); +int fl_fflush(void *file); +int fl_fgetc(void *file); +char * fl_fgets(char *s, int n, void *f); +int fl_fputc(int c, void *file); +int fl_fputs(const char * str, void *file); +int fl_fwrite(const void * data, int size, int count, void *file ); +int fl_fread(void * data, int size, int count, void *file ); +int fl_fseek(void *file , long offset , int origin ); +int fl_fgetpos(void *file , uint32 * position); +long fl_ftell(void *f); +int fl_feof(void *f); +int fl_remove(const char * filename); + +// Equivelant dirent.h +typedef struct fs_dir_list_status FL_DIR; +typedef struct fs_dir_ent fl_dirent; + +FL_DIR* fl_opendir(const char* path, FL_DIR *dir); +int fl_readdir(FL_DIR *dirls, fl_dirent *entry); +int fl_closedir(FL_DIR* dir); + +// Extensions +void fl_listdirectory(const char *path); +int fl_createdirectory(const char *path); +int fl_is_dir(const char *path); + +int fl_format(uint32 volume_sectors, const char *name); + +// Test hooks +#ifdef FATFS_INC_TEST_HOOKS +struct fatfs* fl_get_fs(void); +#endif + +//----------------------------------------------------------------------------- +// Stdio file I/O names +//----------------------------------------------------------------------------- +#ifdef USE_FILELIB_STDIO_COMPAT_NAMES + +#define FILE FL_FILE + +#define fopen(a,b) fl_fopen(a, b) +#define fclose(a) fl_fclose(a) +#define fflush(a) fl_fflush(a) +#define fgetc(a) fl_fgetc(a) +#define fgets(a,b,c) fl_fgets(a, b, c) +#define fputc(a,b) fl_fputc(a, b) +#define fputs(a,b) fl_fputs(a, b) +#define fwrite(a,b,c,d) fl_fwrite(a, b, c, d) +#define fread(a,b,c,d) fl_fread(a, b, c, d) +#define fseek(a,b,c) fl_fseek(a, b, c) +#define fgetpos(a,b) fl_fgetpos(a, b) +#define ftell(a) fl_ftell(a) +#define feof(a) fl_feof(a) +#define remove(a) fl_remove(a) +#define mkdir(a) fl_createdirectory(a) +#define rmdir(a) 0 + +#endif + +#endif diff --git a/src/hisocli/fat_io_lib/include/fat_format.h b/src/hisocli/fat_io_lib/include/fat_format.h new file mode 100644 index 0000000..a8a6bba --- /dev/null +++ b/src/hisocli/fat_io_lib/include/fat_format.h @@ -0,0 +1,15 @@ +#ifndef __FAT_FORMAT_H__ +#define __FAT_FORMAT_H__ + +#include "fat_defs.h" +#include "fat_opts.h" +#include "fat_access.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_format(struct fatfs *fs, uint32 volume_sectors, const char *name); +int fatfs_format_fat16(struct fatfs *fs, uint32 volume_sectors, const char *name); +int fatfs_format_fat32(struct fatfs *fs, uint32 volume_sectors, const char *name); + +#endif diff --git a/src/hisocli/fat_io_lib/include/fat_list.h b/src/hisocli/fat_io_lib/include/fat_list.h new file mode 100644 index 0000000..bd386ef --- /dev/null +++ b/src/hisocli/fat_io_lib/include/fat_list.h @@ -0,0 +1,161 @@ +#ifndef __FAT_LIST_H__ +#define __FAT_LIST_H__ + +#ifndef FAT_ASSERT + #define FAT_ASSERT(x) +#endif + +#ifndef FAT_INLINE + #define FAT_INLINE +#endif + +//----------------------------------------------------------------- +// Types +//----------------------------------------------------------------- +struct fat_list; + +struct fat_node +{ + struct fat_node *previous; + struct fat_node *next; +}; + +struct fat_list +{ + struct fat_node *head; + struct fat_node *tail; +}; + +//----------------------------------------------------------------- +// Macros +//----------------------------------------------------------------- +#define fat_list_entry(p, t, m) p ? ((t *)((char *)(p)-(char*)(&((t *)0)->m))) : 0 +#define fat_list_next(l, p) (p)->next +#define fat_list_prev(l, p) (p)->previous +#define fat_list_first(l) (l)->head +#define fat_list_last(l) (l)->tail +#define fat_list_for_each(l, p) for ((p) = (l)->head; (p); (p) = (p)->next) + +//----------------------------------------------------------------- +// Inline Functions +//----------------------------------------------------------------- + +//----------------------------------------------------------------- +// fat_list_init: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_init(struct fat_list *list) +{ + FAT_ASSERT(list); + + list->head = list->tail = 0; +} +//----------------------------------------------------------------- +// fat_list_remove: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_remove(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if(!node->previous) + list->head = node->next; + else + node->previous->next = node->next; + + if(!node->next) + list->tail = node->previous; + else + node->next->previous = node->previous; +} +//----------------------------------------------------------------- +// fat_list_insert_after: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_after(struct fat_list *list, struct fat_node *node, struct fat_node *new_node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + FAT_ASSERT(new_node); + + new_node->previous = node; + new_node->next = node->next; + if (!node->next) + list->tail = new_node; + else + node->next->previous = new_node; + node->next = new_node; +} +//----------------------------------------------------------------- +// fat_list_insert_before: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_before(struct fat_list *list, struct fat_node *node, struct fat_node *new_node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + FAT_ASSERT(new_node); + + new_node->previous = node->previous; + new_node->next = node; + if (!node->previous) + list->head = new_node; + else + node->previous->next = new_node; + node->previous = new_node; +} +//----------------------------------------------------------------- +// fat_list_insert_first: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_first(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if (!list->head) + { + list->head = node; + list->tail = node; + node->previous = 0; + node->next = 0; + } + else + fat_list_insert_before(list, list->head, node); +} +//----------------------------------------------------------------- +// fat_list_insert_last: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_last(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if (!list->tail) + fat_list_insert_first(list, node); + else + fat_list_insert_after(list, list->tail, node); +} +//----------------------------------------------------------------- +// fat_list_is_empty: +//----------------------------------------------------------------- +static FAT_INLINE int fat_list_is_empty(struct fat_list *list) +{ + FAT_ASSERT(list); + + return !list->head; +} +//----------------------------------------------------------------- +// fat_list_pop_head: +//----------------------------------------------------------------- +static FAT_INLINE struct fat_node * fat_list_pop_head(struct fat_list *list) +{ + struct fat_node * node; + + FAT_ASSERT(list); + + node = fat_list_first(list); + if (node) + fat_list_remove(list, node); + + return node; +} + +#endif + diff --git a/src/hisocli/fat_io_lib/include/fat_misc.h b/src/hisocli/fat_io_lib/include/fat_misc.h new file mode 100644 index 0000000..0c02634 --- /dev/null +++ b/src/hisocli/fat_io_lib/include/fat_misc.h @@ -0,0 +1,63 @@ +#ifndef __FAT_MISC_H__ +#define __FAT_MISC_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#define MAX_LONGFILENAME_ENTRIES 20 +#define MAX_LFN_ENTRY_LENGTH 13 + +//----------------------------------------------------------------------------- +// Macros +//----------------------------------------------------------------------------- +#define GET_32BIT_WORD(buffer, location) ( ((uint32)buffer[location+3]<<24) + ((uint32)buffer[location+2]<<16) + ((uint32)buffer[location+1]<<8) + (uint32)buffer[location+0] ) +#define GET_16BIT_WORD(buffer, location) ( ((uint16)buffer[location+1]<<8) + (uint16)buffer[location+0] ) + +#define SET_32BIT_WORD(buffer, location, value) { buffer[location+0] = (uint8)((value)&0xFF); \ + buffer[location+1] = (uint8)((value>>8)&0xFF); \ + buffer[location+2] = (uint8)((value>>16)&0xFF); \ + buffer[location+3] = (uint8)((value>>24)&0xFF); } + +#define SET_16BIT_WORD(buffer, location, value) { buffer[location+0] = (uint8)((value)&0xFF); \ + buffer[location+1] = (uint8)((value>>8)&0xFF); } + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct lfn_cache +{ +#if FATFS_INC_LFN_SUPPORT + // Long File Name Structure (max 260 LFN length) + uint8 String[MAX_LONGFILENAME_ENTRIES][MAX_LFN_ENTRY_LENGTH]; + uint8 Null; +#endif + uint8 no_of_strings; +}; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +void fatfs_lfn_cache_init(struct lfn_cache *lfn, int wipeTable); +void fatfs_lfn_cache_entry(struct lfn_cache *lfn, uint8 *entryBuffer); +char* fatfs_lfn_cache_get(struct lfn_cache *lfn); +int fatfs_entry_lfn_text(struct fat_dir_entry *entry); +int fatfs_entry_lfn_invalid(struct fat_dir_entry *entry); +int fatfs_entry_lfn_exists(struct lfn_cache *lfn, struct fat_dir_entry *entry); +int fatfs_entry_sfn_only(struct fat_dir_entry *entry); +int fatfs_entry_is_dir(struct fat_dir_entry *entry); +int fatfs_entry_is_file(struct fat_dir_entry *entry); +int fatfs_lfn_entries_required(char *filename); +void fatfs_filename_to_lfn(char *filename, uint8 *buffer, int entry, uint8 sfnChk); +void fatfs_sfn_create_entry(char *shortfilename, uint32 size, uint32 startCluster, struct fat_dir_entry *entry, int dir); +int fatfs_lfn_create_sfn(char *sfn_output, char *filename); +int fatfs_lfn_generate_tail(char *sfn_output, char *sfn_input, uint32 tailNum); +void fatfs_convert_from_fat_time(uint16 fat_time, int *hours, int *minutes, int *seconds); +void fatfs_convert_from_fat_date(uint16 fat_date, int *day, int *month, int *year); +uint16 fatfs_convert_to_fat_time(int hours, int minutes, int seconds); +uint16 fatfs_convert_to_fat_date(int day, int month, int year); +void fatfs_print_sector(uint32 sector, uint8 *data); + +#endif diff --git a/src/hisocli/fat_io_lib/include/fat_opts.h b/src/hisocli/fat_io_lib/include/fat_opts.h new file mode 100644 index 0000000..ac4dc86 --- /dev/null +++ b/src/hisocli/fat_io_lib/include/fat_opts.h @@ -0,0 +1,90 @@ +#ifndef __FAT_OPTS_H__ +#define __FAT_OPTS_H__ + +#ifdef FATFS_USE_CUSTOM_OPTS_FILE + #include "fat_custom.h" +#endif + +//------------------------------------------------------------- +// Configuration +//------------------------------------------------------------- + +// Is the processor little endian (1) or big endian (0) +#ifndef FATFS_IS_LITTLE_ENDIAN + #define FATFS_IS_LITTLE_ENDIAN 1 +#endif + +// Max filename Length +#ifndef FATFS_MAX_LONG_FILENAME + #define FATFS_MAX_LONG_FILENAME 260 +#endif + +// Max open files (reduce to lower memory requirements) +#ifndef FATFS_MAX_OPEN_FILES + #define FATFS_MAX_OPEN_FILES 2 +#endif + +// Number of sectors per FAT_BUFFER (min 1) +#ifndef FAT_BUFFER_SECTORS + #define FAT_BUFFER_SECTORS 1 +#endif + +// Max FAT sectors to buffer (min 1) +// (mem used is FAT_BUFFERS * FAT_BUFFER_SECTORS * FAT_SECTOR_SIZE) +#ifndef FAT_BUFFERS + #define FAT_BUFFERS 1 +#endif + +// Size of cluster chain cache (can be undefined) +// Mem used = FAT_CLUSTER_CACHE_ENTRIES * 4 * 2 +// Improves access speed considerably +//#define FAT_CLUSTER_CACHE_ENTRIES 128 + +// Include support for writing files (1 / 0)? +#ifndef FATFS_INC_WRITE_SUPPORT + #define FATFS_INC_WRITE_SUPPORT 1 +#endif + +// Support long filenames (1 / 0)? +// (if not (0) only 8.3 format is supported) +#ifndef FATFS_INC_LFN_SUPPORT + #define FATFS_INC_LFN_SUPPORT 1 +#endif + +// Support directory listing (1 / 0)? +#ifndef FATFS_DIR_LIST_SUPPORT + #define FATFS_DIR_LIST_SUPPORT 1 +#endif + +// Support time/date (1 / 0)? +#ifndef FATFS_INC_TIME_DATE_SUPPORT + #define FATFS_INC_TIME_DATE_SUPPORT 0 +#endif + +// Include support for formatting disks (1 / 0)? +#ifndef FATFS_INC_FORMAT_SUPPORT + #define FATFS_INC_FORMAT_SUPPORT 1 +#endif + +// Sector size used +#define FAT_SECTOR_SIZE 512 + +// Printf output (directory listing / debug) +#ifndef FAT_PRINTF + // Don't include stdio, but there is a printf function available + #ifdef FAT_PRINTF_NOINC_STDIO + extern int printf(const char* ctrl1, ... ); + #define FAT_PRINTF(a) printf a + // Include stdio to use printf + #else + #include + #define FAT_PRINTF(a) printf a + #endif +#endif + +// Time/Date support requires time.h +#if FATFS_INC_TIME_DATE_SUPPORT + #include +#endif + +#endif diff --git a/src/hisocli/fat_io_lib/include/fat_string.h b/src/hisocli/fat_io_lib/include/fat_string.h new file mode 100644 index 0000000..90ca8e0 --- /dev/null +++ b/src/hisocli/fat_io_lib/include/fat_string.h @@ -0,0 +1,20 @@ +#ifndef __FILESTRING_H__ +#define __FILESTRING_H__ + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_total_path_levels(char *path); +int fatfs_get_substring(char *Path, int levelreq, char *output, int max_len); +int fatfs_split_path(char *FullPath, char *Path, int max_path, char *FileName, int max_filename); +int fatfs_compare_names(char* strA, char* strB); +int fatfs_string_ends_with_slash(char *path); +int fatfs_get_sfn_display_name(char* out, char* in); +int fatfs_get_extension(char* filename, char* out, int maxlen); +int fatfs_create_path_string(char* path, char *filename, char* out, int maxlen); + +#ifndef NULL + #define NULL 0 +#endif + +#endif diff --git a/src/hisocli/fat_io_lib/include/fat_table.h b/src/hisocli/fat_io_lib/include/fat_table.h new file mode 100644 index 0000000..ead75f3 --- /dev/null +++ b/src/hisocli/fat_io_lib/include/fat_table.h @@ -0,0 +1,20 @@ +#ifndef __FAT_TABLE_H__ +#define __FAT_TABLE_H__ + +#include "fat_opts.h" +#include "fat_misc.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +void fatfs_fat_init(struct fatfs *fs); +int fatfs_fat_purge(struct fatfs *fs); +uint32 fatfs_find_next_cluster(struct fatfs *fs, uint32 current_cluster); +void fatfs_set_fs_info_next_free_cluster(struct fatfs *fs, uint32 newValue); +int fatfs_find_blank_cluster(struct fatfs *fs, uint32 start_cluster, uint32 *free_cluster); +int fatfs_fat_set_cluster(struct fatfs *fs, uint32 cluster, uint32 next_cluster); +int fatfs_fat_add_cluster_to_chain(struct fatfs *fs, uint32 start_cluster, uint32 newEntry); +int fatfs_free_cluster_chain(struct fatfs *fs, uint32 start_cluster); +uint32 fatfs_count_free_clusters(struct fatfs *fs); + +#endif diff --git a/src/hisocli/fat_io_lib/include/fat_types.h b/src/hisocli/fat_io_lib/include/fat_types.h new file mode 100644 index 0000000..5e2cca8 --- /dev/null +++ b/src/hisocli/fat_io_lib/include/fat_types.h @@ -0,0 +1,69 @@ +#ifndef __FAT_TYPES_H__ +#define __FAT_TYPES_H__ + +// Detect 64-bit compilation on GCC +#if defined(__GNUC__) && defined(__SIZEOF_LONG__) + #if __SIZEOF_LONG__ == 8 + #define FATFS_DEF_UINT32_AS_INT + #endif +#endif + +//------------------------------------------------------------- +// System specific types +//------------------------------------------------------------- +#ifndef FATFS_NO_DEF_TYPES + typedef unsigned char uint8; + typedef unsigned short uint16; + + // If compiling on a 64-bit machine, use int as 32-bits + #ifdef FATFS_DEF_UINT32_AS_INT + typedef unsigned int uint32; + // Else for 32-bit machines & embedded systems, use long... + #else + typedef unsigned long uint32; + #endif +#endif + +#ifndef NULL + #define NULL 0 +#endif + +//------------------------------------------------------------- +// Endian Macros +//------------------------------------------------------------- +// FAT is little endian so big endian systems need to swap words + +// Little Endian - No swap required +#if FATFS_IS_LITTLE_ENDIAN == 1 + + #define FAT_HTONS(n) (n) + #define FAT_HTONL(n) (n) + +// Big Endian - Swap required +#else + + #define FAT_HTONS(n) ((((uint16)((n) & 0xff)) << 8) | (((n) & 0xff00) >> 8)) + #define FAT_HTONL(n) (((((uint32)(n) & 0xFF)) << 24) | \ + ((((uint32)(n) & 0xFF00)) << 8) | \ + ((((uint32)(n) & 0xFF0000)) >> 8) | \ + ((((uint32)(n) & 0xFF000000)) >> 24)) + +#endif + +//------------------------------------------------------------- +// Structure Packing Compile Options +//------------------------------------------------------------- +#ifdef __GNUC__ + #define STRUCT_PACK + #define STRUCT_PACK_BEGIN + #define STRUCT_PACK_END + #define STRUCT_PACKED __attribute__ ((packed)) +#else + // Other compilers may require other methods of packing structures + #define STRUCT_PACK + #define STRUCT_PACK_BEGIN + #define STRUCT_PACK_END + #define STRUCT_PACKED +#endif + +#endif diff --git a/src/hisocli/fat_io_lib/include/fat_write.h b/src/hisocli/fat_io_lib/include/fat_write.h new file mode 100644 index 0000000..5558a86 --- /dev/null +++ b/src/hisocli/fat_io_lib/include/fat_write.h @@ -0,0 +1,14 @@ +#ifndef __FAT_WRITE_H__ +#define __FAT_WRITE_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_add_file_entry(struct fatfs *fs, uint32 dirCluster, char *filename, char *shortfilename, uint32 startCluster, uint32 size, int dir); +int fatfs_add_free_space(struct fatfs *fs, uint32 *startCluster, uint32 clusters); +int fatfs_allocate_free_space(struct fatfs *fs, int newFile, uint32 *startCluster, uint32 size); + +#endif diff --git a/src/hisocli/fat_io_lib/lib/libfat_io_32.a b/src/hisocli/fat_io_lib/lib/libfat_io_32.a new file mode 100644 index 0000000000000000000000000000000000000000..cd58131a4398ec6fe8584955b85e15d521875048 GIT binary patch literal 45670 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 literal 0 HcmV?d00001 diff --git a/src/hisocli/fat_io_lib/lib/libfat_io_aa64.a b/src/hisocli/fat_io_lib/lib/libfat_io_aa64.a new file mode 100644 index 0000000000000000000000000000000000000000..8c1179dc38c24948b8a3292d5283d5aaacf72f06 GIT binary patch literal 47506 zcmd^o4R}@6neN*A96}(dAqfxyH79^pqNM>6$g#HB38*NxgCXs8T4!=jPJ#&uKgkIS z!k804hmm$Jk&HiWXE*_DNv5}#E1~67rvznMXU3VUXst7k_Zq-fr#c-4RH9(+`>ws# z$;##&MeoylJNNE9CwuRAul22Oed}A_Uf=rLMc0MfB8^`f|M|e^WA1|a3l_{Rn_Idd z5Gaw4%>RMF-0}tU+!&$pLWpW1#@_$we^>rc2>rWyw-CSU-|9<+@c#bfF(E$9?^|~Y z@ln6;J|M)${r>tZLb$&b;r12L+NRY_?ZUlmsSDSxSy3BlSr=_@Xj5RcA=194t+uTp zTt6DQtF5WMVKl@*$%wqEbz`egGR9~q+PLPf+WLm}a8pZEg}S4my|!)5nsyH#gjY1R zG}Jb%Zg1P5(_OK;wqbo!v|UGDx3)gq-rxpoX;^(nd!q`uD%{rW!u1U;4ebp&GcAZ* zTi?_sbGe~5+8%C8ievPn)eYpc{q0;MlX2SqA0Y~hTGdgv9@JR zq!}4W-mhw?Zwm81+PJR0e$8F0dA(xI+6MPx1*j7i({5X^~jNnicY_3Kay_u2TeXAp^HHtXgxYOeKO;AVDoOMkG@Jcu5x2 zC51aGm}FEvY>HCuGSxM0tHN5gE96ZrG;;0&RdyrL{CT4wp(R}#ZMwUmwmn?e(tsc- z&?K!EXv_u0Hv*cYe)VN^|xuB(fJoz-{f^wzdCwac&yh^$$)Hr&=wOV*%A zGG}fKFjOC{y{idiqb*^ovV6!|M6T+4}&AkicjYYEr0;G=`fr z@8k)UMF(fenU5oD)~yCJM*3QSj3n{s+HgeYDBJ=ABCQ`|jC#W0Bes*ds0~LV4bkYF zHGCT<-@s*~-@tQAN*0us1_BF%bCYl2j_Yr^!L}^Ch~2{yKNcf*8WrNI=_A*UymUmC z7%zOn2^M9FTW!CS5X+nmMVY>7fovyhz*qZXVZir`^BaHKd%VMW?7UBOoz4$_|GeY0ZAvbHH^67zRKXL?^OmH{;D!~$G0nkD;}&2#*3`1$WJSS z;yRI2_mj%t>wz&@D{K+W{G!MSRf`SvyDNiL0pHc3EKzgPXBXGa5Q#MfRYB1>ZTZT} ztAdeD{%NZxESu73;c*OkGh6P3tk_Hq#xSu=}#Swi@-HplE~zk&>Ugq2k(tfd*5qO>UU zX9X3{RKo6y3I?1q5GBu!}lx+M($n`tOBnNcnt?Eq-|w|P?p~s9-guid5R!UO~_L- z@^mwJTom?YH5HA6tnfn_>_Rx5cE@;;=( zLkj=zxDKf6XK)=;*MEm=e~FVg>9dND3Q=mIZbVQw1nNdeSksv2QiNf>@K1M!1`+PK z&+a?n^A*QLp{y_dKx+K_#wU7Nht8m$oIxFW_Z7SMJ?NT1dhhyteE}hg2mPY-V6GTC zR49fXww>TtGhZrLXNl4SsCT)LKhqsVy^3atiL86aeWLiVo!cB99ZNNVe0>8#WU)+GhL5T;jH3(}*=|^GIFZf#Wi*eok-rJZ-*hK&FKD`X z%*cu$o{kd--7R<~)40t}5bq3GU6dK~&phjA49Dl>O^1mYaY&2hnhCwxhVt;{`!(ps zZa42`n#Y?A9yNb65m)mktPAt)Gx#TO45N8Hzwxk?>7PKJcUYqT{Kg|nj$@@98CK^< z=QS0^c*L0>T~7L)A%xh0Ul)Ge5$LCl`zqYyUA3bFHlzsGMPl=}&2ZuI)UlCx;mMwR z==G@Q(0AU`M&aB=nd6*Cenh5|81U7;cz)wPnb*_Ht=_!QxUP4;VfRi(`MekLp+1Vf zp=N*YS=8wdqGNi8pm*mWf7-zKNlWs6aF5kB%^$1wiP*6dzR9TnQ;P?EQ~Hoj_W;wyAqILJr ztzi5gtYFW7#~JyH@2LzH9ulq0>rbAtg5-bDH_6R2(x|)C>D_#p=na6Ux=Sl@ZS|7J zbo^ByjWF_9i*pgqkAvnL$_{J0YL@4_C`Y$EtzwqtB&6fYW)jM43d(D;;4mRsjz^jB8P7h*!>8myI<)O+WinF?Q6`kd zRLJCnZ*+N57N>nvN67*8=u^wV@x^jNXeXkM_fZbaJ7q(;XqgPnmc6OYy(K!2L0C8 zgQzzQD{T?dW_X5ST*eE3I9%i9qslKP?zTnZ@C@1)(XH*0uJh+Nz9?nE_Px$eXsk%4 z8Teor?J?M4mDj_c6+=BUt**n%L36n!Z5HLV8TM*M<7j&ogT2~<{BKtFYR`?ZQ%kMj z?mw`CgJ`?PXS((Zj#JG5Y;~i| zZm6t5SBgBN^F*Els-y1OOK=~k*|4@D@Wm^lxaJY4MxR|^aZ_91hNiY?dti~Zc^YXeu^ z(zH6)xU-3!34yW& z4Uq*a7SsiUk;vQy3sjuc4uS{`|VR4fT=ovij0LB2OQ6pnW0y;_cy7 zVSIv5FFbt0cOeMG2TI-p-N`sEq{9ZfZQzFc4LW0FEc4&zFq#yJ>m4+lds-Sq+{lHmVul3EirI2-Ngnz!{Fx$12@whG;lNB zHx1lO_pE`N=}u7ZQSxu5TVvp6x=*LUUpH`*pECw-@`Ii~d3fcYXW%A3Ap;-9kAa)z zK4{=(_)KLSnXaj~vkctizr?^z{+AfInQps*o9RAm;HIAMHE^?B`VHKqUrr|r2l@Z3 zdnx}r27Z-+f78Itdh}fbpKXK}bD|qoVZW;2QZo$CN1BkMw$u_P%+UF}u* z(hpR%)wi;avZ?PR5%(gdUTRAeVa8)RI)1(if2G3JYgM5_yy{6;KOhbBxCS?*`Dx?N zMO@OP4{jc>tMvDpAg(q4nhysUuS@VVk8ipTq*!NyxYqIX`6dH1gIbrFcO%z2ol@>osp7w-1VeMhDy;d}@+a<<9m$+!&kv4H4{>k$Yy+i=|Fo*~e<-Pp{PV_Vb6rjp zafir1c8q-PypnPZrQ-;Vzt}PI^+p~X$%-S!K@#lGG5ai&_rGWT9hBK8@9Qu!JtBUT z)rF1?j9n+PJ0q+HZJ<;nQolDthl_nsKmJoug?%}*PjHkUNL zHczMjaW=0^#m8yX@sFeKMsB?P^FEb!KdYi-st9bVGM`$0TCVAA-b*UpHxwOx@}{58 z=FL}3U9Tgmvo}7~oAZQPn(Cz0OU?`O%*@sEg61v=a(d7wvUzJOMwoEqr33pvUT|Cu z{Or*4e&!2jXeY*)`+sTmzJvbhA7TE&@{m6@EI77=Z#@udCe2#MpcG;8O z!1!4WW&?GBEXO)aG4|FMtMkkI7{<_OM>$s8|I5nWAE|iYceq%!Bm-9tr z-d^+dLO*x-IUfsSLGS;&zZYrbJYQUu_yFTV=RPlnFlJpGZx)FyjuTv%`BcHseZFZi z-_)$T#nh!8n1}K8`QI(*u%|S`C#_kCG36I9R>b)w%wN+uQNuYXlR%#`MV-j&2Q7|o z^sjLeyE4SwLFAobW0)&+0y5Zh!0KX|YuTY}F_xVNxw~V&Cn0Bsi?0z0GaTuXCTWu{ zWd>u@#knLt@V?wb;36d{Hk$vA<7Dn|3N%E_jz}Wj`LK`zP1SR z-Emy-^~+*A@xmNC@vlgOJaat!MO^E0;`pO#gM-RnF9qc-6y8iiF|ZF=P%{_nuR4>P&SjB2O--982@@)mCY-VcQ3~7IM1#W zw7XF@=pskG6B8eY4EY=~G0I~S^5>4-4a)MEhVpRlN0)~ij&vwj(jmPgC=1S^>KKbT zMHmw@*R{iomL!_GM(DTI43ct4*nt20;K6;4rDq-%5+LG>$o20lXDNQW*u;4 z>XzN)<|Ah@u8%VN8Dz;b)5Vy2&8xU)y~q5-p*qY>S%mY938I(hEkg8%g&3;ziy_(# z3uj)RM;sgWN`}XIW+uYpEWhrfiyy-yZg0gV(Mw#Whcd*ou35{fh8Dx_={Yi6 zgwq=VA0g0*frk*TVgH7X`}}>#a~E{sp_rKX9OuH2R*}f=3M>;tD1(E1&TzgOdx+Qn z;0cR*d`zeBN4$F{EbhG?^!FewyfSudnT5RIz5(e~A-*Lhb~&+}u7u35*s%!s%;DjK zV!IB;G&xUOr%B! zbL~PHzh+%$_=h1g*vw<;;E?x-lYT8kR*@2%d3vYaLz8Cp{ zth$8aM_ym!Q0M!FsCbd-L?wUjJg88yoJ-fwGH~Z?ac-LE=Db6V>3VT~f0of^ z&>F(LkRix~^CKt&^g)%zn0^he3q)y!PrSXiz=Y?LA2eTy?< z)kiSC|7-lNz%_00C9tP^R@Rkw+-|iFjuADlV?Jz$-)ePWn_tI$#}7nnC*}`4KUOS= z+J*Bt4+8TXx)}Es*e>!=Gz~2vM|6d4YrKv6D+10C`ZwR6FLoB7T>Bl!W1}r{c4ml$ zA$wX5-;oE#UbPT&T#m6$U@qrS=rgX|4nRJS!*-H?&Lv@c;rzzGm-^bV&1%KFvSv1T z?s(d2g9s~{iDCGS!3LV2S9N3cq^@o7(@!4JPRSC>B;v6=2 zo*!tn1~Av0c4{Vchxl={xoU3_hZx_<7NtLeo%#vps62u8*uNa#T0I@*S%~)-=ZnRk za@&Vz}l+VD>a9K}|Gn?|IY%?IkG5DQC98=B#%z+$)9X}5G zhcm>`;T(~OOZy#rATI5>TOPVx=tGdVpM2JV+?^rn+~>h3<1_DXpM!nHJA{0&ytm<5 zk1EKb{FqLIfu=(`P8S*d5aU&=c?s(kBTrQL)dD>Ma&eHzxdQzN?p*$JxDC;ENtJII=`#`;)gq&9`y7SHtA2i=t zohV19xdrplH>1Ak`ul4sx5sP z)_%lJEDMIR#DcGm6QwcGWF2}CbC6%LMe_-+&9EnDQE#|rWr~=*6ha$%Z{A-N{PR8I zmJi#a^~D(?=if5jcMRt!vi>i?+6u}q1{r@F@+}lon`xU_Msc)@D0jA--Fd`$eZPh5 z2ce^n%=0HG|I_xQrNY5G1nI$dg6$N|l|E~G^cdb|PnB&yXy;~Ovf9MDdz_t=T@3sV z+mo7eMQ+wk%-{VM-UlZ^gL9la&W&yTN4yUrSXW{ru1@ngr0JmDkbB#dGC-cH}~Dmj0z%Ym$BfJg9)^015J6_{U$ zxwL0|xy5{TxPtQxMK{y7@P3b1R0bKJbl^XAkq+@!{=O8vPR3kKHK!TvRNbyb9Xtj* zA?IXEpUCrUq@D9OvYkU8pY18EKalm_&5wn)j$IsL`wF@O9{Qo9Z^sL&?iP>%>x5|! zSnpWR4x)@u?x$r4n`}fc6XWD%+CG&-sl{$@U24^e-q+(majxyS~Z)KpKCB_7cezliPn0oYZhNq^f+*D=zIBE3$ebzI4T{<8KZw2dXkw37A{^as#S_Hnf9 z?8@1s4PT-8bndRNd(x0TwKom$oil{ASWk6-1pAF3L z1bcS|bFc?JdP92{ADg*={Xs9@lRJ&}E^t})f=8eekD&ZuymEpa}p)QI4x-x_kA$@P<;G|U1Wa}+fpIl^zGEOEhr1vf@<2W80==$_DTCkd-e+KVH4^F zdHeu%;a|W$sd=c{+mrYykc zFF{w^Qq~83eF)dGje~wEwsBZL3q@{o9nxq1cVbw};C(2U*kjDXv}p`Wx73YqXt)pU(ON-7bz9_L}xmpq=mfa;|+y z)(7b18PH*Upgd1PPA3qb^{5E>(eHaalk0d)n?Sp$+e1alCXCpmygm!hiP9m@A$75!tkAHzXAsuOJqwjneIoh+rUYPoycQhfK(rnvmMc|!P{ca!otG|GOH zPu&io?PB|F0PPQy(I{J82OVL$DFU@k{da9FXS92|sPH#}H zJGc&VVY`8{p)P+^dARM7r{#Ny`DUDJRDAX+P|tSbEM;%_d@;N`=)*D&)*Hz5*p|c` z)UJo28|?FBn-2URqff_rz%dQ136Or{i>PnRLl5pX|CFWc(-tml zgIRX2zQ7kR9)w=AJ%GOJp4akXopX`^>Nz}`U_L|F7XN{!TQGVv7BAs zcI(|yS;o8ZjP$9;+6Qp`WYjHHzO*TE@WlE_nZ1m&wqxEru-NuNc%)IA z7`MOD^<5CRIE?8o081Bus z9Q!&EH`x!@1DmV;CWP&$P2~HU{OR$r9-q~f>_dfYcjsOoB*u7HS6fP6%rG3QqrKPt zPmXHyxcvXZmH8i3CR`e>4OQz@x?fOog+5iYZKdse59$unVc!?m$>_EV`p$PmV53h! zS7aZnTV8oso>F_m@@oUvx3#Tl3t;Pomiho@HU(PNgzM$n6}9*!aMcy{vx~U+#68;7 z`I7Ni`{M2*6SyKe^8AWu;JU>(Rewn%xc|l#^?|w#?G4dC`aN93Vj(}Dd`<_Xn&L<` z7sH+Y!&F8eoYrHmU+GqlXDa+*b^n$+&sX?1MGC%xJgO94qFB0J;mZ`h11|y|E$&HR zY{N|#gIhc{xhK(%Gx*T!rQ7TliU!s6MjQ#a}91-)p{l z6dqSm^z;9w@cjyptH}fG03`ioYF?O5>1PVB@!){bEK$t!MjbBy7vg;UN!A1X0^v2! zinKiaYZ@HPrwpH;2LD_d+)0Diq`_O$;D43||6UsW@ih3eY4DS2@ORSS=hEO9D@ZA~ zqBQutGAi*=qjf zeud9VLuaW9KcK=Nf*$awNfZ7XD*SrIRJj{m)GK_y!kr=Y7;!U ziJaWEZDjL1QERRZiwe1un_4_3H=e4Mo8>jFjyANl*J8)6c2PUB=M?uSbN8fTqQa#u zFR>VI^Oh9w@?n>U7`>Lf{;l8~Zs+w;3k20ReePyz#s-b68df0*l^txKHhL?z zt-lXnw56cR*aHR>isQ^T^dt`a<{r{k@eC@4jgc!Ngzx|*Aoci!u=cRL%0Xm z9qMZ$+E!ie!EaIFrvaa;u6epW4Zc_5Ui$kKKFLG>s6oeE5A>{oD-$h|a|W(Vu0%3H zmk0SY*Y}hg_^9UZrq`pJ~v!&cLrQaP4Aw^W|4AmY05M8oVYA9!i7nP`EeUc$)D0 z(}eF=xVN4@k%rDd8a!JqCZOD|G~^RVgO?llXN~ZBy|Oo7YgKr!JhvKj%=){-z^^js zV{VK*$meVWf7QT?4O}Sy$IFjj;a+|wD4g_7`=k9XFP+6{=-jSwZ@Fkc%}eK-Y3Tew z;ok83(}dUSZoT<>Mulg-<{0vM%fPQT@H1)X`&9$jOD9j^58&&@APlG>W;GZ?ZznO;qStGnzU;J5aWG_GY z3Mc<&eJ?j~_8IB}^KRt9@Y>fT&~D&mZV>r@tAQ^t@O=vR^7FD0-jvUqX>k7pmniu$ z<#U^Xo9Wgo+?#I92*1$e)4)ypw%@>ujqq<7xb92f<8IZj;nmxR74GHd2Wjx5X>h&1 z)~kopRX>O~-GIWq>6WI!mnfX{Ik`q3x1|Zc-Ux5XXNQ4bt%=~gFAbeTM))rn;g2d@ z=S%nFzM$~WfKS>bjbna@JjnkS4LaAUhP5|eiw)f5^I-$O&Y+X8`h!Tv#J{O<&8LpC zL*ZWeKamEXuKJI>;T?rDU6aplg?rO|I1QcsY48cEAIeK7Tj5@Q0%`EZG;~_hgx{0~ zeS7u{*_Clv0bf5r%J+Px*J|BmS{ z*2;r(yMfO$@Er>0{v~Gky$bi1<35FZ`8jHYCu`c4J#B!oB%jmL_~-8a%FWrfZhV{xta025!EOgz9+o z@|mY_(l_6~r3OCV$nP=(H~HCW;5QrL;|lkt`?3+UIc3IC=M-fUM)P@N85`Xvfy zzRY&QVgoNT_^dJT1qR-3;N=Fs&%n*_{R;Q;^Q;kmp+V=Ift&BC5|v4>{*)@*OMh7! zyk6mygV|4lS;6w~(%GK|f5M=1i^2cVG~u5y!mCRe>tzEs%l(YPz4<+>a4(hlpJxr+4DVOQ#amw2DBPRhQUf>3 zrN+QbIW#KVTV5>+_oll^;e1amH}dsS8#??)*k326@};w++)RBdSUh|WI!VO6$kxV( zg^z>rAR2k*y)wV@9YkDp!|{ghSlk> z=Z$gb_?iy~&v;#8gyChm>J(n*!F4=+z6sCuwHfrkn4QYT18-Q~t1eX|lo0z>{6W>v zLU*692F<^gKXI?@NNC3u{4Yd@*~r1YH+?qmQ^n7&U~D1&&^;ypd*gGQ$sIWGe1j&< zUK8{6Rui9Kf1THr4@)K-$%!MzV}~8i>9sKrne*^C=WY`A_U2r5%pb%&b%A-joQLbq zGkXE^*9I}~Ffs${BEK#YT(1$rcLBJ@D}=QO0nEP^z`S#Fh4`r(rw)4%V6LN#Gu(43 zJVy+XMlwFuJuyA*uTCx zhV-98`k32SOdhzdU*`?;`jYET^jZk=!Fhe=+70ggaT0Sx^}I-y0n3Hu!EgUy?Ma_c zeg7wfZ-)%#xa&0UM7j%b%{5YYVJ~uivxPk4yDb~YH^1Ye#@Ymb68~_F{e@QB@!Edq+lHO@6U8%)i;UwDXv|} zwBl_yiGfr1-IKXoV88Nv@5x@i^`89YHzR$qDRcQaF?@>nSpUGWtFPZ(z2#^3SKF6C zFOW`XhDhXN?QmnUNMs`H%Ev@7{Gb(Vs>?VV`iT{6{HYbZ<63+p>4X)`6R~3}er*LC zeq#mee`^Js@4@$tY->Z^csrPZa*VHRFYm_O;J^esxNDAh+d-bRE{5&A?bN?FvCgO* z&l!$kEbK#ZFAq<1E;PR z1ILbvc-xkr^|et?sh49nWiO|`Qdg<7E1<6#oAQ^hR{FXM`r2|L<7~%o#Rjdb&Cu1A z(A6gBYUmVn`CaJp`&MwphtT0FF;ss)zRgr;2P3=39jd$Aqr;m%Mu+j-)Zqc>a1C@g zw(@(Y+M&aa(qRD|4(%R)mixz0UW3r#z`Mhxp$8YuX4yrcn=HF}=xYR9*hQd&>*hHd zSdLpJjG0E=q|FK0nO&7P-(OvH&AztX|E=qRFyA3p{os_11%Zg46TZQg@05tNp_7Wq z1Jk7Kj-MJXEn?cxXRfsl;GW;8;XP>|$K3Ba+pRC(!gH^lbGKLB_b zha(@WfB#SHW0$J+!#0tp;e;%^UAf*CkdPbTm~)=>+=3#+A+GPYDY3zT;z*Y+EP09} z)m-0lgj3}+Dh8WwoRhXgvC0=Fk81oP8GV`xrw?r6C8~TmR$=0t^U8zis^JWIzf4sTFF*R*3|{`@D!iAUy$bj8 z^QM}M;7zwtRS_?Jy%#ret$SoNQ~6Nz?bWc0iGEtaa@TXaZ@LVFH`BR<&AOZ_!>&< z<9qnl;T1djR`%Z$({@8Y7*O#)&PTr%5xg`>qs+^wBJ2&zdsQ`52=`R3;t#3_yk-5? zWVQUp0rSd^6!OROzYu@to|6B)>8JD2^&ZtXCu6!7-uSe8tD2$_wFU0T9=K_J^o4lB z!;%uA=@~7?#o*od5A`Uply0%=Gg7F7_;3k#%_<`oZ0x<^1uWq81su@AP?tEoTuYF0q0pbXX9Lsa~{qP z&iObm!Ff8)%Ww|hd>hWQa1P;o70zpMz6R&@IG2bZ`9_N>Sa{CYT8Z}94H%NH!oEqh z!uLj{%9{;297CJULLMrXxqB&up@NV{ka?Tox3(8$+S>~oi^`=evi%ar8onR|nNxTj ze4i=!PLz_9h4d=AeXXy!6--#n;Nw_Sq1h(G&F?5%};vtH_L;~r;~n~J_ubgph^(WcGl z_U%l{h5Hxab+ThC{H~FH2&?b@YaH}d*uC3kq0a*SBKJ+N>iyoXF}h8cn_^4(9o@aq#W?y)EKxA8;~vqw z_a6T=0eXkguTX^Z2|Ty5I}7MPJ$e#*tj!U@*psui-?>1*M}+@)kA=_Y#&Tfa^Q^|Y z^6<);&Hwtd^*fDi8gze9z?nuTC3!X5!W(kJ8Ylh}bU z{|3Fox?Z`DR7PV%`HIFX${&S(9=^u?F5@o9HPhy|C-+uoh^^Ir_>I@kdb&WMK6OC9 zh1gaQg1+DJtT?nH+ggu08Em);-#-pnhw4hjhVXQe(B-K6qSz0Iz9;lS@tb6p^mD@S zaVqeA#{l*Uwf$Sszkoecp7K4mIY(^Rg8iQM?Gas_#i&o85jTtFFh2)nrj`nij1)wx##`dLT^KG`t=JJErCFjheq>+pRyyQ!$W z2yp~{6%)kUMTm#_ucf5TbwBQVbbMQ_TMJ{@rzIwC>KZngKkHoXoV~%21;TDv6WYr9}c*Cxd`+TS(ey7BUW3!2yrV_JcchS*<8@6zm179 z(B&2Y54wMi<;c3D?_Y&1m@j^tnD*x6^E;|%!bgXVX>I}^49hY&zwsx%Pr+yZ{v(f6 zOZ|8ERiONL;Mes%=-*-NPqb%`2=1GSZ&>Czy?^>hqD?ro3mJWf=ZnPNhy1 z@=p53^f{Zp|D9i9&ku1f@;v7EWi9smmvUXS_`CY@c%CRffxb!fGY5BnUvPO>UI_NU z0Uq&-=Q>2j8=E2LfIz=1$~cZZ)WYT!t#uBCvA-91>b4X%h^0Mv9(r=-cH*b8 zXOJtCpUJhuz)%(4cPX2OeEsv?$~Gz6dpY>g5uS`6-@P1y&~vy;=FXd6TDD+ed9bo- z(cpe~bApNx}e7;J59L~hIsRm`e ziWpG1{vJcU3SXx1+f-4WQQ^M~JXN|}jp8;IrRNQ=8UPj;jeMfZ_!im-Xs**4L9x0< zMR(UM@yVzEN|;N-^Yt$m)Qeaot4YXMAH|f3H#J1D9rh26uG0yk-jPIlRnxNPM_GUJ?j-tpV-6?rJ<9ld}uFy z{XIm|*M14p{-)9g(l_ydO3X{goX@X@^xZ6cVqe+){><;&cW7=gg^Zk;GGRv3jgv1? z9Xc<$(va^Xh%_0W?;##n;z!);2Y%C&F2nL*So5GABu}3<{#?W*O{G4#au2(vhy7<2|Kogk+H*}y$L0Ae7uko9D({T1 z`!M24Fyn#ImTUfX`LUhhl|3Nw79ZfK@i6DPm3_pi;s?}=BkYn%{`bbGS%$r8T7Abw zjVdcS3ZppuN8rek1qs$KKP$Y{#Na zUd{d0+14Gv{#)oh4%$e=g3sUa1bhhiKNYWw))+;f3BO`3_9RA|-I{=K6R@{u7JM$W z?b$Bwz`mQ1Zw*u}FOGBNbO-$ozUCf`^)jtW(Db7X&vt$%_OQWzk;UA55OH&)UxU48 z>cQVX!f#1_Hy-WkchQcX48C6ZDfq$OR({agrFim#r(NLbIPhHX!|z{kd>do(+;6)0 zJ?wqO@t+65Cq&KtZCbw!{{@Y}TYr@yZpB&dZyT}&`ZKui6~^ z^4sX2Lpl5m@n<65QMAoToBQeKf~R!((0Q1EeWAI(5%-{_{M`M0Tsd-&&0j&ba=wP~ z{d(@lIE1~w&ceqSLitNt@aM2LPJXw5<74ncin*5+{7J~o9b@HpI0AlAmIwWG_vdzT z&O6ZiXkkAi?tj|XVNY%5Sa|f z-kXPQ5#%%O$(ZUnaeT8NhkHj+U+IJCz6ZUJDD#L~6%5IJ(Y`N9fUrE7RMHiy)<2a343+T zWuFntyuP6FTKbtk#`h!`H;z5O?}8i>`0m8RI1fQ*3b0S~KigBcbC2_%*ag^o(A|6N z11Zk}HhH@{eBuoUd(|>ccTe%$;veJN_S|!9r0>B^KY;u)pK&q(;rW18#Gvc4{&FDkF4f+Vt z-vS=_jPdgzXVkmrun)V8&v`L}h{L=xkKaf625`-C`D{)GW)$Ng`B@3NWT4QU2-I@n_lb;3;(`u{fU zXZ5Un=lvLL3i2=S>%rS4xc4JJSkGJ9kttgL5qtGFfsfZ9Tgq=6>@(kY0r2vwFQa%d z(xqLeY+lRWR**p+tTD|Q$TM-4$ySuf5!mQipnDW$7lKVcjDDz z-F+vK?kt%f@y1rr0*}F2G7o+!H_gwD!1MExh#lXzg81 z?Txij>`l|C(v};zz!$G?0?F`(T6*fnqlWeE4XdL~YqZ<0T=unLl93r=mP4xC=-Vo{ zO-f>xYWsU}-SX!12VQN3tnVA zyy0(8ga1bx-`0DSxw#zi&Gh{=TrjJS2GluI2}#etp{qz0@cMRFDqM+O#YR10gcOHT zqvVroa7CJ*HvU}1B~7nytkeHE-#Fd)_Lp@=LEAjM{PSL^q8UsqQ}Lfx5qQgbpvium zZ>-0+|7{f2q!~@36LIC09Uo>ZfAr>LNcY0aKg}3EecaNZ2Dm@&dx!HE&Yg$BZ5$Ur zzAZZi6d#T}>pAG|{_nm3=3&aQ7OQUy+HF^es)U{AB>Vx+^BYsVTi8plN1I_Y&WDA+ zxoYdKf{>_qF@)u40leosGVBD$JM{jhW6CRs?j7UqWskOuoa64&AJYd}VO$2^o`Y+i-D4OmN^3YLb4|UvNqfAC*s_E!)v0TV_KK8!lUj6Vtq+Fwr zQAVC zh%UJ2dB4crKBh5Rz6JdaG4y?GhK~@rE_-<>B(in~Y*;}2T11W|tgMRZ7_X0w-cNYv zjNGM?*0mka+n{BEmIE5}V7tWGpx0$s z)18D~7f=bFZa_Yn=K=0Hk9=;0EVf{7awp~{Q~&bzj}68%Du?|2?%8+9JzGzV4Ms56 zb~oxx`<3`+CG7!O`mBoO*5U>&%qC)PI=Z>{Dtj)@6(IdqwL2thRZ`J|1i?oqRPJ~ zV4?i+L;0Ub)+6`Z7%V51?_%oV49xMSOy*-QIQyrlpVUXLBVm4DhX0C|G3HN;{v*iq z7JL)TMt&{!y&(Tw`@nS%^jWBv-6%hNv#@wk>%c)c8W`=tW? zZ*~In1dKimcW->kwfjp;o+n+>qii)z88;(+T(iEPQFS~3U#xI~n41azjD1F2AH#64 zKj>F-zgNg>oAQ@^O)eHfzX9X@9em^iuqgpNKZClj?R5qFt6+DverbKDOsU`RqF;+P zm*0dz{}|G8*CjCxfx2CY`0T6WKJeyq_j?tSli``JxBNvK%&dcacjV$-lnXzXcAxf+ z{Tkfkp84;DUNiqaDC;oF8t;I9miM2ctoggq(Bbagj6d1pZdz6KE%mp_tU137x0C zm;G4MX1nG8|C^8N`T^b+j_Ws?bIfm(Z4e=@#+kUjpI}7&B))GY=+LKZRPh%p`pa-m z<>US*6<*IBtykgiPcFz?Q?;+!uKeAzrxQc{0WUKALdPkA5(Z-`M!+` ze?#G!%Ex_J;p34X<}0r70fkH7*KIT!Q_R_tlp8VDg(J;#)`r{K=aeWnlaDasTd#If zHBdPqK6>ss!meG{c87LR)9oh8eMB*~-n4qf8uuIX<`$Pag{IZ@wRJ7w)y;b5xqg5| zNFdU(F52FJy&R=yZBo#iWV#O!oZD)u;2h?TG=`g!9`l-YtHBJn@l+wAQc`+8gx9xx zR>_~Z>ASva;HKVOr{wPqf4hO3;q^Xo3~%E9(R^3*_m4WX@1((WzH0z)ZXP?_lbq|s zs;T4WEBs2FiL2_PP$A-;boB#&3=T=ez3opVoJsq%&$Vi)%0cyjP}XR7kzA z+@Oj;a_p+ZoB?WG+0gS+>eQf-w{nPz~3+?Vj&`JA`34e-LeTv}^D!5qyV+ zeiX-k=|{;iHskwtd`6u90G~13d&YCLQ*ua?>!aU68(Ft?x1gVdv-6s zVd(v*1p&^p1Plbovb{W5a zQ}^h59)FmBgciFVS6yxp|p zkoO?+&9>7ZWI!HB%PYsR=%ctXn|%uXQYIX~{@z2E%-(yKNZ`9WL-890%b>4kr%3Gn z1I*KhOi|{=1MufKPR#KT_GO&k_{=`?DIl}>L-0w^ZjIlF@20|!Vw>_Hd|Gt2c5%#) zy23F=e$)N&=$PIh&iH0pb$mY7>*L(B(@C&@gYogrp<<@_E4I7wE!_BgXQ+T-7rEcz zz`J~y6OS>X z5WX8#h&k#pj9(IqphPW?`~&P9^gH4%+n0*XaCAlKC0Hck<{@NEs}0hG2v8;&#p5DAO8@cTObF z@4=rMuEJO_bnv)uS|7e=g>QCFX-3%&J%Kj$b%_5UzK4WwKi$eW^b;6|@?v~`518?b z(5^m#KBXStl3vyq_DhM|suCge-C*oX`kwqooGwe2BlAx=90pEVvRo)j=7(}6eaf`+ z9rs(FO#cCd-TS9sp1o&_-L?BJd_NI#A}{f=OM63OtzM?T`?8yR>n;<$Umn z_?$fPS?t_!=^!jLYv4HbVB8E6_?EistMpXa%poZ~hDT7JP^OF30K8`7liTllUZT_p$A+kC)ZO z6*!M-6Ds@*X>fF=qzu0vIOz}K%p+SR^#HDkzoqWmRRiJs48wq)<4N47!e2~-zmW#F zkX|Y}oco&!Uzi5}QW~5tg6rPQF?^nsUoBwB6wXCDU*uvOne^WZNV(g8${D+^kK-=+ zmEKs=?{O#ndL|fi0`Nu8>1CEvI!L2jyHVTpD?QM@GJO@*Y?M!^cRai}^^OPe@$RMk z|BSjOZZz4FaVexHGx^f4D98Q$a*b}xyW>wC>{PIKMtt44TJFZqoc z9^}Uif7HM^)}s$|{V)xxKAu)SKk1nKziQyQIxxxxXV&kXtA$9yu z>qAaeeG5rO)rFUT-Yb8KNYVD%en^W&7Zwy_DpRUduLrAy2r{jH>_E+ z^4%*}*N0(7J&OJf!_BVo?k36LKpm9^DM>mud}Vcvv0%ZEt~sEUv_V7+px8BLwonVef=H10`_&Z_iydp z(A&|Lcacx_Ztm}JAttf``DTL-EmSIm3-xtv{p5yxM}OPq?mnT~)X~48ck9-EPY#AV zH+Oez=-ATVd!LE7bIXQ~ZJYc0P2hWb@@@Scny|ZL%clM=p}eQ9_ihd6JGwjiJ4|A_ z5qLv>bFWI}eH;4v+j^}!+(%nFwwWjGZS7qhQO#+9MPw>Za{aJx%ENBq(7mCpzaJbo zbZ>3H8ws)Z_jKepxAA>n*S-Dut)JY&*PUB?I`l;+@(IZU)ZV?d4_SdLolUraEbR)x zh2q)S*U@peL3*}otiPkXTVWkrJJne-6%2ar6$ZFa#JwH&Z2g3ar5&+AgGOl_kc9%k zmn?!@vT_|VC8#{y+{b!Xv2N|Xr_JcLQ{8NUMXp>!Mw1)*Hh-#PLx0=G?hc^ZS|_e?&yP}KYlOrz{JK>TiWh{nzpil5`d%8`Q;QGl{S@)8$c0Z zzNuqNM=uv4E|P-xZ|!gE-q6$54-@V9M2AyS`|jP?2XVG+GV%3vZ|+yL0<>?vr>CvA zV*`r@J5njrAs|q`Z^I`ygKb}T8=JCv$fby-&TsDP>2AAE1&lm`+B>%NZQg2xmc%LP z97(_}T15G_=ic5;Mw6YJx8$cQtz1r3wb;2;KSr7AFm@<%sIVKm+qT^8KR_hRz^y`~ z95%FfwQV-CvrH%~hMaRQ`nY}Ty;~qmBz~hn4y5qDp0;+AqPA{SAgcD`5Y7`OpR7AM z6&u>x+dKODR&3?g*tWnox-Ia^OlHmM)p)*Y&5gPV&dvJt&9~kX#A0ZO^%0{=n!Gb8 zQDM2ho{7t>y3A6NF2mJ>LvNKHO(kf@t~wgn6NHcT#ODN5Tekz8CgQcp5k-Bn^p#B^ z9V-znXjne+aJ-V9!1W`WVl*d3^ze8?at@VBjd`NcQXPG@R6|del61I~E)=LW7&v#) z*)X1>!ohmF;^h+*&TXZt&KS)|rR%Z*KTC%YjIzm6DM+;h@s}H_14`9wq&vP8r1<(i z+F1R+@a$KDVEE1;K1@}RG1-LY@zuT5RDBN5uEet>H7)xD<*Hfe1w@CKFUQGosdx}y zr^J(|V7Q$oc~KBgZ2+&g!0Tf)dw3Jg7~V{m3~!~1;ZC|}m^RL)Ep+j42UQN!su@%p z{&tL(R8Z}X*KsCELeYJI8qCu(}&VD38cLrAs*N$Blr-hdyPo5wpU}dbx%N!VQRX47S+~lgHApQom{%Qk}3|>Anw_8*`XxOI#f+Hhq~yt z>IB6PvE13(1o-SseHb!+YGH!Xb-7qKba6LyLRZGYYa?AOdi-_ZpMu}MQyHV&J@c_N;nuWYIw{0QYvtz1<>;e05Y z9xP>(GpTXePMrC^Hb@MIY#)mgFn~B+9aIco!#WLjK&A(@tl zi%Q$F3fhiz{)S3h2h#R2o3C>IZ(PS=f5I?O@_l)=mdF`k_UA4B=) zxHFMDppK59oF6XLL+VhK_a{n~DF0k9q>BZLBX83~6SRzqDsPA$8or9Y0b2-zs=b`< zTvc+AC|zKg9v)AJ1yvWsD7pB@rJnhy8&Ix-)U`B{WIZAN-E+Z{X*oT*-Y5jM$%VnS zl&#`2jx@c@bqc2ma*adYamWdqdJ;Bu7&i3;Y>DkDjAvm_L_3DL{tLo=(BZ)DH=yU* zX&C)Hv{cL(@S8ehm^qQi-_OdsCZg~9lI-NW3rVV=u|R7 zzP|w<)QyM!8D}m7%x^;UoQ&wXhOL5ink~>g)@kz?)lyOE!N|EBa)NGrHU+=EfOhUe zo%gr3u=CpRLC9F3>u3UT%t$c}c#o&+CRCn>N(UTs)RuzZz6|tS_ZxcVr|atp@LU*U z{pqkeABY}@jE|4MS(>QkFvydb3DZgy9h@JAS8EXbu?eqafezVrncojsC!o*LZ=G&H z-Nb1=qja)k7e#bZX>`&&fxOC9r(4F5N30XFc~=LWfDSsDp>)E!s11Kp>El|_$HgFL zUBC`dmPSyPnqUVzcj@%+M_bBmR2Zub8B57bq@Ve*9{8Ta{j0K%;E$Ov+eOqS*dDm7ar=tAgIo{8zQ0=HGJ*Si zhT^-~rfOkxL=WIO{~pa7T0_V8Xe)Me_$XFA4VIV&Bd$9mVND+EGN$vC<^MaRh2!V+ zRiZ5Qy!Dk$+hUXb2~LkL*8}4%u_sGm?9ozsZvpzRNTtJKd@%OaQX%$iDHnUH)EYZd zYK|Q)Wn)j2dScI%x?)e4>SO44#70W#BI>gP6Qt^fAtLY@uZ#W3c)A{CHN*8nPSr83 z!N)sSvwg&#-PB4wogrPGLOq>aLGx2AZ@P}8Us8l!ChkGIJV5BM-Rh}p1zFsAFibRPhUxvh9dZ6MeJ#y_{TbV# z;74M6I{zv7zIV^Ic(JOx3c){#Zkd*Oy#ZS0%jt)l<4D&y(!%K|(^gKzTcn-%26V!9 zn5BW!d1cc?Md+sa0=i+nXgxq5&_fG7TguWiN@uLE^qC1t?;S(E_r*Nx$k7k_1+1f1 zsoz+y^-51)9cMkI3lo9S({(7P95$+}vz~6=^zJ8hl?(pS)73wSt|m&!&Mf*Ct-;RS z*U;5pT0mF-DdZVPI>wRq^Xd=nOMtYZ{LX;Ah4CD8$vRZ^k(2+0;2VgK(-Y;*Vb7O8 zru|^Prv2djX@ibf7t`5pMr^kZwj08B)w`OqQ=LEc$Qyo#vum}9m z-k~2g{x4F#&`(nBF!SYS+@|sKP{pO%N3`!N7jqoU`@5wZ=4;+s?ijt0ippL|g%NFQ z4<6!jqU1$;2YsNOJBD`d8MJdxqn&#S?c5Qxb5Ek3J3J2EpbwzmAq%MMl{`_|Ap1w9 z?bZB=xE)k!F0EY5bqVX<=%ObjI~{ zB6fV_8fyAYmTdtw{Vrp(W6vF$M@_@ki0dlEc_rPf-r>_V5C`w}{2rXfyKlNCPnDoW zo{zweeqz17RN8@dBS`&K={VZQeLIw1ATMLA8(-#^kVh=vU!l!N#KuNg?~`d_ThQr^ z$E+Bk7JK-7}Ex#PD&%b0zwt-;cx>L%#8Gu2lM0eO2ynHV6Wk zqa60a0N(jsxWC3?mkpgQl~DHdk-^D*Zk|k@f40xBapKQTjo*15Uf?-b1g?Cs3x!7r z_i)3PPDb^E4y4Eb(+>X@usUD(+|=h62=B_qcjx0@h{$)#``2USf(T~}b*OVF17tT{ zg8Oj&eLWrFFQ)r&%}01U#>&FAn|s4sHuv`RhfR9)F8swXz3q}&cn(HkW5=e=Tf$o# z-w!ymO+B!L(>zmr*Qp_~zObdE*V2M%o|*FTfu^RL!nzOKcE@$$jVo?gk)iir26WSw zdnq;(7l{iPG(S$z_pA-$)*f-1K5(2+gr_;;;56M4r;Db*mja0tJ4!_;;v{K{V0;-T z^!lbb;xuC#l<8RmQ;#@2oYNg~)aw4R1V9z^Ak_&CO48pATs53tfVDzDDs+6$$4BvF zK4%55Q7F;ff+t0F2ESkMI>Gaj6~n-%i}y=HKO`!u6#8R=?-doz7W^*-KOibPfqOn) z!EZYL-zkIt6L3yfPbDsJ$cZWt598YeI4EzCR|21o|Mg|?o6F$8S_bbegMYRR{(EKc z!)5RnfGc|t6GG#xj=w2GkB+9IuNTuQ3jJBZPjO{}V~^lT=t=35OEC_ktEGY$1iwq{ z=w{%CMu*UUb7k$8?x}k*p9Zz2%Bkji+yB*?uyHgw{N1>xhQ!z> zaM%jHOW%{=X}P6SQeIT?iSVC@;t~F@36A2zhkEDWi`QLz9%FpGA-GhtHr~}zf5V9b zm)4~G>!Wxi-a*0VGJPanLoROl9}(P_^QenkIgbhM%lU}38!Dj@IS)kfh@8g+_v6h9 zW5I2_YX$e?9Th+kM&dmd#Ut@%#WMVO*Sffkw^{Hh@d^$HtCKHBqj)6V=LMHjwW)JY z2yi*`iR9Nw7q|KKlFMhF;q#h{PuiP@oA&h$7oTVFGcH~oDzPv=A-MD}Yibw2um*7`v1~$Dzf~)$9NU9;CQ!c%gbAfd27ic~f&j`-%TR1HL)h=%7vo0S? zzgF<8JwDAYZuzVi+)r1l;PUQn`R82R^63^l^y2Liyw=0}UEK27F8D%^ey59D`XRx6 z`5$p{OMgIcU(c2D3MKMe`fY;y@)TU$((e-7mnS0{T*T>$*js%RkJwvQaNn*5UEId| zh~R#@4wk`3UEK0HCb(}uV=iv#Uld&QCU-<9UEI>YE_jOd5V7+&T-?&%D(?Xbi0Ey7 z6p!fbF2Q}hjk>tye@bv)Z>L?{(!Vaaub($u+|r*FJXFb@EZ65;+|pOe`;D)k8W*?p zgMv$XE&hh!i#gti-rkJj5xt#r`Ph1Ft#k~1{yl>Gdh2&_D^EdiUvE2I+|myT?(1!j zi(C4Gg8Ot!$ z>acjd;J*H|E^g^t1o!pd>hibcH|Nq@K0Si_?ZP&}eLd`Sam!~^a9{uDT>h4R_8hH% zP@k-vm``bPv`;?Wmf+|oBlLVf7S9PT zW?}Jy;G%Ae7X=rwEIuZQL`HHW`p#@GJCVOP>{7^(Q0rIl)!C zAHfTPi^43QqTs6Dj?j+@eytbpgy5>aiqO-FzWeUMmj^ia_v&+(x$5ocZd;)~1XzL3 zPTFY2#=bsU@k<|US+`)MPHsMwU>B;xfihJ@M8}Hq;0*}_L2ELU! za2zXF)YA%hSMGt&f>ywvz5<_z^lsjGZ+}Ohmiedp8zM9(Ro+W2udG~6NQRpSVlUwo8sjy6>2arw`5##>H(RC}D=Sy>u@8_?O`+^L(e_S0XHA z>w%#d(NugUe#w7@@gGAZ=0WcRhO*1yougUgH|aDFO?ZQ^!vn+1(C|5D((f^5T}O}G za5J6$d!zy?2y@myzvKGxw*s3se(SjaLFDjhJMoOMRS_D#%t`nI9&X|{eD1|_zRvh` zQbBm;XJs|v??<@rmr7f`;B=*g_wB`mGxU7#saQSY8E<@qqHs22)}fK#lF zk}Uk1mp~U2n3tjFu$ehPd~bw})#)p!uwbz1&p*xB_f(GDcawh9)Q3Rq^Z$@BOV1!g z!t!I8#^T(hlpo`)a0xAczlPTjrW+IGC)166vih5zDp9$;Gzyczy0|6ezGv>F#NYp2wUXL z<&kyZr@vgAx=omJpCx+u@t12;Ys4Tw6%CAQKRj1Y{C#Bi=8dXVz0miNH>_H@3X2us zc>8TCJ}6X2v`wv|IplxmsJ}}X80T5E=vADq!+clsZDWXPSIv(dEMQ=8IFFh?Srhww zo*7qC@?~^Esz5(J_G5fm`L$(Med=rr>TF>f2$`SAFua~i{Uc)=N994^GX zVt?MMY40;KADihozUgR9pMYt3o@tLa&oqm9qeR09|1joDKB>O9AX?kWb4+uXTbjXq z(k^^o(TcgKEtrd1k2$7l4&-PNG4kBKoSwH{$kO$cO{9xiN~4gMO7l{cv1jnT3gQ3l zNV}dp$>(%95nL|wKaCFXO;>VB%|pS0*ytA*#zwwKaIRd1Z+dDAn31RS7GmybE=a^? zrqUVxT?Eg6)N@L+LArh-VEpe(ci=VnVSM|*a~qFgPUth^NC)PGK7~1vg`6M7hP zLZ85#(8=!~cupvXfp_=N+X-j#fWs9q_r1%T``(QC)R@UJp2hrWqJiO3DW1BDM)2KR z7WLA;FJ~~Px(@cV4Yt%n_@)JOty?i4y9INx>oHHh2H#SpVN*$Ztd!h~x&Jl)N=s{+ z=uXNds|qN`!J6H7(#fhtN7vD>5Mi$Af5+F3@780PM>jx=P!HFJ3D#?*Hx{7mHq)7B%O zBlJWgUpD;zXX&pmXa1aSe2<}Qt5oVt)n<+(PmhZZ9^HiRj#L?_%CM1SG41Ku&#|1# zg7+S(3o?gvzU#P|7P?TpIInB#*2%o$ot^xRA@n$&K8m@^d`?aT(CIkxWE^@Ohh8y9 zAM=4R2ORlE!$xgqgtnQOKdX{(o2+Rj!pk6pZuoo2BP2 z=d^tt7|Y3W55W#vJv(SYzVdwRX5=kqR1N2l*TxR&kk29PpbIvTRr!9Tl!3j}z%J55 z1xlY8qa^aPw&n*a@9*HeN7-6*;7;U!%kKB%dl3FM@+0^THb!ye|GM4j0`fmOCwLe1 z$_Uw%V< zoAl)8IKFFWV-?afzARXWJp72{q2@*Onyv%uizusO@!GmOB@bWgoCA3|9OhF8&=KmWhkv_aO})tB4B9=h9cgelX4R^i}wtQOEn* z=_-`}N_qux4uHoir&+&*@3c_2gO~nRP=E7izTMoJ2Orq+F|<{$;CdpSlyafx@^3`A z_WT*hSV?&$kD)iZH1z0EHDnVzPA|`V3*x+xzXZB!P7FYnjpz8xbGoyM2lD(Q`qpX8 zw8!r~Tpu9b5Iuw@#h>WEpVsy`a?Yha4*H!4YrbdJ^wWLg!nRwl>frZm3Q?|_p{oqa zT^-7uvhTeG`UvDn7qV!-ZwF6q)3Ru1_?u7NX4S+#B6z596%NldEw@RP_(mc6EE{kg z@vE5MpANYj=6)Z#9`zOD)f5agsC?1i1R_4rns1u3!3WhdZkzSDnQ7F?=}f4~C83SJ zLBi^CT8yLpMIMiU{^9XOL2!6M5IhZ=`#kea1;NNge2w!goEPJ~fJQ!t_Tdn|7slEE z`@YC++Lg5biw(&@uj7Dk25RxWKqe8q#qn|Z=CuRrg5WKV6OpO%&DZ=Ky5;W)gDh+a zI!AdujPm*f%BwD`En-jH-!NfN|Ii6#_kpe}l)gj<1;VNU7v|~fnCrl|6YdP^>*>l9 z%Ae99+Ao|p<p1S zgOg<{-mtueJD*%0H^P=1^UWxi{JaJAK)L>Bor=407q<`9$ZP&CTFc1x(+D~Fd-rA~ zPZoS?*v??r2xnypMHbE{Q-@}3zL@WSA1y`sBJErz9NynW|CD)8)+Jff9_Kke=Ff3O zXsbRk)i#i4$h-O5dyFsHSYR8?lUN#dziOh zSsFn<<@gOZ3ChGYaz$#Ki`&A!3fx3R5O5;f9f?zJ5 zRi*enFQjMi4fF`g1s_ODo#x5!cps!t+c(-Q{??M^;CDFFp4B6r3d`hz+ray>YlGCs zsZoXDcRMbt{4FNi-bU0nY-v3=jmrTaZ1;TT`*&jhq1R^Dp?zi@ahrV|u31mqZZF~X8@ghhar=!gKczgw zR;Y3}he@|UhGzWgbKJ+a`Fkbw%k4Y2?VL}%P7~}9H~Txeedo5F+jaB@rfJ*vcgB%k zE(0o^PCq3K)LJyq$!5@)yybNwtli<6wnfv|Bto4s{!edl`^0t6$mjmyEiNnUi#vY9 zcW@o0=koB1dY+}fduvjT?{Xd}-loq)_;#DvPSks3x%P(J8Lp3YyE9r^#N`z4+LtMN z9YS6vr)_suCl>C;`+%|sZg;r8#(EqxQ<-2fY|+RZ z2KW{qlti4K)rm0Dry}})lur36JQHY_(56Cmz5bT*OYyhxoSr(gOJ?nX45z73pw;4k z!n!+1*D9pzqh;Gu)+MU%-B(B&*pbG!V}m#d*4 z$b|kM_XFH@ceu|nn`SDTT@cI=Usww3TyUA^c=?#Dr%#p$qk#{hKRF%0i8%8cg?_Tr z=!d^=XZ`T^?VR_`&=Y^#&fmZDckl48;rVDO7<#OSzqP(w*~0|&Qc?LwdX!yYji1Cq zeBaxc>Be)G?!#Db2)xja-LQK$t=_#f*&lG5Uz=PPEKLr;ah0uJRQ!C9F5-P4_K8(F zDqPugxbOat(wO3#fjy;%2zIwFnF(&}WcykYskhlyupSfY&K%0mq`mMuKOAo+al;{H zFF`W3sAf1=l$;+dDKycnWRKDv))t`Ubw3D}hlhh0^{MxDZjUNy;qKa@s-U*eLQ9hC z(GSELD3m$0sD3!0;FY>smA;3;AM%Z2^{CRMeE%0~xQ z{@~r<{NK&%e(+Z|HQh9mmS+x6Nk5mD>_9;O7i^_=FMH}I?PNGoUefi2;4g5`Iv&Tl zRH{n-t=uEfwCm|GFN8xMV@ArXJHz#aF5|_0+)f5qACAj9p+44qNL|K1Ohq+(z-wW& zcy`zfd&|P!>S2o+*jycKE`&YSz#fyZy;j7L9vZ_sAq7ew#jn6V)F+_lJ>>qY6FN`7|X#{d0pNawGhwtSX_+Fkyem#YExg#ihPogXzMp=FWeQn);8sZt1E>7-mnCXV|%uvL~N zYTw)!RYKtp#%N|#Qd-H+>8LGK1e}hO==X9u{)dFW9_dqQgflUr$~L!4;UVr*b3BU* zqqxr;Qe_4A9FEhsNcoVbZ+CdT7Os!Ey&+nOw7lnKZihIJ(nCe!cQ$T+jP5JZuC#z= zHgMF%s?FeZusyKOrnV7US4{ImmJ@WWKklda?K;Y$s@K^@s+G*Vjuf|dS}tD}mV+^j z&-|W|4?I-9>GJ#p!fN~Gwp%?bC|S`yPJL(e?U!|6+F{no6;>wp<>-7@GQo~b{Lnwz zkcH6EM_*oC2vClbE0~7!&d|8F6>U$ou2@f;Z$qemd_Oe5<7gjrBi4oEb&8&Vj2PR2 ztnis)+=1&SuA81j9%7xIQIxS_5o0-H^v7Jz3KMjPdSB&t#}T&O(^`ikQa5t@7@z@Z z%G}KFZpDXs6KE^bH3ifw`%3q#vRVjc)8)HMv42@rNtYkmfwljd4*&4}rD#VpiTG{` z=A`0h*WbUWepQe@FczfGpbt9)fA-*8bn%(*u`Ka9^lDWmxEgI`up4cy>Wfi;GENIo z_Dwr97U%bk$u^UMHOlU}O}iXzrtYi6&n~{7*Rfe1zNE%CYKK;#FFO-`w0Np^@O$v1 zuM1Wu;;0Me9J(FhQBN*rIk~)YT)Hl~BTuw?)1ouIs2+}AzYuh#QUd8{zJK|F6ToJs zR5>fM{f?lH{3v|C;as+3ldpUYopN5VZt;Hnlli|XnDkZRT{8YP*a4?=2IZ6Sv$x#O zx|%P#$|UB!#Te_S>G0P+y*%>*)`Zb*L>m1+q;+@pO026oxG1O{>P5Y{jVtG^VItT-~TS|Id7O}DYk0W1Et*jro%Vh4}T;2N*_TT zq2EbngFgtNXRV)SOW|DBh0)JD)=Q*c(899F;g?t4kLI=WFz!+hn=iQSe;vw*mSuDw z+eQW6zkx}erRxc<*C*@!NsOcP>njtVY1g>^N)Hyb9uc>yZ{Sa69fC&HMQm?e_fUpc zN~nNN!?<~`7(;o_c>N77-@3od^|S8x*CQUbJx-@i&we~(U&90VnLgB`c^*6Bej;ND zx_OtTO?8?vTYkrj_SyB=0{byYzvCB(OxuV!Z9eif>j<)r`{OuS=UM_hm9ke)#= zJzRg~R6o6O*IuM!h@OSt?HTypo`&D;DU_Wf=tCVwJ;wd}(b6Y44SONT1>Sp19RWhx zBF*Z<9-q+9qT>LjUzbw8n_J+!G5zvM-%ZN;Zn%%nJTd|NAZ~quxE2n-m(zX# zIg5S|(T#XN#r&P*NC5vI?ib>oZ2|s;Oc7(hsGH&6VY`UYQ;RWw0rl|0VLy#&j9VK! zK%QAU;OlfU7a$MeA3O&C;4|cJjnvCjBiUyqS<7_D0)Ki^O0 zKLtD<$+Cv1ANiRX+o|*XL>%X&pGfBq`-xti#!nQZSt;!&nt-2Z(w0uM9}PBX`lKA6 zUeh~uUO$n}d#&FX-d6@9`kk(R;_}R81ARgGE%dt(>Id{m^!pH(UG7J&Quep+%NSip z+UKC(q5E#EHLWkLKc#E<7MUm3#!8}HkGp!z1(;(3JALeP-2dZx5N++}CV7l}4)Kp) zn+#~yP=J1ER_dv#?>t;rajeXr$Ims7L?`Dd^Jd&&{0`1*Q6Vm*!QeyV{O-!>VJ_3R zM?5aVehKZj;5Nv#7d$s$0hiakMTF*lZuxN%_7_gdsK-mV-^TU3NjtY?$nO=?y|Y{o zeVF%_N%}2+Cn-E(I=Wd9OlGeZPXCsboVJ6LfUM-#@En8*>&e~X5BfK;Y3dQ zO@)BRJvh!u{eFI&*ZgL^uzp$p{Qgs}A5jC_VBK)qaIN|YOC{g9k8lRM)Eg zvHrD=D}@K^8Q0JuzvoQAuZMLi>sSh`pEk4fFZ!z7-|TtTPrK0iXeDR;u0kv_M_fhc zt{+wa_AdOcQP22~`@9E;``i-R3-7rTKh*sbhIiA~GBx~9$=_XnEi;9G+~FTidG6|G zbjtG!g`es0pBlfLe-}#sH1aw8b5rDV^*c5G3(5CWr|)ER{konh^8K{=7bqv!Rx>nRFd}Q%s`VeP6%z9R9an1A@^o00G$eBlY7_Uz#m`)0xHo+@rXndDG z(I*5q>m2SE`~jRfUUL{Ze+K~b&(73O`h}n zGA8~GXO^Og{uvYc(P`=VtBk3~&u-mI`QplpB95;L{o^kI7+po5y;=tUw=y_?yD}Z0 zYs=s_mBDW-gWp{S-%$oHmcgGYga3IM9Gjv{o34K@ga4omJ`?snoqnz=gD)$CHvs2v z0biFQyiGD~t>8H^#Zd6|f}3@JOnJ?h;lH&E{t4mJDyF+%_+zM6$zzsOeI8CGK7OkV zpW!k%uNyj@e*UZs{;e|jcgx^$RFTv1=Wmu+pC|aECLAy76D<^cZpQq_s^ojnf;Pn_q3b}%sr$x+O%!QEbZJ!FM%GSMI~i_JyRUBE($~@3zX4l7g3IJ4hP>&e-sDhi zUC5-7dx?)90mWai7ismHu=XyxBjS zEm!0VZvKi=cG!HoTiYrz6brLH?sS{oVo?-qZ7Q-&8i>EkhpRX7*3T-ndhC-c{+CZjoEFB`?(5jumHli(X{^&uM2~CB-xw9e2wPu#<&T=U}vS zvS@Y_U&UzposlE^`%XutH%abR1v?TQB;YNIfp9#goIn{IMc7VHFTxwk+(@*#5x0j)x5ZuUb`Z=#h zama7*GlCoWL%Dxb&XNu*Cz=p-2>rZJ=uE#r=&k&9LNCpx<&$x7OW#t4zj?2c=G4-6 z3B5F%mVdX4TlyivMQ%&K-^DHcnBWqxrLUKMjnT7tZ^}k-=-J@Sg8O=IadE3p%&Jg_ zujey@*XqYs9=v?1LvSnqY{3_L^wlnI=}muUkw>2qdciGyv*5m*ErO>!K3!$#yIp$A ze^77%YEbqBJowFrZx59&Zt0VPFVexR-s)W3(%&k$0G58e zi(C3u!9`q~-n#_9){D2>#VwznGJJ|NGy{__#$R$EiX&ePeo%0cr&@=`mqacuZ!1_Q zxC}nw;iX-+6&{?dBer$8T^dkv$Y^Ly>GhwZTnI!{vD%FBfnXR-N%hT$mqx1 z-zt0*4*eLsJBml-?{VX`dh2)TZMwF(^j4qS1^3fC=+aw#4!OA1!(PFCJwM{oTRDp! zUL%Uz@8VX@11^7?u7iU6@{f9a4F9nxAJiMh4|gJpL;nVUF^WU~#%|3z>yqAi27g`X z#S>=j$E1^o$32y1lI^{lnSccxLJAR$Vzd`5)xBOcKH~D4kcD;*R{kIA( z#lZ6E5!~;$^t*hjP5)=Ri_bH7L2x-){+Ot(4pTpbBIq8${eFV+oBI8h{VpF{?;R9; ziRNqbWz@y3JY#|{_2{d`FJ{WSkrR_h)gknj&oaT6d3?;e=7L*#v#z<%->fh0>nAV# z{r+KB89BEJZtTI-KLr<`XYieZv;Q84mGg*8Uv21*y13+rv5kUnj3oa9x~hIW6MRgha3JiE`M8Jg&w`(pYm`c zf1QUL`i$Uyy;twjS2s&V)KG>#>(b9N^vy0_ZN?wgyZAhV=LBEDf=BYJD~d<*tJ~#M z9ZG_GT-=t^LBX&0_zy+#2>(4UA1nVOE^g&N=;BtMQNc4>K3hK=ap|p`V=lcd7caT= z)nuaxH*>XQ7nybX zS9+}n5`82qEY&psazKZ!o?I(&y^0!-XlU`$o{Vs0vcc+Wn{5AUn2p_A5qR{*G z^L`h%={n%@w|vaH{(e5bB=mw?KBrthR?Z0*xBM%m0=U7`TQZ7A^j0mnueSv*ZuQpU z;?{1>egZ~s#%{ZXezj*0{Vs0PyHjv6glZiOv+Z2m+R23AM*dI&yyoIoKNC{_`TBp& z#jQMN1ULLmy3Pu2+6&V^H2VMuKF{E0$W!WT%fDWRLJc3&Z)|XJ+n>w|F40>)>jkg# z^qhBbOW*C{Vog}v%Ec}HPQkD9_?!I%1h@42h2EsgwEG7Z;`2EZi z9v{OK?9Qce?b| zrd=3xaob*){WL_~R?bn6-q_WVGVz`i{1;gNk$%*vC?4q#U=cTUh#qV|`85}}{eg2X zULES-JlGxOW82?QaHCJ-pU=DaJcD-$F5O(Khl1eCbu`iq#msUSxAaB98<;+#hXYYO zqKAWm`+7Ly;#LnYxwzHCDHpeTI3u{qmq>s9O&7QFCnSZxsM9;yjtFk_Y3yNvi(C85 z2=3cwz2JU1ZE$fbPgZchyz~n$a$5RrW#|V5_w#X=i(5W>T|QRNV}ife%ij}GJd(dJ zdVI|L!b>i0^S2;9Q9r+S3U2go#uxUu_&kH}6*ep+C?3h*bAl^-h?K8t zna?D+<=-s$`#t_GQ9Qzbm&-@22H#n^xaGf1=1Vnt{0mV$!hfgWe*Lq{#jSlFbMfks zn3) z-_tH`^L@cpT7kYip^IC24hrtq4@U*}>yr~MZtH;;1^4TLQ-b^b^VbCT>$f*u+}c%2 zUf_&8razEzaobNgD)^NCzu>>1)nv=*n}YlOii}K@5PB<5whVqkaKF5~=;D^o>wtKiKZ|6CN0@XrgrTIEcV)q;!sR?Y>2f5_ug=i-*nvNC*D3*O+RtHH%BpFzPt%=D4^c_@lU^uI@Nqkq#c zdc?(T{qv%W+xqsTi(5UsF1RVz#t-m@i(5ay8Nn~n>9y%fgc|Vc86$vS4=gA{U+3bM ze@1ZM53tt7Eq$xtCS4@QT`oS);5or(Xu$H>Cb(2jwmfbZ-0(l8!_iI`x8tXSf>&xf z%YTncZ^z>v5nPIajrV|yTRsN`_wD?c;O{1NSUxAp(7))?TmGj6_w)C47q|3h%J3(d znB&WtEQ41Iek-ZN%8v!>)FHTycXb&)4T78eGVf(s7q{y(Szbe$I5PuH0;{F4i{z-#o$>c7Utt(+Ob zZ}jL_ySSy#3NH1#<=^b$mcB=Dzy9Cm;+B59;J&>T1P`>Fw%qM>ajUmM!F|0wBDgRA z2^Y8WoD%#dPd{(ExTQZUxG(=~nSkc|2dV}4>FZp2%ReJ{;OU{>#jPG11o!pOD)=uk zpGdowi{g=XEibq!7p7h7c5&OT?QwC_tk7N;x8-P5@OOE7KH}n54<`gSdNB3*i!N^K z^OJ)6^?6-NM|hhTZ^p%KysHHlJy`j(g8S{xS{Ju`n#=HM72L0{?s9Rfx<|9}`^JVTAvf zOFz%>dEUbfpOY>hxx>6xx$^aJ*2OJ-b4u{_9{-6b9^wCn;J*B41iyp%=xyrM#aS1( z@t$+}*z~GE_#^eXoQOhsU~p5LGT|Cr$No@?<5!QbogF^bQ6cqk#? z@8RYC34N1?7X)AH;YGo3_V6*mZ}IR6!Il5VnhS{Hny}fU4+a0Ahi3)4c?};+_$ujt< zGWbLp{Pi;UnKJm&oD!pQRsH%{KaUz9*%s+1CEc z@G;+$`g~f-(6^Ssa~^K&|9pFs_jYu*t@zn&P~N*W-`3x@0-xHiTv1Oe6laamil6J| z2Z-f9+L2(yeOGx-Yv1eX*&HUx9AXN4{p}~O#J-#TY*g%|L9U3-v8^< zc1n23W=n3uZ?lNLF!38cpOWxW{48}w9Gsjn(ZkRGd+~6(^w)h{hpOj9-tC7ayf3c_XV~(+mqhjGgb6PKGoP#Q^X0z? zm~Z>c;FLJ-@AC}CkAF^?@Hxr2|AU!D4nMrwyIn0Kp|)-hFSK|2noK4Ws^jhN-99>3 z3xKRFWYuLB`FZKIYbonJN*>0V;=_5~w}kiP;Pv*?g#r|<_fFvTmDL)$VK%73e#)i4 z3mUT6{PtS!v^n6Hs54S86u7|ls7qhL6s`0gOtgd)(mY!=onW_nC(O0o>B zhA7R_BwSTWtMj?_AlZy z-={-T`x+Vj^WH^26q&W|r{8CX!)tvKO-C0^PZ4V*H+yR&^K(v**)xdk$k($bGFWlGPVKAmWQpynH5fRTqQXJDufxz7_D>C7eoFEqOLJd7jQvlvzN)cS zbpd;YXj??Ra|m_OV<^{ZpB(u853R0kj`e0AmT}x{|PXC5|K`XI; z>{XNs-i#GcpTrv|XiwD%pJm_yEY(Tz$LMT4)r~XngR%XJIQ1az>#E`n+d;ef&UmVT zXWQ^Bpo&z`IER7;{MO8&0r1#Hb09-vqyxV$s(9>U_}xd9BcGy~Bfm~FM$%`p!4A5- zllPUZg4Kptiy!-~rGhG6oe^j3O9E3kw1t9^tx6_JUQF|lM|>Q|o>nW-b>Ka*Ufy&G zy&KC7{t!)(UUQwx5$~(I1ZCn)Sr1>+|3J}yzw~bGq5i|pTizd}uo2B;>sJP;A)MEQ zL24LhEYF?VgEN<%JH8a4E-3K+9E5eeRr$O#2p+>8DXLE3@(=sK{sqrs|AJ%Vuo3K` z^)&X-dJ6T$5!4q?Vr}=ya>ZpTCu_=|QR{xw2$yp%%S$Nn1upN%i!Us|-ZWY0yte)| zD#hAUwV45Gx)S%v52$hlc>>-yU^dObekyV7={!@}PXapQecM>B1=ycpHU+y`FG-rQ z+l1jdrnYY6Cz9K&G0w8{elWa`jbDzqT=0G;F_lkTmgcFwrO#KE-cC9Cb6bw8U;Y{u zq#Vud40!(r>;s_6t}RdVP@V#mr}<^e6PF`Xrno$DIWc95%hRPOGkKa1`_*OU3bj{Q zW1j0QE<0yS8t1)w`TksK?a;rK3a|%tjJ#8uFlEw|n~)L>b(BE)PM|$Vz)lhs*^$5<}K=&Jv<$k2$(~t-4c=GoU{%2W^zl3n@;=Bsw_Ylr^d}&UK z%d&0*u{T12>+#{X%98qkV+2P13fbOmZ1*ld{Q{m_?ot>UYi;-h+H; zas+Jx*IV3{+;_SX`wB6gd#w@mH>`vWs3Ru*PV9-Mjzox42}f4l>OTiQOsf4y92NR3_&fufHPvQl!16I`su?~;&#OH?2Co-fTs@Z0 zpy2A|GNR`_Q9PpOM+EoveA>m+M*g#c`+5!~L4sTQdcj4(R?nwIa9_`-UEK1yOA3-7 zZ^6Ya{fmMdeH!^+a&en4rv&%&&lH(mbKCck(yTRx0E7(5}kpO0p( zCM94bAM1r);gNi75M1SZWKK}l#jTvpf~#^Dp}*C|ExnfB$}hwM(HBR>fVTWN#D1USo5;mxQt?KRoyP?%CYeu08eP&&5~Y zBdr?pzmQeZWKj+-gO9hEtcVqgiP%713t1?l$6SQ>pcuz5fnNoFGw_2ivsj7WMflCa z?_&IB<97-6tNUJQt!jSQkEZ#I;1jCGOsRBBszlFas;Pb1^|EhqMQq2Ax!#tXLCcf3 z(9tBn$vi%^JaY>zuXzwGHX;6zA?6*UjgSG)!UvJhn;^&IL)g0%I^P6Y9v>>fADF=P zrF38@q?xG->MAC2Jp<<|oM+-(jdLZ=^Krfi=Ng=6;k*Fni*df19vzxZ9Yy$-h63u8 zrt|~QMPvTorlgJN8+f0uhz%4uE$L)|;M-5l#$L~y_5|gsw}o-o8S5eooR<@ z7@{4ZV}6Mg?{Up?B_jMx8u)C&^L0GdxSiu| zui(8_(|gDCo|MH2qQL-dONi?8;qlqDXz}y6&2M14|K&Hnxn=>~NzYvqr%;U}!G8wd z`X%fi97SDt;NIT%jn1bX_$?ZJPWi@5rEe}?O@F1T;u!TUE>YjA%OLN?)Hp)4ZsZbL zKZ5-zg9JUgX?Zv=SWP4F7spfSmM}p52*2`0Db^p+XNI_J#^{CAB{Y(Zp?t!&b|GAT zN%kA`!xGJdeFyKNKUcOzv>CMgdm;7x(nvMaLm%VFgA49AJOrP%pFZ}tl}htd|D*I* z^EsWImMrzHd6E5VNYl4)Cdw7l$qCrlXCd2;AuVH5@m%S%h`%u(BHfqJ1nP^4;$`^F z!7oX#6zAexh4XxzFURi+{7|aq)BwYl+0fN1#h`iy#cx`>oo;$=`)oX~1~!jgD_%)| zU%ZN5EnY+4KEQUpfWCc{wKd%s9p`6~$3F|m^RS41&=VN9lCikKB0{AGRzUavm3AaU zoWn4YV%tY61K%$E#`wkYgRgU>0zXIu->n)S8o3DPS@;p{f4rWuH39A0m(F4@RqSP6 zDq(C3WkesZ6_78f6|}Q{Rwhp|`c58us>Xg)`e1cB3}ZZwa0?wr{vJ;)A6yuuYl`s% zeJ!=5ZY|145qM(?RyRPXGcktK`J>VYpxbtgUyZ4JPuH_e672J0#4#J=VC}GJ0jvFQ%bRBgCAvBD`=x!UACx|vyb^83o26Tm6QxH}-^2JA zWQ5ezawE;K1XY$WPQ8 z;h{>@7j^Xbz9fz8L&b$XYms$0un#uH&wg$Dwwjq}Up7(woH))KslH0iSWtgC>O^j5 zmt(Bz_(bFO0<5DJG+C}MGtbfT%wu5rTp>oE$@8Ac-z|+*mrAcfcibPK{!cs4ho(HAszf)uyDw~JN_h8qF7iCHa@7s1-@WF>`uDuQ zv1#qix7e8ellt^o{^|B9)OdwWUi2b9<;`6`jjOl4D5b%zi^zExCw@b84@TJcZH`vC zs1@AYzb-g`XUz0j3DPY1hXo%LTsqj46C9O{I?!yWV;lZ5A2TnvMexrFZsxCM1>Y}t z7dMkQOiG@?HS^i#;eR1Gx>)MS>l6Jw&TQZQ@s9wQ&l#bAUF1baeOmfiz?J+7&1t7F ztQ9;bSvetm)(D_vPH>;%Uv5s7vge zeTPv!n0-1F9_26eGc*HJeURCYLvV4;Vx2>m-s0;kH3MJHZ7y!*H2Wzm(7~)e_Xxe< zmR^(D`bTn`D3k}{QnGkf@NzzA8S}981)-NZ%Hl=A*%yVw;$!NT>mqend_r(>3t1dh zoH|6o77qm%MOr*7xU$o9F*?bG1_leQ;96 zUbS}cH!D|TVpryY-xjfcxJk(x0y(#cp=3qVY-b#gVJGFA77H%bfrQ4%^YNPpe*DYu zfO)>t@GB7(vh_erBbts%;;++p_OBrl^C;_Uuaod5orZx4Z}4?^V0alCK4&HTnD2I+lvWj81lWCsDacuE8&mIL#_|G4`<{z>EdjfVtc^M zdh>U95qh_3%zV1=6O!=V;1xam@Z9afG>pw#Hod)h_3y4oV|w;`{hG-8QJPR@HwGV020om6_+iYv*y!9@%;;?( zdZ@s@WKQ4vXd!Zt=iBa(G;XwMOe2jP2m3nWG?Y(=6r_hHC|wl4@7^L(7GR!ww&pH; zZ-8$Ukl&5l+267}83gGJbdklcxe%~l1vUbkxSgwY^c}mZmel{>s9%zuGpR+iA0PNp zDPIl03Vc<`&L5Xrkk(4{SBi*eU;uoVU9aN%D&|HXD?2wj3%}P)u^;y35-s|J<;@QU z%=cB+Wi}W5ot!ysvGb(uFG|@3oUWIdzODe@kk-4=Gwaj%<(XF<<}dTN4E${af6u`A z5W>$+>_gpK(0=m+WB9gVLi^5}3I5A?>fLHQ0zResFa}>8WX-})rss;MQL>h^zpj|& zIf%$FGe8qF2b7(%eWr`h z9qjFM@WH}|Ur5*S+|erdYiA&Txt_iSwz4zN;}WnHlq*$_q&|ajAB;mF-AtbZeTC3> zfWA?DnoXc*pY2ZAaF9Y>qH48EDZn=Ycc2-2czpSR-vN(efcdqZtn1}RJ4E*rTAyc- zU!&RJztHiy_#Oe}M9=9@C$qsjo7W%AXC9MzU6A;+P0(lnTN(>^+$CLLfBEyBrP89# z<>AiYmnmDdyrv!W4-`;jQ@7Iy%JI#M<7Xe;ek~?OEw6h3<3fabcP7&NU||M*t@`?K z59}=q9SvX%aYWT^jPV36SX5PdC<|Hgir*zP!1V(7HEzEaw#L5NgyP4#%@-=@0Uf^3 z2Y&6~hq|(mq(3cH$*T<8V-_}^gN$bWaY6Y|V|4qnccwGUY0g~Db#H`cG58ZT{}~p< zrq}CA)P(k~6Jrrsj5WNl3|(l|F8;9eLDi-OrX8)0Z-@OCIUJ8cm~dP+n9ui6 zE;u}z>!OKE35+tc0=&~TC})V9$Iw<_Y%!o_q@g{ZZk_eELcZf8VN+U()`>*mX4z~$W`HlX5QS###M6UOM2gh@xw2#bV4P?6>x{cGTbvIb~ z{vpL>!i+i1qIRWUmjvXVsnEYn-K=YEN4GnHO2zn+ho7_a0r^I(0Td>5J5 zkL))hW7DReci)E7oN>xjw9v*=l_WL_uM&TU-VItV^q%X72M2+G(P9s zflGlCN`3mM&~t0RM@EwPFA^0~0H@-U*PJKjP(%R`3xQ*ATH?|EpHQm#5+twz`(HCEE|JMGt?hQR{{aqWn zJ3i6T-6uF4;~Vsz#fG;|~87$lGQvoB7I=1z9Z0Xy))wr$OwR>C1Dst)M?v->a-(tj9>&$bH z_)=dKdbU#>*7Gpo;%WUDZ-$a@KK(HlxAdo?E zziy4<5&gU&%04-RzJT@IKzUJ%e`Y_as#^}E*GnqB3SBK%6`ud-EEtyaT5Rw0d ztP(~0yeHs$&Cjz#hE6Z(R>r&n+#^WrPj(BDo_eO%bsB9Ts?jCW&Qm;XvJ4a!JI=^ARhL= zR0hencn%}pwFABGio4bY&trr$;oNF1Juz(-Ykcr~Gy9nJ$_9TUJ_Y6DEf8@&CcSx(oDUp!Td*U~>$|Xi;TP8aLs>T> z9p*58q36bKO9XFmz7-Pm)*ya8kP$qcd^CB+yx5NnU7coMax~viufg&k*+euvo*pbH zza7!-TumUak}u<773+g_51%J|)X?z>@$o{}KS0{}c{#l@AAZhfpN7+Hb%^IiUgPuT zwQY>7It`C(T0zBXmNP>Ocf+4l9Z)h=P3hgNyZE10-CtXG7@UmHFAUh{#PMe+wfhG6 zZYqPO(_;@+(V{|CP$(qfGfA#mUcjm`Slc9^#4ycA)}^?Ht{BGr;^ErlS|YWk$<0&? zUkaVVoc%L#ta-s@25X+E?-$yal}d?}pT3KeJCKi)^JH1(msp1=vqt9U{%oqupqW;u z%9bPis0!(TeX=JEwvt(1*od+p45Nk{CfF~_``55b`2R5`!|R9b*u`a%uURfW^Wp2A z?SXZ_0CftNHP&qnJ+O!M%4@Q4nK$KMjSCbC#AS_rxRpWU>EOya^hWF>MO?oez@zw& zu_k?e^&I-A*jjb{&%k&c3buhn(0Hf)Ggdx-kr3_h&lZSGn#(y!^b}Sd{VS>Twe!kJcS3M{CL& z)ABbraoRW(P{$BH+#galzpMiCwGZ)nBDMGiN!xrAeG~ShY#!X%PBN;UIi~6pu1m}~ z6pugYvic;RVLSz8l+Z z8rJD_={I)9dgOA+_grt?B>v`dWz>{OE~{K7xolcFi(`;-cpSo_T+K~!f5C5uFs`r4 z(%I5F^ce~uMSBK0Z5mYC3aWo#F#ZPQeC5le#gwmdWy>#zoNmTUzG&SqXb9<{U6bvv z9>e84S**Tm;x>3_JUvuE-a!9*IcNAg4qhwoW|WyM(xUrtTxPDcWo9kP%m+_%A1!|N zILa8luS+h(m_pMKQS%Vp6z4H33@R0>YwKS}hEJ&apVt}-cYdku9-LXDR* zXS~PM>GQexHQZ>Q=g0;@#EIR)e%kOC;(wv%7aFs;&{{wj zdj3=J|4%yRa0&80VlLDpw!r4bxVdkQ7}9^lScDmKI3aR$iJZTLb5gFOr}enuF@X$f zH$D#P6XkJcd_wTMgdbN1Y78Nv2`BW4ia0YKR%pP`|B2wnS7^RZ_)EbnD>eP7KGExf z9~Jzp;4=|F^B)zTP>s>^}sL#kJdpGxYY;0@4dj*CJ`d4Jc?az3kF3{ zHK*TQJ_xiu_x5fwBN?5Wx8yf$!JvUz3rIruVI-ro4-@!1x9Z28y&WAMjS9Q5yKT$e z{sTn93}ksBBT$6HhW4(u&1Q&#Z6@_~Iu7_kG8e5~1Lh ze}mxvUw2m*VpSD|_uLtCsK{~B5-K~2*Df)|XbJ-nTts6YB8G&RAZYv>=0R{w3*Qv; zVW1&J43v7f_*2u1jfUcb)MfI)2Ooq&gof_mQ-RPJz68?k`}SUI%|6?EQi_t=FmulN z_S$Q$vwzM#_uG4~>$%{F>mQ8qNdMb{%faqzB#+yDjSHUMm(IcXF%{XxOR!HKkL*4z zxZ2fvuH^B>iuVXUKd7_&y_%O_r1H~w-1O)-vQ*EIj9*U?M*fe)c;x>c!BhXi75F5$ z**zk7Y8Oj+eCp=^$SyX>&*72Xs^F>Jt$Ez+9uPdWJ1!0Ax&FxRM2tsv>w>3tujFyF zdsXn%?sfrEJ$v%F>Cycbsh&)phrYu`{#Rl=@_&usz8^+&cnE&rlgxR@!8whsB=Y4T z<=pPPyx|&K$q$sspYKK9mi3jA3l&-2u7kKn1F8v96a^G9PArT9hB;}<|heon`D zI47V3%<7k&Uy*BmVWR`ndid5QSJlRQmgqmGaYU- zG@l(OM@jCv*_^jxIpX1yi^208d5md{tzpPRY>k7?ox~?m;7RrR!$Ytbvx!zhk*4~4Ma;2M|V>yPH4w!Gk+zosM*ZWlizJgmj1I|6n$qj%@ z3%Z;ul2fjVvhIbaJ4nES)QwQhTF~cZ3fi^6yz&dT{``|S7 z{h6=I|FP~fKS#TN`f}6{ucOahbze8@_-%#@_-%$s?BSR|zpSBO9z|UrLfwy{Z_+o` zJN@cIjFWO!cO!_6G=w-wgNTnb;687XOXs~*-6_m#fQ!W_U>}7I&(pz91GXEm)qt%A zY&Br30b32&YQR`_?p3+AK{cL|*9@kY7EHHhoBW{9;?!C!g8x$-PN zRFF@doA>;akm}Ph|KVgc-C&n>&J!*c*o*lC|y~zP{ieeEb#p z^m86`;$AR*=5+F!dY|u_YX2Eyj`|1Oi3a5#al>2b9Wbnc-ganR*HTwsw$v?~-QZrB zz103&b9hnH{rFM^^+(RXTpKEdd&<`Z_P_Y?U2!LxpP)YbQTOF)@U0Wi58&u$cm})O z-I@CW{+z=-o?E@pox$}r?5!x_-Z*z$M|`4sJ7dn=#$E#QzA%e@B0-+*&Gu&*&S~6g zoeq86#=+pb~i9Rq^8#&%abFKeW<^CD^Mcae!v&In0 z51@TV+=L%@<-Qu8cPG$ajw6oEw`UO(=llXUb+*f6Q|F%qwgh=yz@G)a#7&(~{h+_} za__}#mf1d<(;9~hcMb1)_a+b>h z$N;Bg zUbG{V|B4lHBmDu^*gy6S^tC*0oXn8m90y1yKN7A(9C$oB<!A;D9-p9(ID9~X0OB9EIt%7M#QG4p3y z_ z9d5(qcjs}F=UW1kRHVtD%;P3M+7aYa{Ri^6$zKv&I4;w#>-YsX`Rcr&U#J6<*Y)~> zoBX86r~Tw&9yj?bg3DK9(|q2h9O%>`Jk_K5KhKrwkhvbN5@mhy&E}71J0_)PH%56>@;r^Zm}WXnDQ=jmS}5CWMn& zDL)j0IG5@)^mW0ihJ=%g)$)4W zft*$x;AXL(_BSo33VA&@7!}3(bSbZMrF>4YOQ!c + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/src/hisocli/fat_io_lib/release/Configuration.txt b/src/hisocli/fat_io_lib/release/Configuration.txt new file mode 100644 index 0000000..9ec576e --- /dev/null +++ b/src/hisocli/fat_io_lib/release/Configuration.txt @@ -0,0 +1,53 @@ +File IO Lib Options +-=-=-=-=-=-=-=-=-=- + +See defines in fat_opts.h: + +FATFS_IS_LITTLE_ENDIAN [1/0] + Which endian is your system? Set to 1 for little endian, 0 for big endian. + +FATFS_MAX_LONG_FILENAME [260] + By default, 260 characters (max LFN length). Increase this to support greater path depths. + +FATFS_MAX_OPEN_FILES + The more files you wish to have concurrently open, the greater this number should be. + This increases the number of FL_FILE file structures in the library, each of these is around 1K in size (assuming 512 byte sectors). + +FAT_BUFFER_SECTORS + Minimum is 1, more increases performance. + This defines how many FAT sectors can be buffered per FAT_BUFFER entry. + +FAT_BUFFERS + Minimum is 1, more increases performance. + This defines how many FAT buffer entries are available. + Memory usage is FAT_BUFFERS * FAT_BUFFER_SECTORS * FAT_SECTOR_SIZE + +FATFS_INC_WRITE_SUPPORT + Support file write functionality. + +FAT_SECTOR_SIZE + Sector size used by buffers. Most likely to be 512 bytes (standard for ATA/IDE). + +FAT_PRINTF + A define that allows the File IO library to print to console/stdout. + Provide your own printf function if printf not available. + +FAT_CLUSTER_CACHE_ENTRIES + Size of cluster chain cache (can be undefined if not required). + Mem used = FAT_CLUSTER_CACHE_ENTRIES * 4 * 2 + Improves access speed considerably. + +FATFS_INC_LFN_SUPPORT [1/0] + Enable/Disable support for long filenames. + +FATFS_DIR_LIST_SUPPORT [1/0] + Include support for directory listing. + +FATFS_INC_TIME_DATE_SUPPORT [1/0] + Use time/date functions provided by time.h to update creation & modification timestamps. + +FATFS_INC_FORMAT_SUPPORT + Include support for formatting disks (FAT16 only). + +FAT_PRINTF_NOINC_STDIO + Disable use of printf & inclusion of stdio.h diff --git a/src/hisocli/fat_io_lib/release/History.txt b/src/hisocli/fat_io_lib/release/History.txt new file mode 100644 index 0000000..58958f4 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/History.txt @@ -0,0 +1,24 @@ +Revision History +-=-=-=-=-=-=-=-=- +v2.6.11 - Fix compilation with GCC on 64-bit machines +v2.6.10 - Added support for FAT32 format. +V2.6.9 - Added support for time & date handling. +V2.6.8 - Fixed error with FSINFO sector write. +V2.6.7 - Added fgets(). + Fixed C warnings, removed dependancy on some string.h functions. +V2.6.6 – Massive read + write performance improvements. +V2.6.5 – Bug fixes for big endian systems. +V2.6.4 – Further bug fixes and performance improvements for write operations. +V2.6.3 – Peformance improvements, FAT16 formatting support. Various bug fixes. +V2.6 - Basic support for FAT16 added (18-04-10). +V2.5 - Code cleaned up. Many bugs fixed. Thread safety functions added. +V2.x - Write support added as well as better stdio like API. +V1.0 - Rewrite of all code to enable multiple files to be opened and provides a + better file API. + Also better string matching, and generally better C code than origonal + version. +V0.1c - Fetch_ID_Max_LBA() function added to retrieve Drive infomation and stoping + the drive reads from addressing a sector that is out of range. +V0.1b - fopen(), fgetc(), fopenDIR() using new software stack for IDE and FAT32 + access. +V0.1a - First release (27/12/03); fopen(), fgetc() unbuffered reads. diff --git a/src/hisocli/fat_io_lib/release/License.txt b/src/hisocli/fat_io_lib/release/License.txt new file mode 100644 index 0000000..c7fb0cc --- /dev/null +++ b/src/hisocli/fat_io_lib/release/License.txt @@ -0,0 +1,10 @@ +FAT File IO Library License +-=-=-=-=-=-=-=-=-=-=-=-=-=- + +This versions license: GPL + +If you include GPL software in your project, you must release the source code of that project too. + +If you would like a version with a more permissive license for use in closed source commercial applications please contact me for details. + +Email: admin@ultra-embedded.com diff --git a/src/hisocli/fat_io_lib/release/Media Access API.txt b/src/hisocli/fat_io_lib/release/Media Access API.txt new file mode 100644 index 0000000..45eede0 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/Media Access API.txt @@ -0,0 +1,40 @@ +Media Access API +-=-=-=-=-=-=-=-=- + +int media_read(uint32 sector, uint8 *buffer, uint32 sector_count) + +Params: + Sector: 32-bit sector number + Buffer: Target buffer to read n sectors of data into. + Sector_count: Number of sectors to read. + +Return: + int, 1 = success, 0 = failure. + +Description: + Application/target specific disk/media read function. + Sector number (sectors are usually 512 byte pages) to read. + +Media Write API + +int media_write(uint32 sector, uint8 *buffer, uint32 sector_count) + +Params: + Sector: 32-bit sector number + Buffer: Target buffer to write n sectors of data from. + Sector_count: Number of sectors to write. + +Return: + int, 1 = success, 0 = failure. + +Description: + Application/target specific disk/media write function. + Sector number (sectors are usually 512 byte pages) to write to. + +File IO Library Linkage + Use the following API to attach the media IO functions to the File IO library. + + int fl_attach_media(fn_diskio_read rd, fn_diskio_write wr) + + + diff --git a/src/hisocli/fat_io_lib/release/example.c b/src/hisocli/fat_io_lib/release/example.c new file mode 100644 index 0000000..5d30e5b --- /dev/null +++ b/src/hisocli/fat_io_lib/release/example.c @@ -0,0 +1,87 @@ +#include +#include "fat_filelib.h" + +int media_init() +{ + // ... + return 1; +} + +int media_read(unsigned long sector, unsigned char *buffer, unsigned long sector_count) +{ + unsigned long i; + + for (i=0;i +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_string.h" +#include "fat_misc.h" + +//----------------------------------------------------------------------------- +// fatfs_init: Load FAT Parameters +//----------------------------------------------------------------------------- +int fatfs_init(struct fatfs *fs) +{ + uint8 num_of_fats; + uint16 reserved_sectors; + uint32 FATSz; + uint32 root_dir_sectors; + uint32 total_sectors; + uint32 data_sectors; + uint32 count_of_clusters; + uint8 valid_partition = 0; + + fs->currentsector.address = FAT32_INVALID_CLUSTER; + fs->currentsector.dirty = 0; + + fs->next_free_cluster = 0; // Invalid + + fatfs_fat_init(fs); + + // Make sure we have a read function (write function is optional) + if (!fs->disk_io.read_media) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // MBR: Sector 0 on the disk + // NOTE: Some removeable media does not have this. + + // Load MBR (LBA 0) into the 512 byte buffer + if (!fs->disk_io.read_media(0, fs->currentsector.sector, 1)) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Make Sure 0x55 and 0xAA are at end of sector + // (this should be the case regardless of the MBR or boot sector) + if (fs->currentsector.sector[SIGNATURE_POSITION] != 0x55 || fs->currentsector.sector[SIGNATURE_POSITION+1] != 0xAA) + return FAT_INIT_INVALID_SIGNATURE; + + // Now check again using the access function to prove endian conversion function + if (GET_16BIT_WORD(fs->currentsector.sector, SIGNATURE_POSITION) != SIGNATURE_VALUE) + return FAT_INIT_ENDIAN_ERROR; + + // Verify packed structures + if (sizeof(struct fat_dir_entry) != FAT_DIR_ENTRY_SIZE) + return FAT_INIT_STRUCT_PACKING; + + // Check the partition type code + switch(fs->currentsector.sector[PARTITION1_TYPECODE_LOCATION]) + { + case 0x0B: + case 0x06: + case 0x0C: + case 0x0E: + case 0x0F: + case 0x05: + valid_partition = 1; + break; + case 0x00: + valid_partition = 0; + break; + default: + if (fs->currentsector.sector[PARTITION1_TYPECODE_LOCATION] <= 0x06) + valid_partition = 1; + break; + } + + // Read LBA Begin for the file system + if (valid_partition) + fs->lba_begin = GET_32BIT_WORD(fs->currentsector.sector, PARTITION1_LBA_BEGIN_LOCATION); + // Else possibly MBR less disk + else + fs->lba_begin = 0; + + // Load Volume 1 table into sector buffer + // (We may already have this in the buffer if MBR less drive!) + if (!fs->disk_io.read_media(fs->lba_begin, fs->currentsector.sector, 1)) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Make sure there are 512 bytes per cluster + if (GET_16BIT_WORD(fs->currentsector.sector, 0x0B) != FAT_SECTOR_SIZE) + return FAT_INIT_INVALID_SECTOR_SIZE; + + // Load Parameters of FAT partition + fs->sectors_per_cluster = fs->currentsector.sector[BPB_SECPERCLUS]; + reserved_sectors = GET_16BIT_WORD(fs->currentsector.sector, BPB_RSVDSECCNT); + num_of_fats = fs->currentsector.sector[BPB_NUMFATS]; + fs->root_entry_count = GET_16BIT_WORD(fs->currentsector.sector, BPB_ROOTENTCNT); + + if(GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16) != 0) + fs->fat_sectors = GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16); + else + fs->fat_sectors = GET_32BIT_WORD(fs->currentsector.sector, BPB_FAT32_FATSZ32); + + // For FAT32 (which this may be) + fs->rootdir_first_cluster = GET_32BIT_WORD(fs->currentsector.sector, BPB_FAT32_ROOTCLUS); + fs->fs_info_sector = GET_16BIT_WORD(fs->currentsector.sector, BPB_FAT32_FSINFO); + + // For FAT16 (which this may be), rootdir_first_cluster is actuall rootdir_first_sector + fs->rootdir_first_sector = reserved_sectors + (num_of_fats * fs->fat_sectors); + fs->rootdir_sectors = ((fs->root_entry_count * 32) + (FAT_SECTOR_SIZE - 1)) / FAT_SECTOR_SIZE; + + // First FAT LBA address + fs->fat_begin_lba = fs->lba_begin + reserved_sectors; + + // The address of the first data cluster on this volume + fs->cluster_begin_lba = fs->fat_begin_lba + (num_of_fats * fs->fat_sectors); + + if (GET_16BIT_WORD(fs->currentsector.sector, 0x1FE) != 0xAA55) // This signature should be AA55 + return FAT_INIT_INVALID_SIGNATURE; + + // Calculate the root dir sectors + root_dir_sectors = ((GET_16BIT_WORD(fs->currentsector.sector, BPB_ROOTENTCNT) * 32) + (GET_16BIT_WORD(fs->currentsector.sector, BPB_BYTSPERSEC) - 1)) / GET_16BIT_WORD(fs->currentsector.sector, BPB_BYTSPERSEC); + + if(GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16) != 0) + FATSz = GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16); + else + FATSz = GET_32BIT_WORD(fs->currentsector.sector, BPB_FAT32_FATSZ32); + + if(GET_16BIT_WORD(fs->currentsector.sector, BPB_TOTSEC16) != 0) + total_sectors = GET_16BIT_WORD(fs->currentsector.sector, BPB_TOTSEC16); + else + total_sectors = GET_32BIT_WORD(fs->currentsector.sector, BPB_TOTSEC32); + + data_sectors = total_sectors - (GET_16BIT_WORD(fs->currentsector.sector, BPB_RSVDSECCNT) + (fs->currentsector.sector[BPB_NUMFATS] * FATSz) + root_dir_sectors); + + // Find out which version of FAT this is... + if (fs->sectors_per_cluster != 0) + { + count_of_clusters = data_sectors / fs->sectors_per_cluster; + + if(count_of_clusters < 4085) + // Volume is FAT12 + return FAT_INIT_WRONG_FILESYS_TYPE; + else if(count_of_clusters < 65525) + { + // Clear this FAT32 specific param + fs->rootdir_first_cluster = 0; + + // Volume is FAT16 + fs->fat_type = FAT_TYPE_16; + return FAT_INIT_OK; + } + else + { + // Volume is FAT32 + fs->fat_type = FAT_TYPE_32; + return FAT_INIT_OK; + } + } + else + return FAT_INIT_WRONG_FILESYS_TYPE; +} +//----------------------------------------------------------------------------- +// fatfs_lba_of_cluster: This function converts a cluster number into a sector / +// LBA number. +//----------------------------------------------------------------------------- +uint32 fatfs_lba_of_cluster(struct fatfs *fs, uint32 Cluster_Number) +{ + if (fs->fat_type == FAT_TYPE_16) + return (fs->cluster_begin_lba + (fs->root_entry_count * 32 / FAT_SECTOR_SIZE) + ((Cluster_Number-2) * fs->sectors_per_cluster)); + else + return ((fs->cluster_begin_lba + ((Cluster_Number-2)*fs->sectors_per_cluster))); +} +//----------------------------------------------------------------------------- +// fatfs_sector_read: +//----------------------------------------------------------------------------- +int fatfs_sector_read(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count) +{ + return fs->disk_io.read_media(lba, target, count); +} +//----------------------------------------------------------------------------- +// fatfs_sector_write: +//----------------------------------------------------------------------------- +int fatfs_sector_write(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count) +{ + return fs->disk_io.write_media(lba, target, count); +} +//----------------------------------------------------------------------------- +// fatfs_sector_reader: From the provided startcluster and sector offset +// Returns True if success, returns False if not (including if read out of range) +//----------------------------------------------------------------------------- +int fatfs_sector_reader(struct fatfs *fs, uint32 start_cluster, uint32 offset, uint8 *target) +{ + uint32 sector_to_read = 0; + uint32 cluster_to_read = 0; + uint32 cluster_chain = 0; + uint32 i; + uint32 lba; + + // FAT16 Root directory + if (fs->fat_type == FAT_TYPE_16 && start_cluster == 0) + { + if (offset < fs->rootdir_sectors) + lba = fs->lba_begin + fs->rootdir_first_sector + offset; + else + return 0; + } + // FAT16/32 Other + else + { + // Set start of cluster chain to initial value + cluster_chain = start_cluster; + + // Find parameters + cluster_to_read = offset / fs->sectors_per_cluster; + sector_to_read = offset - (cluster_to_read*fs->sectors_per_cluster); + + // Follow chain to find cluster to read + for (i=0; idisk_io.read_media(lba, target, 1); + // Else read sector if not already loaded + else if (lba != fs->currentsector.address) + { + fs->currentsector.address = lba; + return fs->disk_io.read_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + else + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_read_sector: Read from the provided cluster and sector offset +// Returns True if success, returns False if not +//----------------------------------------------------------------------------- +int fatfs_read_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target) +{ + // FAT16 Root directory + if (fs->fat_type == FAT_TYPE_16 && cluster == 0) + { + uint32 lba; + + // In FAT16, there are a limited amount of sectors in root dir! + if (sector < fs->rootdir_sectors) + lba = fs->lba_begin + fs->rootdir_first_sector + sector; + else + return 0; + + // User target buffer passed in + if (target) + { + // Read from disk + return fs->disk_io.read_media(lba, target, 1); + } + else + { + // Calculate read address + fs->currentsector.address = lba; + + // Read from disk + return fs->disk_io.read_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + // FAT16/32 Other + else + { + // User target buffer passed in + if (target) + { + // Calculate read address + uint32 lba = fatfs_lba_of_cluster(fs, cluster) + sector; + + // Read from disk + return fs->disk_io.read_media(lba, target, 1); + } + else + { + // Calculate write address + fs->currentsector.address = fatfs_lba_of_cluster(fs, cluster)+sector; + + // Read from disk + return fs->disk_io.read_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } +} +//----------------------------------------------------------------------------- +// fatfs_write_sector: Write to the provided cluster and sector offset +// Returns True if success, returns False if not +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_write_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target) +{ + // No write access? + if (!fs->disk_io.write_media) + return 0; + + // FAT16 Root directory + if (fs->fat_type == FAT_TYPE_16 && cluster == 0) + { + uint32 lba; + + // In FAT16 we cannot extend the root dir! + if (sector < fs->rootdir_sectors) + lba = fs->lba_begin + fs->rootdir_first_sector + sector; + else + return 0; + + // User target buffer passed in + if (target) + { + // Write to disk + return fs->disk_io.write_media(lba, target, 1); + } + else + { + // Calculate write address + fs->currentsector.address = lba; + + // Write to disk + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + // FAT16/32 Other + else + { + // User target buffer passed in + if (target) + { + // Calculate write address + uint32 lba = fatfs_lba_of_cluster(fs, cluster) + sector; + + // Write to disk + return fs->disk_io.write_media(lba, target, 1); + } + else + { + // Calculate write address + fs->currentsector.address = fatfs_lba_of_cluster(fs, cluster)+sector; + + // Write to disk + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } +} +#endif +//----------------------------------------------------------------------------- +// fatfs_show_details: Show the details about the filesystem +//----------------------------------------------------------------------------- +void fatfs_show_details(struct fatfs *fs) +{ + FAT_PRINTF(("FAT details:\r\n")); + FAT_PRINTF((" Type =%s", (fs->fat_type == FAT_TYPE_32) ? "FAT32": "FAT16")); + FAT_PRINTF((" Root Dir First Cluster = %x\r\n", fs->rootdir_first_cluster)); + FAT_PRINTF((" FAT Begin LBA = 0x%x\r\n",fs->fat_begin_lba)); + FAT_PRINTF((" Cluster Begin LBA = 0x%x\r\n",fs->cluster_begin_lba)); + FAT_PRINTF((" Sectors Per Cluster = %d\r\n", fs->sectors_per_cluster)); +} +//----------------------------------------------------------------------------- +// fatfs_get_root_cluster: Get the root dir cluster +//----------------------------------------------------------------------------- +uint32 fatfs_get_root_cluster(struct fatfs *fs) +{ + // NOTE: On FAT16 this will be 0 which has a special meaning... + return fs->rootdir_first_cluster; +} +//------------------------------------------------------------- +// fatfs_get_file_entry: Find the file entry for a filename +//------------------------------------------------------------- +uint32 fatfs_get_file_entry(struct fatfs *fs, uint32 Cluster, char *name_to_find, struct fat_dir_entry *sfEntry) +{ + uint8 item=0; + uint16 recordoffset = 0; + uint8 i=0; + int x=0; + char *long_filename = NULL; + char short_filename[13]; + struct lfn_cache lfn; + int dotRequired = 0; + struct fat_dir_entry *directoryEntry; + + fatfs_lfn_cache_init(&lfn, 1); + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + fatfs_lfn_cache_entry(&lfn, fs->currentsector.sector+recordoffset); + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + fatfs_lfn_cache_init(&lfn, 0); + + // Normal SFN Entry and Long text exists + else if (fatfs_entry_lfn_exists(&lfn, directoryEntry) ) + { + long_filename = fatfs_lfn_cache_get(&lfn); + + // Compare names to see if they match + if (fatfs_compare_names(long_filename, name_to_find)) + { + memcpy(sfEntry,directoryEntry,sizeof(struct fat_dir_entry)); + return 1; + } + + fatfs_lfn_cache_init(&lfn, 0); + } + else +#endif + // Normal Entry, only 8.3 Text + if (fatfs_entry_sfn_only(directoryEntry) ) + { + memset(short_filename, 0, sizeof(short_filename)); + + // Copy name to string + for (i=0; i<8; i++) + short_filename[i] = directoryEntry->Name[i]; + + // Extension + dotRequired = 0; + for (i=8; i<11; i++) + { + short_filename[i+1] = directoryEntry->Name[i]; + if (directoryEntry->Name[i] != ' ') + dotRequired = 1; + } + + // Dot only required if extension present + if (dotRequired) + { + // If not . or .. entry + if (short_filename[0]!='.') + short_filename[8] = '.'; + else + short_filename[8] = ' '; + } + else + short_filename[8] = ' '; + + // Compare names to see if they match + if (fatfs_compare_names(short_filename, name_to_find)) + { + memcpy(sfEntry,directoryEntry,sizeof(struct fat_dir_entry)); + return 1; + } + + fatfs_lfn_cache_init(&lfn, 0); + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +//------------------------------------------------------------- +// fatfs_sfn_exists: Check if a short filename exists. +// NOTE: shortname is XXXXXXXXYYY not XXXXXXXX.YYY +//------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_sfn_exists(struct fatfs *fs, uint32 Cluster, char *shortname) +{ + uint8 item=0; + uint16 recordoffset = 0; + int x=0; + struct fat_dir_entry *directoryEntry; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + ; + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + ; + else +#endif + // Normal Entry, only 8.3 Text + if (fatfs_entry_sfn_only(directoryEntry) ) + { + if (strncmp((const char*)directoryEntry->Name, shortname, 11)==0) + return 1; + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +#endif +//------------------------------------------------------------- +// fatfs_update_timestamps: Update date/time details +//------------------------------------------------------------- +#if FATFS_INC_TIME_DATE_SUPPORT +int fatfs_update_timestamps(struct fat_dir_entry *directoryEntry, int create, int modify, int access) +{ + time_t time_now; + struct tm * time_info; + uint16 fat_time; + uint16 fat_date; + + // Get system time + time(&time_now); + + // Convert to local time + time_info = localtime(&time_now); + + // Convert time to FAT format + fat_time = fatfs_convert_to_fat_time(time_info->tm_hour, time_info->tm_min, time_info->tm_sec); + + // Convert date to FAT format + fat_date = fatfs_convert_to_fat_date(time_info->tm_mday, time_info->tm_mon + 1, time_info->tm_year + 1900); + + // Update requested fields + if (create) + { + directoryEntry->CrtTime[1] = fat_time >> 8; + directoryEntry->CrtTime[0] = fat_time >> 0; + directoryEntry->CrtDate[1] = fat_date >> 8; + directoryEntry->CrtDate[0] = fat_date >> 0; + } + + if (modify) + { + directoryEntry->WrtTime[1] = fat_time >> 8; + directoryEntry->WrtTime[0] = fat_time >> 0; + directoryEntry->WrtDate[1] = fat_date >> 8; + directoryEntry->WrtDate[0] = fat_date >> 0; + } + + if (access) + { + directoryEntry->LstAccDate[1] = fat_time >> 8; + directoryEntry->LstAccDate[0] = fat_time >> 0; + directoryEntry->LstAccDate[1] = fat_date >> 8; + directoryEntry->LstAccDate[0] = fat_date >> 0; + } + + return 1; +} +#endif +//------------------------------------------------------------- +// fatfs_update_file_length: Find a SFN entry and update it +// NOTE: shortname is XXXXXXXXYYY not XXXXXXXX.YYY +//------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_update_file_length(struct fatfs *fs, uint32 Cluster, char *shortname, uint32 fileLength) +{ + uint8 item=0; + uint16 recordoffset = 0; + int x=0; + struct fat_dir_entry *directoryEntry; + + // No write access? + if (!fs->disk_io.write_media) + return 0; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + ; + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + ; + + // Normal Entry, only 8.3 Text + else +#endif + if (fatfs_entry_sfn_only(directoryEntry) ) + { + if (strncmp((const char*)directoryEntry->Name, shortname, 11)==0) + { + directoryEntry->FileSize = FAT_HTONL(fileLength); + +#if FATFS_INC_TIME_DATE_SUPPORT + // Update access / modify time & date + fatfs_update_timestamps(directoryEntry, 0, 1, 1); +#endif + + // Update sfn entry + memcpy((uint8*)(fs->currentsector.sector+recordoffset), (uint8*)directoryEntry, sizeof(struct fat_dir_entry)); + + // Write sector back + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +#endif +//------------------------------------------------------------- +// fatfs_mark_file_deleted: Find a SFN entry and mark if as deleted +// NOTE: shortname is XXXXXXXXYYY not XXXXXXXX.YYY +//------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_mark_file_deleted(struct fatfs *fs, uint32 Cluster, char *shortname) +{ + uint8 item=0; + uint16 recordoffset = 0; + int x=0; + struct fat_dir_entry *directoryEntry; + + // No write access? + if (!fs->disk_io.write_media) + return 0; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + ; + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + ; + + // Normal Entry, only 8.3 Text + else +#endif + if (fatfs_entry_sfn_only(directoryEntry) ) + { + if (strncmp((const char *)directoryEntry->Name, shortname, 11)==0) + { + // Mark as deleted + directoryEntry->Name[0] = FILE_HEADER_DELETED; + +#if FATFS_INC_TIME_DATE_SUPPORT + // Update access / modify time & date + fatfs_update_timestamps(directoryEntry, 0, 1, 1); +#endif + + // Update sfn entry + memcpy((uint8*)(fs->currentsector.sector+recordoffset), (uint8*)directoryEntry, sizeof(struct fat_dir_entry)); + + // Write sector back + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_list_directory_start: Initialise a directory listing procedure +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +void fatfs_list_directory_start(struct fatfs *fs, struct fs_dir_list_status *dirls, uint32 StartCluster) +{ + dirls->cluster = StartCluster; + dirls->sector = 0; + dirls->offset = 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_list_directory_next: Get the next entry in the directory. +// Returns: 1 = found, 0 = end of listing +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fatfs_list_directory_next(struct fatfs *fs, struct fs_dir_list_status *dirls, struct fs_dir_ent *entry) +{ + uint8 i,item; + uint16 recordoffset; + struct fat_dir_entry *directoryEntry; + char *long_filename = NULL; + char short_filename[13]; + struct lfn_cache lfn; + int dotRequired = 0; + int result = 0; + + // Initialise LFN cache first + fatfs_lfn_cache_init(&lfn, 0); + + while (1) + { + // If data read OK + if (fatfs_sector_reader(fs, dirls->cluster, dirls->sector, 0)) + { + // Maximum of 16 directory entries + for (item = dirls->offset; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Increase directory offset + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if ( fatfs_entry_lfn_text(directoryEntry) ) + fatfs_lfn_cache_entry(&lfn, fs->currentsector.sector+recordoffset); + + // If Invalid record found delete any long file name information collated + else if ( fatfs_entry_lfn_invalid(directoryEntry) ) + fatfs_lfn_cache_init(&lfn, 0); + + // Normal SFN Entry and Long text exists + else if (fatfs_entry_lfn_exists(&lfn, directoryEntry) ) + { + // Get text + long_filename = fatfs_lfn_cache_get(&lfn); + strncpy(entry->filename, long_filename, FATFS_MAX_LONG_FILENAME-1); + + if (fatfs_entry_is_dir(directoryEntry)) + entry->is_dir = 1; + else + entry->is_dir = 0; + +#if FATFS_INC_TIME_DATE_SUPPORT + // Get time / dates + entry->create_time = ((uint16)directoryEntry->CrtTime[1] << 8) | directoryEntry->CrtTime[0]; + entry->create_date = ((uint16)directoryEntry->CrtDate[1] << 8) | directoryEntry->CrtDate[0]; + entry->access_date = ((uint16)directoryEntry->LstAccDate[1] << 8) | directoryEntry->LstAccDate[0]; + entry->write_time = ((uint16)directoryEntry->WrtTime[1] << 8) | directoryEntry->WrtTime[0]; + entry->write_date = ((uint16)directoryEntry->WrtDate[1] << 8) | directoryEntry->WrtDate[0]; +#endif + + entry->size = FAT_HTONL(directoryEntry->FileSize); + entry->cluster = (FAT_HTONS(directoryEntry->FstClusHI)<<16) | FAT_HTONS(directoryEntry->FstClusLO); + + // Next starting position + dirls->offset = item + 1; + result = 1; + return 1; + } + // Normal Entry, only 8.3 Text + else +#endif + if ( fatfs_entry_sfn_only(directoryEntry) ) + { + fatfs_lfn_cache_init(&lfn, 0); + + memset(short_filename, 0, sizeof(short_filename)); + + // Copy name to string + for (i=0; i<8; i++) + short_filename[i] = directoryEntry->Name[i]; + + // Extension + dotRequired = 0; + for (i=8; i<11; i++) + { + short_filename[i+1] = directoryEntry->Name[i]; + if (directoryEntry->Name[i] != ' ') + dotRequired = 1; + } + + // Dot only required if extension present + if (dotRequired) + { + // If not . or .. entry + if (short_filename[0]!='.') + short_filename[8] = '.'; + else + short_filename[8] = ' '; + } + else + short_filename[8] = ' '; + + fatfs_get_sfn_display_name(entry->filename, short_filename); + + if (fatfs_entry_is_dir(directoryEntry)) + entry->is_dir = 1; + else + entry->is_dir = 0; + +#if FATFS_INC_TIME_DATE_SUPPORT + // Get time / dates + entry->create_time = ((uint16)directoryEntry->CrtTime[1] << 8) | directoryEntry->CrtTime[0]; + entry->create_date = ((uint16)directoryEntry->CrtDate[1] << 8) | directoryEntry->CrtDate[0]; + entry->access_date = ((uint16)directoryEntry->LstAccDate[1] << 8) | directoryEntry->LstAccDate[0]; + entry->write_time = ((uint16)directoryEntry->WrtTime[1] << 8) | directoryEntry->WrtTime[0]; + entry->write_date = ((uint16)directoryEntry->WrtDate[1] << 8) | directoryEntry->WrtDate[0]; +#endif + + entry->size = FAT_HTONL(directoryEntry->FileSize); + entry->cluster = (FAT_HTONS(directoryEntry->FstClusHI)<<16) | FAT_HTONS(directoryEntry->FstClusLO); + + // Next starting position + dirls->offset = item + 1; + result = 1; + return 1; + } + }// end of for + + // If reached end of the dir move onto next sector + dirls->sector++; + dirls->offset = 0; + } + else + break; + } + + return result; +} +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_access.h b/src/hisocli/fat_io_lib/release/fat_access.h new file mode 100644 index 0000000..1752387 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_access.h @@ -0,0 +1,133 @@ +#ifndef __FAT_ACCESS_H__ +#define __FAT_ACCESS_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#define FAT_INIT_OK 0 +#define FAT_INIT_MEDIA_ACCESS_ERROR (-1) +#define FAT_INIT_INVALID_SECTOR_SIZE (-2) +#define FAT_INIT_INVALID_SIGNATURE (-3) +#define FAT_INIT_ENDIAN_ERROR (-4) +#define FAT_INIT_WRONG_FILESYS_TYPE (-5) +#define FAT_INIT_WRONG_PARTITION_TYPE (-6) +#define FAT_INIT_STRUCT_PACKING (-7) + +#define FAT_DIR_ENTRIES_PER_SECTOR (FAT_SECTOR_SIZE / FAT_DIR_ENTRY_SIZE) + +//----------------------------------------------------------------------------- +// Function Pointers +//----------------------------------------------------------------------------- +typedef int (*fn_diskio_read) (uint32 sector, uint8 *buffer, uint32 sector_count); +typedef int (*fn_diskio_write)(uint32 sector, uint8 *buffer, uint32 sector_count); + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct disk_if +{ + // User supplied function pointers for disk IO + fn_diskio_read read_media; + fn_diskio_write write_media; +}; + +// Forward declaration +struct fat_buffer; + +struct fat_buffer +{ + uint8 sector[FAT_SECTOR_SIZE * FAT_BUFFER_SECTORS]; + uint32 address; + int dirty; + uint8 * ptr; + + // Next in chain of sector buffers + struct fat_buffer *next; +}; + +typedef enum eFatType +{ + FAT_TYPE_16, + FAT_TYPE_32 +} tFatType; + +struct fatfs +{ + // Filesystem globals + uint8 sectors_per_cluster; + uint32 cluster_begin_lba; + uint32 rootdir_first_cluster; + uint32 rootdir_first_sector; + uint32 rootdir_sectors; + uint32 fat_begin_lba; + uint16 fs_info_sector; + uint32 lba_begin; + uint32 fat_sectors; + uint32 next_free_cluster; + uint16 root_entry_count; + uint16 reserved_sectors; + uint8 num_of_fats; + tFatType fat_type; + + // Disk/Media API + struct disk_if disk_io; + + // [Optional] Thread Safety + void (*fl_lock)(void); + void (*fl_unlock)(void); + + // Working buffer + struct fat_buffer currentsector; + + // FAT Buffer + struct fat_buffer *fat_buffer_head; + struct fat_buffer fat_buffers[FAT_BUFFERS]; +}; + +struct fs_dir_list_status +{ + uint32 sector; + uint32 cluster; + uint8 offset; +}; + +struct fs_dir_ent +{ + char filename[FATFS_MAX_LONG_FILENAME]; + uint8 is_dir; + uint32 cluster; + uint32 size; + +#if FATFS_INC_TIME_DATE_SUPPORT + uint16 access_date; + uint16 write_time; + uint16 write_date; + uint16 create_date; + uint16 create_time; +#endif +}; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_init(struct fatfs *fs); +uint32 fatfs_lba_of_cluster(struct fatfs *fs, uint32 Cluster_Number); +int fatfs_sector_reader(struct fatfs *fs, uint32 Startcluster, uint32 offset, uint8 *target); +int fatfs_sector_read(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count); +int fatfs_sector_write(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count); +int fatfs_read_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target); +int fatfs_write_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target); +void fatfs_show_details(struct fatfs *fs); +uint32 fatfs_get_root_cluster(struct fatfs *fs); +uint32 fatfs_get_file_entry(struct fatfs *fs, uint32 Cluster, char *nametofind, struct fat_dir_entry *sfEntry); +int fatfs_sfn_exists(struct fatfs *fs, uint32 Cluster, char *shortname); +int fatfs_update_file_length(struct fatfs *fs, uint32 Cluster, char *shortname, uint32 fileLength); +int fatfs_mark_file_deleted(struct fatfs *fs, uint32 Cluster, char *shortname); +void fatfs_list_directory_start(struct fatfs *fs, struct fs_dir_list_status *dirls, uint32 StartCluster); +int fatfs_list_directory_next(struct fatfs *fs, struct fs_dir_list_status *dirls, struct fs_dir_ent *entry); +int fatfs_update_timestamps(struct fat_dir_entry *directoryEntry, int create, int modify, int access); + +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_cache.c b/src/hisocli/fat_io_lib/release/fat_cache.c new file mode 100644 index 0000000..de77e6a --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_cache.c @@ -0,0 +1,91 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_cache.h" + +// Per file cluster chain caching used to improve performance. +// This does not have to be enabled for architectures with low +// memory space. + +//----------------------------------------------------------------------------- +// fatfs_cache_init: +//----------------------------------------------------------------------------- +int fatfs_cache_init(struct fatfs *fs, FL_FILE *file) +{ +#ifdef FAT_CLUSTER_CACHE_ENTRIES + int i; + + for (i=0;icluster_cache_idx[i] = 0xFFFFFFFF; // Not used + file->cluster_cache_data[i] = 0; + } +#endif + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_cache_get_next_cluster: +//----------------------------------------------------------------------------- +int fatfs_cache_get_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 *pNextCluster) +{ +#ifdef FAT_CLUSTER_CACHE_ENTRIES + uint32 slot = clusterIdx % FAT_CLUSTER_CACHE_ENTRIES; + + if (file->cluster_cache_idx[slot] == clusterIdx) + { + *pNextCluster = file->cluster_cache_data[slot]; + return 1; + } +#endif + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_cache_set_next_cluster: +//----------------------------------------------------------------------------- +int fatfs_cache_set_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 nextCluster) +{ +#ifdef FAT_CLUSTER_CACHE_ENTRIES + uint32 slot = clusterIdx % FAT_CLUSTER_CACHE_ENTRIES; + + if (file->cluster_cache_idx[slot] == clusterIdx) + file->cluster_cache_data[slot] = nextCluster; + else + { + file->cluster_cache_idx[slot] = clusterIdx; + file->cluster_cache_data[slot] = nextCluster; + } +#endif + + return 1; +} diff --git a/src/hisocli/fat_io_lib/release/fat_cache.h b/src/hisocli/fat_io_lib/release/fat_cache.h new file mode 100644 index 0000000..348d5d3 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_cache.h @@ -0,0 +1,13 @@ +#ifndef __FAT_CACHE_H__ +#define __FAT_CACHE_H__ + +#include "fat_filelib.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_cache_init(struct fatfs *fs, FL_FILE *file); +int fatfs_cache_get_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 *pNextCluster); +int fatfs_cache_set_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 nextCluster); + +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_defs.h b/src/hisocli/fat_io_lib/release/fat_defs.h new file mode 100644 index 0000000..5fe8d6a --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_defs.h @@ -0,0 +1,128 @@ +#ifndef __FAT_DEFS_H__ +#define __FAT_DEFS_H__ + +#include "fat_opts.h" +#include "fat_types.h" + +//----------------------------------------------------------------------------- +// FAT32 Offsets +// Name Offset +//----------------------------------------------------------------------------- + +// Boot Sector +#define BS_JMPBOOT 0 // Length = 3 +#define BS_OEMNAME 3 // Length = 8 +#define BPB_BYTSPERSEC 11 // Length = 2 +#define BPB_SECPERCLUS 13 // Length = 1 +#define BPB_RSVDSECCNT 14 // Length = 2 +#define BPB_NUMFATS 16 // Length = 1 +#define BPB_ROOTENTCNT 17 // Length = 2 +#define BPB_TOTSEC16 19 // Length = 2 +#define BPB_MEDIA 21 // Length = 1 +#define BPB_FATSZ16 22 // Length = 2 +#define BPB_SECPERTRK 24 // Length = 2 +#define BPB_NUMHEADS 26 // Length = 2 +#define BPB_HIDDSEC 28 // Length = 4 +#define BPB_TOTSEC32 32 // Length = 4 + +// FAT 12/16 +#define BS_FAT_DRVNUM 36 // Length = 1 +#define BS_FAT_BOOTSIG 38 // Length = 1 +#define BS_FAT_VOLID 39 // Length = 4 +#define BS_FAT_VOLLAB 43 // Length = 11 +#define BS_FAT_FILSYSTYPE 54 // Length = 8 + +// FAT 32 +#define BPB_FAT32_FATSZ32 36 // Length = 4 +#define BPB_FAT32_EXTFLAGS 40 // Length = 2 +#define BPB_FAT32_FSVER 42 // Length = 2 +#define BPB_FAT32_ROOTCLUS 44 // Length = 4 +#define BPB_FAT32_FSINFO 48 // Length = 2 +#define BPB_FAT32_BKBOOTSEC 50 // Length = 2 +#define BS_FAT32_DRVNUM 64 // Length = 1 +#define BS_FAT32_BOOTSIG 66 // Length = 1 +#define BS_FAT32_VOLID 67 // Length = 4 +#define BS_FAT32_VOLLAB 71 // Length = 11 +#define BS_FAT32_FILSYSTYPE 82 // Length = 8 + +//----------------------------------------------------------------------------- +// FAT Types +//----------------------------------------------------------------------------- +#define FAT_TYPE_FAT12 1 +#define FAT_TYPE_FAT16 2 +#define FAT_TYPE_FAT32 3 + +//----------------------------------------------------------------------------- +// FAT32 Specific Statics +//----------------------------------------------------------------------------- +#define SIGNATURE_POSITION 510 +#define SIGNATURE_VALUE 0xAA55 +#define PARTITION1_TYPECODE_LOCATION 450 +#define FAT32_TYPECODE1 0x0B +#define FAT32_TYPECODE2 0x0C +#define PARTITION1_LBA_BEGIN_LOCATION 454 +#define PARTITION1_SIZE_LOCATION 458 + +#define FAT_DIR_ENTRY_SIZE 32 +#define FAT_SFN_SIZE_FULL 11 +#define FAT_SFN_SIZE_PARTIAL 8 + +//----------------------------------------------------------------------------- +// FAT32 File Attributes and Types +//----------------------------------------------------------------------------- +#define FILE_ATTR_READ_ONLY 0x01 +#define FILE_ATTR_HIDDEN 0x02 +#define FILE_ATTR_SYSTEM 0x04 +#define FILE_ATTR_SYSHID 0x06 +#define FILE_ATTR_VOLUME_ID 0x08 +#define FILE_ATTR_DIRECTORY 0x10 +#define FILE_ATTR_ARCHIVE 0x20 +#define FILE_ATTR_LFN_TEXT 0x0F +#define FILE_HEADER_BLANK 0x00 +#define FILE_HEADER_DELETED 0xE5 +#define FILE_TYPE_DIR 0x10 +#define FILE_TYPE_FILE 0x20 + +//----------------------------------------------------------------------------- +// Time / Date details +//----------------------------------------------------------------------------- +#define FAT_TIME_HOURS_SHIFT 11 +#define FAT_TIME_HOURS_MASK 0x1F +#define FAT_TIME_MINUTES_SHIFT 5 +#define FAT_TIME_MINUTES_MASK 0x3F +#define FAT_TIME_SECONDS_SHIFT 0 +#define FAT_TIME_SECONDS_MASK 0x1F +#define FAT_TIME_SECONDS_SCALE 2 +#define FAT_DATE_YEAR_SHIFT 9 +#define FAT_DATE_YEAR_MASK 0x7F +#define FAT_DATE_MONTH_SHIFT 5 +#define FAT_DATE_MONTH_MASK 0xF +#define FAT_DATE_DAY_SHIFT 0 +#define FAT_DATE_DAY_MASK 0x1F +#define FAT_DATE_YEAR_OFFSET 1980 + +//----------------------------------------------------------------------------- +// Other Defines +//----------------------------------------------------------------------------- +#define FAT32_LAST_CLUSTER 0xFFFFFFFF +#define FAT32_INVALID_CLUSTER 0xFFFFFFFF + +STRUCT_PACK_BEGIN +struct fat_dir_entry STRUCT_PACK +{ + uint8 Name[11]; + uint8 Attr; + uint8 NTRes; + uint8 CrtTimeTenth; + uint8 CrtTime[2]; + uint8 CrtDate[2]; + uint8 LstAccDate[2]; + uint16 FstClusHI; + uint8 WrtTime[2]; + uint8 WrtDate[2]; + uint16 FstClusLO; + uint32 FileSize; +} STRUCT_PACKED; +STRUCT_PACK_END + +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_filelib.c b/src/hisocli/fat_io_lib/release/fat_filelib.c new file mode 100644 index 0000000..2c4a236 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_filelib.c @@ -0,0 +1,1603 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_misc.h" +#include "fat_string.h" +#include "fat_filelib.h" +#include "fat_cache.h" + +//----------------------------------------------------------------------------- +// Locals +//----------------------------------------------------------------------------- +static FL_FILE _files[FATFS_MAX_OPEN_FILES]; +static int _filelib_init = 0; +static int _filelib_valid = 0; +static struct fatfs _fs; +static struct fat_list _open_file_list; +static struct fat_list _free_file_list; + +//----------------------------------------------------------------------------- +// Macros +//----------------------------------------------------------------------------- + +// Macro for checking if file lib is initialised +#define CHECK_FL_INIT() { if (_filelib_init==0) fl_init(); } + +#define FL_LOCK(a) do { if ((a)->fl_lock) (a)->fl_lock(); } while (0) +#define FL_UNLOCK(a) do { if ((a)->fl_unlock) (a)->fl_unlock(); } while (0) + +//----------------------------------------------------------------------------- +// Local Functions +//----------------------------------------------------------------------------- +static void _fl_init(); + +//----------------------------------------------------------------------------- +// _allocate_file: Find a slot in the open files buffer for a new file +//----------------------------------------------------------------------------- +static FL_FILE* _allocate_file(void) +{ + // Allocate free file + struct fat_node *node = fat_list_pop_head(&_free_file_list); + + // Add to open list + if (node) + fat_list_insert_last(&_open_file_list, node); + + return fat_list_entry(node, FL_FILE, list_node); +} +//----------------------------------------------------------------------------- +// _check_file_open: Returns true if the file is already open +//----------------------------------------------------------------------------- +static int _check_file_open(FL_FILE* file) +{ + struct fat_node *node; + + // Compare open files + fat_list_for_each(&_open_file_list, node) + { + FL_FILE* openFile = fat_list_entry(node, FL_FILE, list_node); + + // If not the current file + if (openFile != file) + { + // Compare path and name + if ( (fatfs_compare_names(openFile->path,file->path)) && (fatfs_compare_names(openFile->filename,file->filename)) ) + return 1; + } + } + + return 0; +} +//----------------------------------------------------------------------------- +// _free_file: Free open file handle +//----------------------------------------------------------------------------- +static void _free_file(FL_FILE* file) +{ + // Remove from open list + fat_list_remove(&_open_file_list, &file->list_node); + + // Add to free list + fat_list_insert_last(&_free_file_list, &file->list_node); +} + +//----------------------------------------------------------------------------- +// Low Level +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// _open_directory: Cycle through path string to find the start cluster +// address of the highest subdir. +//----------------------------------------------------------------------------- +static int _open_directory(char *path, uint32 *pathCluster) +{ + int levels; + int sublevel; + char currentfolder[FATFS_MAX_LONG_FILENAME]; + struct fat_dir_entry sfEntry; + uint32 startcluster; + + // Set starting cluster to root cluster + startcluster = fatfs_get_root_cluster(&_fs); + + // Find number of levels + levels = fatfs_total_path_levels(path); + + // Cycle through each level and get the start sector + for (sublevel=0;sublevel<(levels+1);sublevel++) + { + if (fatfs_get_substring(path, sublevel, currentfolder, sizeof(currentfolder)) == -1) + return 0; + + // Find clusteraddress for folder (currentfolder) + if (fatfs_get_file_entry(&_fs, startcluster, currentfolder,&sfEntry)) + { + // Check entry is folder + if (fatfs_entry_is_dir(&sfEntry)) + startcluster = ((FAT_HTONS((uint32)sfEntry.FstClusHI))<<16) + FAT_HTONS(sfEntry.FstClusLO); + else + return 0; + } + else + return 0; + } + + *pathCluster = startcluster; + return 1; +} +//----------------------------------------------------------------------------- +// _create_directory: Cycle through path string and create the end directory +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +static int _create_directory(char *path) +{ + FL_FILE* file; + struct fat_dir_entry sfEntry; + char shortFilename[FAT_SFN_SIZE_FULL]; + int tailNum = 0; + int i; + + // Allocate a new file handle + file = _allocate_file(); + if (!file) + return 0; + + // Clear filename + memset(file->path, '\0', sizeof(file->path)); + memset(file->filename, '\0', sizeof(file->filename)); + + // Split full path into filename and directory path + if (fatfs_split_path((char*)path, file->path, sizeof(file->path), file->filename, sizeof(file->filename)) == -1) + { + _free_file(file); + return 0; + } + + // Check if file already open + if (_check_file_open(file)) + { + _free_file(file); + return 0; + } + + // If file is in the root dir + if (file->path[0] == 0) + file->parentcluster = fatfs_get_root_cluster(&_fs); + else + { + // Find parent directory start cluster + if (!_open_directory(file->path, &file->parentcluster)) + { + _free_file(file); + return 0; + } + } + + // Check if same filename exists in directory + if (fatfs_get_file_entry(&_fs, file->parentcluster, file->filename,&sfEntry) == 1) + { + _free_file(file); + return 0; + } + + file->startcluster = 0; + + // Create the file space for the folder (at least one clusters worth!) + if (!fatfs_allocate_free_space(&_fs, 1, &file->startcluster, 1)) + { + _free_file(file); + return 0; + } + + // Erase new directory cluster + memset(file->file_data_sector, 0x00, FAT_SECTOR_SIZE); + for (i=0;i<_fs.sectors_per_cluster;i++) + { + if (!fatfs_write_sector(&_fs, file->startcluster, i, file->file_data_sector)) + { + _free_file(file); + return 0; + } + } + +#if FATFS_INC_LFN_SUPPORT + + // Generate a short filename & tail + tailNum = 0; + do + { + // Create a standard short filename (without tail) + fatfs_lfn_create_sfn(shortFilename, file->filename); + + // If second hit or more, generate a ~n tail + if (tailNum != 0) + fatfs_lfn_generate_tail((char*)file->shortfilename, shortFilename, tailNum); + // Try with no tail if first entry + else + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already or not + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename) == 0) + break; + + tailNum++; + } + while (tailNum < 9999); + + // We reached the max number of duplicate short file names (unlikely!) + if (tailNum == 9999) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } +#else + // Create a standard short filename (without tail) + if (!fatfs_lfn_create_sfn(shortFilename, file->filename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } + + // Copy to SFN space + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } +#endif + + // Add file to disk + if (!fatfs_add_file_entry(&_fs, file->parentcluster, (char*)file->filename, (char*)file->shortfilename, file->startcluster, 0, 1)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } + + // General + file->filelength = 0; + file->bytenum = 0; + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Quick lookup for next link in the chain + file->last_fat_lookup.ClusterIdx = 0xFFFFFFFF; + file->last_fat_lookup.CurrentCluster = 0xFFFFFFFF; + + fatfs_fat_purge(&_fs); + + _free_file(file); + return 1; +} +#endif +//----------------------------------------------------------------------------- +// _open_file: Open a file for reading +//----------------------------------------------------------------------------- +static FL_FILE* _open_file(const char *path) +{ + FL_FILE* file; + struct fat_dir_entry sfEntry; + + // Allocate a new file handle + file = _allocate_file(); + if (!file) + return NULL; + + // Clear filename + memset(file->path, '\0', sizeof(file->path)); + memset(file->filename, '\0', sizeof(file->filename)); + + // Split full path into filename and directory path + if (fatfs_split_path((char*)path, file->path, sizeof(file->path), file->filename, sizeof(file->filename)) == -1) + { + _free_file(file); + return NULL; + } + + // Check if file already open + if (_check_file_open(file)) + { + _free_file(file); + return NULL; + } + + // If file is in the root dir + if (file->path[0]==0) + file->parentcluster = fatfs_get_root_cluster(&_fs); + else + { + // Find parent directory start cluster + if (!_open_directory(file->path, &file->parentcluster)) + { + _free_file(file); + return NULL; + } + } + + // Using dir cluster address search for filename + if (fatfs_get_file_entry(&_fs, file->parentcluster, file->filename,&sfEntry)) + // Make sure entry is file not dir! + if (fatfs_entry_is_file(&sfEntry)) + { + // Initialise file details + memcpy(file->shortfilename, sfEntry.Name, FAT_SFN_SIZE_FULL); + file->filelength = FAT_HTONL(sfEntry.FileSize); + file->bytenum = 0; + file->startcluster = ((FAT_HTONS((uint32)sfEntry.FstClusHI))<<16) + FAT_HTONS(sfEntry.FstClusLO); + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Quick lookup for next link in the chain + file->last_fat_lookup.ClusterIdx = 0xFFFFFFFF; + file->last_fat_lookup.CurrentCluster = 0xFFFFFFFF; + + fatfs_cache_init(&_fs, file); + + fatfs_fat_purge(&_fs); + + return file; + } + + _free_file(file); + return NULL; +} +//----------------------------------------------------------------------------- +// _create_file: Create a new file +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +static FL_FILE* _create_file(const char *filename) +{ + FL_FILE* file; + struct fat_dir_entry sfEntry; + char shortFilename[FAT_SFN_SIZE_FULL]; + int tailNum = 0; + + // No write access? + if (!_fs.disk_io.write_media) + return NULL; + + // Allocate a new file handle + file = _allocate_file(); + if (!file) + return NULL; + + // Clear filename + memset(file->path, '\0', sizeof(file->path)); + memset(file->filename, '\0', sizeof(file->filename)); + + // Split full path into filename and directory path + if (fatfs_split_path((char*)filename, file->path, sizeof(file->path), file->filename, sizeof(file->filename)) == -1) + { + _free_file(file); + return NULL; + } + + // Check if file already open + if (_check_file_open(file)) + { + _free_file(file); + return NULL; + } + + // If file is in the root dir + if (file->path[0] == 0) + file->parentcluster = fatfs_get_root_cluster(&_fs); + else + { + // Find parent directory start cluster + if (!_open_directory(file->path, &file->parentcluster)) + { + _free_file(file); + return NULL; + } + } + + // Check if same filename exists in directory + if (fatfs_get_file_entry(&_fs, file->parentcluster, file->filename,&sfEntry) == 1) + { + _free_file(file); + return NULL; + } + + file->startcluster = 0; + + // Create the file space for the file (at least one clusters worth!) + if (!fatfs_allocate_free_space(&_fs, 1, &file->startcluster, 1)) + { + _free_file(file); + return NULL; + } + +#if FATFS_INC_LFN_SUPPORT + // Generate a short filename & tail + tailNum = 0; + do + { + // Create a standard short filename (without tail) + fatfs_lfn_create_sfn(shortFilename, file->filename); + + // If second hit or more, generate a ~n tail + if (tailNum != 0) + fatfs_lfn_generate_tail((char*)file->shortfilename, shortFilename, tailNum); + // Try with no tail if first entry + else + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already or not + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename) == 0) + break; + + tailNum++; + } + while (tailNum < 9999); + + // We reached the max number of duplicate short file names (unlikely!) + if (tailNum == 9999) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } +#else + // Create a standard short filename (without tail) + if (!fatfs_lfn_create_sfn(shortFilename, file->filename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } + + // Copy to SFN space + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } +#endif + + // Add file to disk + if (!fatfs_add_file_entry(&_fs, file->parentcluster, (char*)file->filename, (char*)file->shortfilename, file->startcluster, 0, 0)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } + + // General + file->filelength = 0; + file->bytenum = 0; + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Quick lookup for next link in the chain + file->last_fat_lookup.ClusterIdx = 0xFFFFFFFF; + file->last_fat_lookup.CurrentCluster = 0xFFFFFFFF; + + fatfs_cache_init(&_fs, file); + + fatfs_fat_purge(&_fs); + + return file; +} +#endif +//----------------------------------------------------------------------------- +// _read_sectors: Read sector(s) from disk to file +//----------------------------------------------------------------------------- +static uint32 _read_sectors(FL_FILE* file, uint32 offset, uint8 *buffer, uint32 count) +{ + uint32 Sector = 0; + uint32 ClusterIdx = 0; + uint32 Cluster = 0; + uint32 i; + uint32 lba; + + // Find cluster index within file & sector with cluster + ClusterIdx = offset / _fs.sectors_per_cluster; + Sector = offset - (ClusterIdx * _fs.sectors_per_cluster); + + // Limit number of sectors read to the number remaining in this cluster + if ((Sector + count) > _fs.sectors_per_cluster) + count = _fs.sectors_per_cluster - Sector; + + // Quick lookup for next link in the chain + if (ClusterIdx == file->last_fat_lookup.ClusterIdx) + Cluster = file->last_fat_lookup.CurrentCluster; + // Else walk the chain + else + { + // Starting from last recorded cluster? + if (ClusterIdx && ClusterIdx == file->last_fat_lookup.ClusterIdx + 1) + { + i = file->last_fat_lookup.ClusterIdx; + Cluster = file->last_fat_lookup.CurrentCluster; + } + // Start searching from the beginning.. + else + { + // Set start of cluster chain to initial value + i = 0; + Cluster = file->startcluster; + } + + // Follow chain to find cluster to read + for ( ;ilast_fat_lookup.CurrentCluster = Cluster; + file->last_fat_lookup.ClusterIdx = ClusterIdx; + } + } + + // If end of cluster chain then return false + if (Cluster == FAT32_LAST_CLUSTER) + return 0; + + // Calculate sector address + lba = fatfs_lba_of_cluster(&_fs, Cluster) + Sector; + + // Read sector of file + if (fatfs_sector_read(&_fs, lba, buffer, count)) + return count; + else + return 0; +} + +//----------------------------------------------------------------------------- +// External API +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// fl_init: Initialise library +//----------------------------------------------------------------------------- +void fl_init(void) +{ + int i; + + fat_list_init(&_free_file_list); + fat_list_init(&_open_file_list); + + // Add all file objects to free list + for (i=0;iflags = flags; + + FL_UNLOCK(&_fs); + return file; +} +//----------------------------------------------------------------------------- +// _write_sectors: Write sector(s) to disk +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +static uint32 _write_sectors(FL_FILE* file, uint32 offset, uint8 *buf, uint32 count) +{ + uint32 SectorNumber = 0; + uint32 ClusterIdx = 0; + uint32 Cluster = 0; + uint32 LastCluster = FAT32_LAST_CLUSTER; + uint32 i; + uint32 lba; + uint32 TotalWriteCount = count; + + // Find values for Cluster index & sector within cluster + ClusterIdx = offset / _fs.sectors_per_cluster; + SectorNumber = offset - (ClusterIdx * _fs.sectors_per_cluster); + + // Limit number of sectors written to the number remaining in this cluster + if ((SectorNumber + count) > _fs.sectors_per_cluster) + count = _fs.sectors_per_cluster - SectorNumber; + + // Quick lookup for next link in the chain + if (ClusterIdx == file->last_fat_lookup.ClusterIdx) + Cluster = file->last_fat_lookup.CurrentCluster; + // Else walk the chain + else + { + // Starting from last recorded cluster? + if (ClusterIdx && ClusterIdx == file->last_fat_lookup.ClusterIdx + 1) + { + i = file->last_fat_lookup.ClusterIdx; + Cluster = file->last_fat_lookup.CurrentCluster; + } + // Start searching from the beginning.. + else + { + // Set start of cluster chain to initial value + i = 0; + Cluster = file->startcluster; + } + + // Follow chain to find cluster to read + for ( ;ilast_fat_lookup.CurrentCluster = Cluster; + file->last_fat_lookup.ClusterIdx = ClusterIdx; + } + + // Calculate write address + lba = fatfs_lba_of_cluster(&_fs, Cluster) + SectorNumber; + + if (fatfs_sector_write(&_fs, lba, buf, count)) + return count; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fl_fflush: Flush un-written data to the file +//----------------------------------------------------------------------------- +int fl_fflush(void *f) +{ +#if FATFS_INC_WRITE_SUPPORT + FL_FILE *file = (FL_FILE *)f; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (file) + { + FL_LOCK(&_fs); + + // If some write data still in buffer + if (file->file_data_dirty) + { + // Write back current sector before loading next + if (_write_sectors(file, file->file_data_address, file->file_data_sector, 1)) + file->file_data_dirty = 0; + } + + FL_UNLOCK(&_fs); + } +#endif + return 0; +} +//----------------------------------------------------------------------------- +// fl_fclose: Close an open file +//----------------------------------------------------------------------------- +void fl_fclose(void *f) +{ + FL_FILE *file = (FL_FILE *)f; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (file) + { + FL_LOCK(&_fs); + + // Flush un-written data to file + fl_fflush(f); + + // File size changed? + if (file->filelength_changed) + { +#if FATFS_INC_WRITE_SUPPORT + // Update filesize in directory + fatfs_update_file_length(&_fs, file->parentcluster, (char*)file->shortfilename, file->filelength); +#endif + file->filelength_changed = 0; + } + + file->bytenum = 0; + file->filelength = 0; + file->startcluster = 0; + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Free file handle + _free_file(file); + + fatfs_fat_purge(&_fs); + + FL_UNLOCK(&_fs); + } +} +//----------------------------------------------------------------------------- +// fl_fgetc: Get a character in the stream +//----------------------------------------------------------------------------- +int fl_fgetc(void *f) +{ + int res; + uint8 data = 0; + + res = fl_fread(&data, 1, 1, f); + if (res == 1) + return (int)data; + else + return res; +} +//----------------------------------------------------------------------------- +// fl_fgets: Get a string from a stream +//----------------------------------------------------------------------------- +char *fl_fgets(char *s, int n, void *f) +{ + int idx = 0; + + // Space for null terminator? + if (n > 0) + { + // While space (+space for null terminator) + while (idx < (n-1)) + { + int ch = fl_fgetc(f); + + // EOF / Error? + if (ch < 0) + break; + + // Store character read from stream + s[idx++] = (char)ch; + + // End of line? + if (ch == '\n') + break; + } + + if (idx > 0) + s[idx] = '\0'; + } + + return (idx > 0) ? s : 0; +} +//----------------------------------------------------------------------------- +// fl_fread: Read a block of data from the file +//----------------------------------------------------------------------------- +int fl_fread(void * buffer, int size, int length, void *f ) +{ + uint32 sector; + uint32 offset; + int copyCount; + int count = size * length; + int bytesRead = 0; + + FL_FILE *file = (FL_FILE *)f; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (buffer==NULL || file==NULL) + return -1; + + // No read permissions + if (!(file->flags & FILE_READ)) + return -1; + + // Nothing to be done + if (!count) + return 0; + + // Check if read starts past end of file + if (file->bytenum >= file->filelength) + return -1; + + // Limit to file size + if ( (file->bytenum + count) > file->filelength ) + count = file->filelength - file->bytenum; + + // Calculate start sector + sector = file->bytenum / FAT_SECTOR_SIZE; + + // Offset to start copying data from first sector + offset = file->bytenum % FAT_SECTOR_SIZE; + + while (bytesRead < count) + { + // Read whole sector, read from media directly into target buffer + if ((offset == 0) && ((count - bytesRead) >= FAT_SECTOR_SIZE)) + { + // Read as many sectors as possible into target buffer + uint32 sectorsRead = _read_sectors(file, sector, (uint8*)((uint8*)buffer + bytesRead), (count - bytesRead) / FAT_SECTOR_SIZE); + if (sectorsRead) + { + // We have upto one sector to copy + copyCount = FAT_SECTOR_SIZE * sectorsRead; + + // Move onto next sector and reset copy offset + sector+= sectorsRead; + offset = 0; + } + else + break; + } + else + { + // Do we need to re-read the sector? + if (file->file_data_address != sector) + { + // Flush un-written data to file + if (file->file_data_dirty) + fl_fflush(file); + + // Get LBA of sector offset within file + if (!_read_sectors(file, sector, file->file_data_sector, 1)) + // Read failed - out of range (probably) + break; + + file->file_data_address = sector; + file->file_data_dirty = 0; + } + + // We have upto one sector to copy + copyCount = FAT_SECTOR_SIZE - offset; + + // Only require some of this sector? + if (copyCount > (count - bytesRead)) + copyCount = (count - bytesRead); + + // Copy to application buffer + memcpy( (uint8*)((uint8*)buffer + bytesRead), (uint8*)(file->file_data_sector + offset), copyCount); + + // Move onto next sector and reset copy offset + sector++; + offset = 0; + } + + // Increase total read count + bytesRead += copyCount; + + // Increment file pointer + file->bytenum += copyCount; + } + + return bytesRead; +} +//----------------------------------------------------------------------------- +// fl_fseek: Seek to a specific place in the file +//----------------------------------------------------------------------------- +int fl_fseek( void *f, long offset, int origin ) +{ + FL_FILE *file = (FL_FILE *)f; + int res = -1; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (!file) + return -1; + + if (origin == SEEK_END && offset != 0) + return -1; + + FL_LOCK(&_fs); + + // Invalidate file buffer + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + + if (origin == SEEK_SET) + { + file->bytenum = (uint32)offset; + + if (file->bytenum > file->filelength) + file->bytenum = file->filelength; + + res = 0; + } + else if (origin == SEEK_CUR) + { + // Positive shift + if (offset >= 0) + { + file->bytenum += offset; + + if (file->bytenum > file->filelength) + file->bytenum = file->filelength; + } + // Negative shift + else + { + // Make shift positive + offset = -offset; + + // Limit to negative shift to start of file + if ((uint32)offset > file->bytenum) + file->bytenum = 0; + else + file->bytenum-= offset; + } + + res = 0; + } + else if (origin == SEEK_END) + { + file->bytenum = file->filelength; + res = 0; + } + else + res = -1; + + FL_UNLOCK(&_fs); + + return res; +} +//----------------------------------------------------------------------------- +// fl_fgetpos: Get the current file position +//----------------------------------------------------------------------------- +int fl_fgetpos(void *f , uint32 * position) +{ + FL_FILE *file = (FL_FILE *)f; + + if (!file) + return -1; + + FL_LOCK(&_fs); + + // Get position + *position = file->bytenum; + + FL_UNLOCK(&_fs); + + return 0; +} +//----------------------------------------------------------------------------- +// fl_ftell: Get the current file position +//----------------------------------------------------------------------------- +long fl_ftell(void *f) +{ + uint32 pos = 0; + + fl_fgetpos(f, &pos); + + return (long)pos; +} +//----------------------------------------------------------------------------- +// fl_feof: Is the file pointer at the end of the stream? +//----------------------------------------------------------------------------- +int fl_feof(void *f) +{ + FL_FILE *file = (FL_FILE *)f; + int res; + + if (!file) + return -1; + + FL_LOCK(&_fs); + + if (file->bytenum == file->filelength) + res = EOF; + else + res = 0; + + FL_UNLOCK(&_fs); + + return res; +} +//----------------------------------------------------------------------------- +// fl_fputc: Write a character to the stream +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_fputc(int c, void *f) +{ + uint8 data = (uint8)c; + int res; + + res = fl_fwrite(&data, 1, 1, f); + if (res == 1) + return c; + else + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_fwrite: Write a block of data to the stream +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_fwrite(const void * data, int size, int count, void *f ) +{ + FL_FILE *file = (FL_FILE *)f; + uint32 sector; + uint32 offset; + uint32 length = (size*count); + uint8 *buffer = (uint8 *)data; + uint32 bytesWritten = 0; + uint32 copyCount; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (!file) + return -1; + + FL_LOCK(&_fs); + + // No write permissions + if (!(file->flags & FILE_WRITE)) + { + FL_UNLOCK(&_fs); + return -1; + } + + // Append writes to end of file + if (file->flags & FILE_APPEND) + file->bytenum = file->filelength; + // Else write to current position + + // Calculate start sector + sector = file->bytenum / FAT_SECTOR_SIZE; + + // Offset to start copying data from first sector + offset = file->bytenum % FAT_SECTOR_SIZE; + + while (bytesWritten < length) + { + // Whole sector or more to be written? + if ((offset == 0) && ((length - bytesWritten) >= FAT_SECTOR_SIZE)) + { + uint32 sectorsWrote; + + // Buffered sector, flush back to disk + if (file->file_data_address != 0xFFFFFFFF) + { + // Flush un-written data to file + if (file->file_data_dirty) + fl_fflush(file); + + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + } + + // Write as many sectors as possible + sectorsWrote = _write_sectors(file, sector, (uint8*)(buffer + bytesWritten), (length - bytesWritten) / FAT_SECTOR_SIZE); + copyCount = FAT_SECTOR_SIZE * sectorsWrote; + + // Increase total read count + bytesWritten += copyCount; + + // Increment file pointer + file->bytenum += copyCount; + + // Move onto next sector and reset copy offset + sector+= sectorsWrote; + offset = 0; + + if (!sectorsWrote) + break; + } + else + { + // We have upto one sector to copy + copyCount = FAT_SECTOR_SIZE - offset; + + // Only require some of this sector? + if (copyCount > (length - bytesWritten)) + copyCount = (length - bytesWritten); + + // Do we need to read a new sector? + if (file->file_data_address != sector) + { + // Flush un-written data to file + if (file->file_data_dirty) + fl_fflush(file); + + // If we plan to overwrite the whole sector, we don't need to read it first! + if (copyCount != FAT_SECTOR_SIZE) + { + // NOTE: This does not have succeed; if last sector of file + // reached, no valid data will be read in, but write will + // allocate some more space for new data. + + // Get LBA of sector offset within file + if (!_read_sectors(file, sector, file->file_data_sector, 1)) + memset(file->file_data_sector, 0x00, FAT_SECTOR_SIZE); + } + + file->file_data_address = sector; + file->file_data_dirty = 0; + } + + // Copy from application buffer into sector buffer + memcpy((uint8*)(file->file_data_sector + offset), (uint8*)(buffer + bytesWritten), copyCount); + + // Mark buffer as dirty + file->file_data_dirty = 1; + + // Increase total read count + bytesWritten += copyCount; + + // Increment file pointer + file->bytenum += copyCount; + + // Move onto next sector and reset copy offset + sector++; + offset = 0; + } + } + + // Write increased extent of the file? + if (file->bytenum > file->filelength) + { + // Increase file size to new point + file->filelength = file->bytenum; + + // We are changing the file length and this + // will need to be writen back at some point + file->filelength_changed = 1; + } + +#if FATFS_INC_TIME_DATE_SUPPORT + // If time & date support is enabled, always force directory entry to be + // written in-order to update file modify / access time & date. + file->filelength_changed = 1; +#endif + + FL_UNLOCK(&_fs); + + return (size*count); +} +#endif +//----------------------------------------------------------------------------- +// fl_fputs: Write a character string to the stream +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_fputs(const char * str, void *f) +{ + int len = (int)strlen(str); + int res = fl_fwrite(str, 1, len, f); + + if (res == len) + return len; + else + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_remove: Remove a file from the filesystem +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_remove( const char * filename ) +{ + FL_FILE* file; + int res = -1; + + FL_LOCK(&_fs); + + // Use read_file as this will check if the file is already open! + file = fl_fopen((char*)filename, "r"); + if (file) + { + // Delete allocated space + if (fatfs_free_cluster_chain(&_fs, file->startcluster)) + { + // Remove directory entries + if (fatfs_mark_file_deleted(&_fs, file->parentcluster, (char*)file->shortfilename)) + { + // Close the file handle (this should not write anything to the file + // as we have not changed the file since opening it!) + fl_fclose(file); + + res = 0; + } + } + } + + FL_UNLOCK(&_fs); + + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_createdirectory: Create a directory based on a path +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_createdirectory(const char *path) +{ + int res; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + res =_create_directory((char*)path); + FL_UNLOCK(&_fs); + + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_listdirectory: List a directory based on a path +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +void fl_listdirectory(const char *path) +{ + FL_DIR dirstat; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + + FAT_PRINTF(("\r\nDirectory %s\r\n", path)); + + if (fl_opendir(path, &dirstat)) + { + struct fs_dir_ent dirent; + + while (fl_readdir(&dirstat, &dirent) == 0) + { +#if FATFS_INC_TIME_DATE_SUPPORT + int d,m,y,h,mn,s; + fatfs_convert_from_fat_time(dirent.write_time, &h,&m,&s); + fatfs_convert_from_fat_date(dirent.write_date, &d,&mn,&y); + FAT_PRINTF(("%02d/%02d/%04d %02d:%02d ", d,mn,y,h,m)); +#endif + + if (dirent.is_dir) + { + FAT_PRINTF(("%s \r\n", dirent.filename)); + } + else + { + FAT_PRINTF(("%s [%d bytes]\r\n", dirent.filename, dirent.size)); + } + } + + fl_closedir(&dirstat); + } + + FL_UNLOCK(&_fs); +} +#endif +//----------------------------------------------------------------------------- +// fl_opendir: Opens a directory for listing +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +FL_DIR* fl_opendir(const char* path, FL_DIR *dir) +{ + int levels; + int res = 1; + uint32 cluster = FAT32_INVALID_CLUSTER; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + + levels = fatfs_total_path_levels((char*)path) + 1; + + // If path is in the root dir + if (levels == 0) + cluster = fatfs_get_root_cluster(&_fs); + // Find parent directory start cluster + else + res = _open_directory((char*)path, &cluster); + + if (res) + fatfs_list_directory_start(&_fs, dir, cluster); + + FL_UNLOCK(&_fs); + + return cluster != FAT32_INVALID_CLUSTER ? dir : 0; +} +#endif +//----------------------------------------------------------------------------- +// fl_readdir: Get next item in directory +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fl_readdir(FL_DIR *dirls, fl_dirent *entry) +{ + int res = 0; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + + res = fatfs_list_directory_next(&_fs, dirls, entry); + + FL_UNLOCK(&_fs); + + return res ? 0 : -1; +} +#endif +//----------------------------------------------------------------------------- +// fl_closedir: Close directory after listing +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fl_closedir(FL_DIR* dir) +{ + // Not used + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fl_is_dir: Is this a directory? +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fl_is_dir(const char *path) +{ + int res = 0; + FL_DIR dir; + + if (fl_opendir(path, &dir)) + { + res = 1; + fl_closedir(&dir); + } + + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_format: Format a partition with either FAT16 or FAT32 based on size +//----------------------------------------------------------------------------- +#if FATFS_INC_FORMAT_SUPPORT +int fl_format(uint32 volume_sectors, const char *name) +{ + return fatfs_format(&_fs, volume_sectors, name); +} +#endif /*FATFS_INC_FORMAT_SUPPORT*/ +//----------------------------------------------------------------------------- +// fl_get_fs: +//----------------------------------------------------------------------------- +#ifdef FATFS_INC_TEST_HOOKS +struct fatfs* fl_get_fs(void) +{ + return &_fs; +} +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_filelib.h b/src/hisocli/fat_io_lib/release/fat_filelib.h new file mode 100644 index 0000000..a40a28f --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_filelib.h @@ -0,0 +1,146 @@ +#ifndef __FAT_FILELIB_H__ +#define __FAT_FILELIB_H__ + +#include "fat_opts.h" +#include "fat_access.h" +#include "fat_list.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#ifndef SEEK_CUR + #define SEEK_CUR 1 +#endif + +#ifndef SEEK_END + #define SEEK_END 2 +#endif + +#ifndef SEEK_SET + #define SEEK_SET 0 +#endif + +#ifndef EOF + #define EOF (-1) +#endif + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct sFL_FILE; + +struct cluster_lookup +{ + uint32 ClusterIdx; + uint32 CurrentCluster; +}; + +typedef struct sFL_FILE +{ + uint32 parentcluster; + uint32 startcluster; + uint32 bytenum; + uint32 filelength; + int filelength_changed; + char path[FATFS_MAX_LONG_FILENAME]; + char filename[FATFS_MAX_LONG_FILENAME]; + uint8 shortfilename[11]; + +#ifdef FAT_CLUSTER_CACHE_ENTRIES + uint32 cluster_cache_idx[FAT_CLUSTER_CACHE_ENTRIES]; + uint32 cluster_cache_data[FAT_CLUSTER_CACHE_ENTRIES]; +#endif + + // Cluster Lookup + struct cluster_lookup last_fat_lookup; + + // Read/Write sector buffer + uint8 file_data_sector[FAT_SECTOR_SIZE]; + uint32 file_data_address; + int file_data_dirty; + + // File fopen flags + uint8 flags; +#define FILE_READ (1 << 0) +#define FILE_WRITE (1 << 1) +#define FILE_APPEND (1 << 2) +#define FILE_BINARY (1 << 3) +#define FILE_ERASE (1 << 4) +#define FILE_CREATE (1 << 5) + + struct fat_node list_node; +} FL_FILE; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- + +// External +void fl_init(void); +void fl_attach_locks(void (*lock)(void), void (*unlock)(void)); +int fl_attach_media(fn_diskio_read rd, fn_diskio_write wr); +void fl_shutdown(void); + +// Standard API +void* fl_fopen(const char *path, const char *modifiers); +void fl_fclose(void *file); +int fl_fflush(void *file); +int fl_fgetc(void *file); +char * fl_fgets(char *s, int n, void *f); +int fl_fputc(int c, void *file); +int fl_fputs(const char * str, void *file); +int fl_fwrite(const void * data, int size, int count, void *file ); +int fl_fread(void * data, int size, int count, void *file ); +int fl_fseek(void *file , long offset , int origin ); +int fl_fgetpos(void *file , uint32 * position); +long fl_ftell(void *f); +int fl_feof(void *f); +int fl_remove(const char * filename); + +// Equivelant dirent.h +typedef struct fs_dir_list_status FL_DIR; +typedef struct fs_dir_ent fl_dirent; + +FL_DIR* fl_opendir(const char* path, FL_DIR *dir); +int fl_readdir(FL_DIR *dirls, fl_dirent *entry); +int fl_closedir(FL_DIR* dir); + +// Extensions +void fl_listdirectory(const char *path); +int fl_createdirectory(const char *path); +int fl_is_dir(const char *path); + +int fl_format(uint32 volume_sectors, const char *name); + +// Test hooks +#ifdef FATFS_INC_TEST_HOOKS +struct fatfs* fl_get_fs(void); +#endif + +//----------------------------------------------------------------------------- +// Stdio file I/O names +//----------------------------------------------------------------------------- +#ifdef USE_FILELIB_STDIO_COMPAT_NAMES + +#define FILE FL_FILE + +#define fopen(a,b) fl_fopen(a, b) +#define fclose(a) fl_fclose(a) +#define fflush(a) fl_fflush(a) +#define fgetc(a) fl_fgetc(a) +#define fgets(a,b,c) fl_fgets(a, b, c) +#define fputc(a,b) fl_fputc(a, b) +#define fputs(a,b) fl_fputs(a, b) +#define fwrite(a,b,c,d) fl_fwrite(a, b, c, d) +#define fread(a,b,c,d) fl_fread(a, b, c, d) +#define fseek(a,b,c) fl_fseek(a, b, c) +#define fgetpos(a,b) fl_fgetpos(a, b) +#define ftell(a) fl_ftell(a) +#define feof(a) fl_feof(a) +#define remove(a) fl_remove(a) +#define mkdir(a) fl_createdirectory(a) +#define rmdir(a) 0 + +#endif + +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_format.c b/src/hisocli/fat_io_lib/release/fat_format.c new file mode 100644 index 0000000..d067f37 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_format.c @@ -0,0 +1,532 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_string.h" +#include "fat_misc.h" +#include "fat_format.h" + +#if FATFS_INC_FORMAT_SUPPORT + +//----------------------------------------------------------------------------- +// Tables +//----------------------------------------------------------------------------- +struct sec_per_clus_table +{ + uint32 sectors; + uint8 sectors_per_cluster; +}; + +struct sec_per_clus_table _cluster_size_table16[] = +{ + { 32680, 2}, // 16MB - 1K + { 262144, 4}, // 128MB - 2K + { 524288, 8}, // 256MB - 4K + { 1048576, 16}, // 512MB - 8K + { 2097152, 32}, // 1GB - 16K + { 4194304, 64}, // 2GB - 32K + { 8388608, 128},// 2GB - 64K [Warning only supported by Windows XP onwards] + { 0 , 0 } // Invalid +}; + +struct sec_per_clus_table _cluster_size_table32[] = +{ + { 532480, 1}, // 260MB - 512b + { 16777216, 8}, // 8GB - 4K + { 33554432, 16}, // 16GB - 8K + { 67108864, 32}, // 32GB - 16K + { 0xFFFFFFFF, 64},// >32GB - 32K + { 0 , 0 } // Invalid +}; + +//----------------------------------------------------------------------------- +// fatfs_calc_cluster_size: Calculate what cluster size should be used +//----------------------------------------------------------------------------- +static uint8 fatfs_calc_cluster_size(uint32 sectors, int is_fat32) +{ + int i; + + if (!is_fat32) + { + for (i=0; _cluster_size_table16[i].sectors_per_cluster != 0;i++) + if (sectors <= _cluster_size_table16[i].sectors) + return _cluster_size_table16[i].sectors_per_cluster; + } + else + { + for (i=0; _cluster_size_table32[i].sectors_per_cluster != 0;i++) + if (sectors <= _cluster_size_table32[i].sectors) + return _cluster_size_table32[i].sectors_per_cluster; + } + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_erase_sectors: Erase a number of sectors +//----------------------------------------------------------------------------- +static int fatfs_erase_sectors(struct fatfs *fs, uint32 lba, int count) +{ + int i; + + // Zero sector first + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + for (i=0;idisk_io.write_media(lba + i, fs->currentsector.sector, 1)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_create_boot_sector: Create the boot sector +//----------------------------------------------------------------------------- +static int fatfs_create_boot_sector(struct fatfs *fs, uint32 boot_sector_lba, uint32 vol_sectors, const char *name, int is_fat32) +{ + uint32 total_clusters; + int i; + + // Zero sector initially + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + // OEM Name & Jump Code + fs->currentsector.sector[0] = 0xEB; + fs->currentsector.sector[1] = 0x3C; + fs->currentsector.sector[2] = 0x90; + fs->currentsector.sector[3] = 0x4D; + fs->currentsector.sector[4] = 0x53; + fs->currentsector.sector[5] = 0x44; + fs->currentsector.sector[6] = 0x4F; + fs->currentsector.sector[7] = 0x53; + fs->currentsector.sector[8] = 0x35; + fs->currentsector.sector[9] = 0x2E; + fs->currentsector.sector[10] = 0x30; + + // Bytes per sector + fs->currentsector.sector[11] = (FAT_SECTOR_SIZE >> 0) & 0xFF; + fs->currentsector.sector[12] = (FAT_SECTOR_SIZE >> 8) & 0xFF; + + // Get sectors per cluster size for the disk + fs->sectors_per_cluster = fatfs_calc_cluster_size(vol_sectors, is_fat32); + if (!fs->sectors_per_cluster) + return 0; // Invalid disk size + + // Sectors per cluster + fs->currentsector.sector[13] = fs->sectors_per_cluster; + + // Reserved Sectors + if (!is_fat32) + fs->reserved_sectors = 8; + else + fs->reserved_sectors = 32; + fs->currentsector.sector[14] = (fs->reserved_sectors >> 0) & 0xFF; + fs->currentsector.sector[15] = (fs->reserved_sectors >> 8) & 0xFF; + + // Number of FATS + fs->num_of_fats = 2; + fs->currentsector.sector[16] = fs->num_of_fats; + + // Max entries in root dir (FAT16 only) + if (!is_fat32) + { + fs->root_entry_count = 512; + fs->currentsector.sector[17] = (fs->root_entry_count >> 0) & 0xFF; + fs->currentsector.sector[18] = (fs->root_entry_count >> 8) & 0xFF; + } + else + { + fs->root_entry_count = 0; + fs->currentsector.sector[17] = 0; + fs->currentsector.sector[18] = 0; + } + + // [FAT16] Total sectors (use FAT32 count instead) + fs->currentsector.sector[19] = 0x00; + fs->currentsector.sector[20] = 0x00; + + // Media type + fs->currentsector.sector[21] = 0xF8; + + + // FAT16 BS Details + if (!is_fat32) + { + // Count of sectors used by the FAT table (FAT16 only) + total_clusters = (vol_sectors / fs->sectors_per_cluster) + 1; + fs->fat_sectors = (total_clusters/(FAT_SECTOR_SIZE/2)) + 1; + fs->currentsector.sector[22] = (uint8)((fs->fat_sectors >> 0) & 0xFF); + fs->currentsector.sector[23] = (uint8)((fs->fat_sectors >> 8) & 0xFF); + + // Sectors per track + fs->currentsector.sector[24] = 0x00; + fs->currentsector.sector[25] = 0x00; + + // Heads + fs->currentsector.sector[26] = 0x00; + fs->currentsector.sector[27] = 0x00; + + // Hidden sectors + fs->currentsector.sector[28] = 0x20; + fs->currentsector.sector[29] = 0x00; + fs->currentsector.sector[30] = 0x00; + fs->currentsector.sector[31] = 0x00; + + // Total sectors for this volume + fs->currentsector.sector[32] = (uint8)((vol_sectors>>0)&0xFF); + fs->currentsector.sector[33] = (uint8)((vol_sectors>>8)&0xFF); + fs->currentsector.sector[34] = (uint8)((vol_sectors>>16)&0xFF); + fs->currentsector.sector[35] = (uint8)((vol_sectors>>24)&0xFF); + + // Drive number + fs->currentsector.sector[36] = 0x00; + + // Reserved + fs->currentsector.sector[37] = 0x00; + + // Boot signature + fs->currentsector.sector[38] = 0x29; + + // Volume ID + fs->currentsector.sector[39] = 0x12; + fs->currentsector.sector[40] = 0x34; + fs->currentsector.sector[41] = 0x56; + fs->currentsector.sector[42] = 0x78; + + // Volume name + for (i=0;i<11;i++) + { + if (i < (int)strlen(name)) + fs->currentsector.sector[i+43] = name[i]; + else + fs->currentsector.sector[i+43] = ' '; + } + + // File sys type + fs->currentsector.sector[54] = 'F'; + fs->currentsector.sector[55] = 'A'; + fs->currentsector.sector[56] = 'T'; + fs->currentsector.sector[57] = '1'; + fs->currentsector.sector[58] = '6'; + fs->currentsector.sector[59] = ' '; + fs->currentsector.sector[60] = ' '; + fs->currentsector.sector[61] = ' '; + + // Signature + fs->currentsector.sector[510] = 0x55; + fs->currentsector.sector[511] = 0xAA; + } + // FAT32 BS Details + else + { + // Count of sectors used by the FAT table (FAT16 only) + fs->currentsector.sector[22] = 0; + fs->currentsector.sector[23] = 0; + + // Sectors per track (default) + fs->currentsector.sector[24] = 0x3F; + fs->currentsector.sector[25] = 0x00; + + // Heads (default) + fs->currentsector.sector[26] = 0xFF; + fs->currentsector.sector[27] = 0x00; + + // Hidden sectors + fs->currentsector.sector[28] = 0x00; + fs->currentsector.sector[29] = 0x00; + fs->currentsector.sector[30] = 0x00; + fs->currentsector.sector[31] = 0x00; + + // Total sectors for this volume + fs->currentsector.sector[32] = (uint8)((vol_sectors>>0)&0xFF); + fs->currentsector.sector[33] = (uint8)((vol_sectors>>8)&0xFF); + fs->currentsector.sector[34] = (uint8)((vol_sectors>>16)&0xFF); + fs->currentsector.sector[35] = (uint8)((vol_sectors>>24)&0xFF); + + total_clusters = (vol_sectors / fs->sectors_per_cluster) + 1; + fs->fat_sectors = (total_clusters/(FAT_SECTOR_SIZE/4)) + 1; + + // BPB_FATSz32 + fs->currentsector.sector[36] = (uint8)((fs->fat_sectors>>0)&0xFF); + fs->currentsector.sector[37] = (uint8)((fs->fat_sectors>>8)&0xFF); + fs->currentsector.sector[38] = (uint8)((fs->fat_sectors>>16)&0xFF); + fs->currentsector.sector[39] = (uint8)((fs->fat_sectors>>24)&0xFF); + + // BPB_ExtFlags + fs->currentsector.sector[40] = 0; + fs->currentsector.sector[41] = 0; + + // BPB_FSVer + fs->currentsector.sector[42] = 0; + fs->currentsector.sector[43] = 0; + + // BPB_RootClus + fs->currentsector.sector[44] = (uint8)((fs->rootdir_first_cluster>>0)&0xFF); + fs->currentsector.sector[45] = (uint8)((fs->rootdir_first_cluster>>8)&0xFF); + fs->currentsector.sector[46] = (uint8)((fs->rootdir_first_cluster>>16)&0xFF); + fs->currentsector.sector[47] = (uint8)((fs->rootdir_first_cluster>>24)&0xFF); + + // BPB_FSInfo + fs->currentsector.sector[48] = (uint8)((fs->fs_info_sector>>0)&0xFF); + fs->currentsector.sector[49] = (uint8)((fs->fs_info_sector>>8)&0xFF); + + // BPB_BkBootSec + fs->currentsector.sector[50] = 6; + fs->currentsector.sector[51] = 0; + + // Drive number + fs->currentsector.sector[64] = 0x00; + + // Boot signature + fs->currentsector.sector[66] = 0x29; + + // Volume ID + fs->currentsector.sector[67] = 0x12; + fs->currentsector.sector[68] = 0x34; + fs->currentsector.sector[69] = 0x56; + fs->currentsector.sector[70] = 0x78; + + // Volume name + for (i=0;i<11;i++) + { + if (i < (int)strlen(name)) + fs->currentsector.sector[i+71] = name[i]; + else + fs->currentsector.sector[i+71] = ' '; + } + + // File sys type + fs->currentsector.sector[82] = 'F'; + fs->currentsector.sector[83] = 'A'; + fs->currentsector.sector[84] = 'T'; + fs->currentsector.sector[85] = '3'; + fs->currentsector.sector[86] = '2'; + fs->currentsector.sector[87] = ' '; + fs->currentsector.sector[88] = ' '; + fs->currentsector.sector[89] = ' '; + + // Signature + fs->currentsector.sector[510] = 0x55; + fs->currentsector.sector[511] = 0xAA; + } + + if (fs->disk_io.write_media(boot_sector_lba, fs->currentsector.sector, 1)) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_create_fsinfo_sector: Create the FSInfo sector (FAT32) +//----------------------------------------------------------------------------- +static int fatfs_create_fsinfo_sector(struct fatfs *fs, uint32 sector_lba) +{ + // Zero sector initially + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + // FSI_LeadSig + fs->currentsector.sector[0] = 0x52; + fs->currentsector.sector[1] = 0x52; + fs->currentsector.sector[2] = 0x61; + fs->currentsector.sector[3] = 0x41; + + // FSI_StrucSig + fs->currentsector.sector[484] = 0x72; + fs->currentsector.sector[485] = 0x72; + fs->currentsector.sector[486] = 0x41; + fs->currentsector.sector[487] = 0x61; + + // FSI_Free_Count + fs->currentsector.sector[488] = 0xFF; + fs->currentsector.sector[489] = 0xFF; + fs->currentsector.sector[490] = 0xFF; + fs->currentsector.sector[491] = 0xFF; + + // FSI_Nxt_Free + fs->currentsector.sector[492] = 0xFF; + fs->currentsector.sector[493] = 0xFF; + fs->currentsector.sector[494] = 0xFF; + fs->currentsector.sector[495] = 0xFF; + + // Signature + fs->currentsector.sector[510] = 0x55; + fs->currentsector.sector[511] = 0xAA; + + if (fs->disk_io.write_media(sector_lba, fs->currentsector.sector, 1)) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_erase_fat: Erase FAT table using fs details in fs struct +//----------------------------------------------------------------------------- +static int fatfs_erase_fat(struct fatfs *fs, int is_fat32) +{ + uint32 i; + + // Zero sector initially + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + // Initialise default allocate / reserved clusters + if (!is_fat32) + { + SET_16BIT_WORD(fs->currentsector.sector, 0, 0xFFF8); + SET_16BIT_WORD(fs->currentsector.sector, 2, 0xFFFF); + } + else + { + SET_32BIT_WORD(fs->currentsector.sector, 0, 0x0FFFFFF8); + SET_32BIT_WORD(fs->currentsector.sector, 4, 0xFFFFFFFF); + SET_32BIT_WORD(fs->currentsector.sector, 8, 0x0FFFFFFF); + } + + if (!fs->disk_io.write_media(fs->fat_begin_lba + 0, fs->currentsector.sector, 1)) + return 0; + + // Zero remaining FAT sectors + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + for (i=1;ifat_sectors*fs->num_of_fats;i++) + if (!fs->disk_io.write_media(fs->fat_begin_lba + i, fs->currentsector.sector, 1)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_format_fat16: Format a FAT16 partition +//----------------------------------------------------------------------------- +int fatfs_format_fat16(struct fatfs *fs, uint32 volume_sectors, const char *name) +{ + fs->currentsector.address = FAT32_INVALID_CLUSTER; + fs->currentsector.dirty = 0; + + fs->next_free_cluster = 0; // Invalid + + fatfs_fat_init(fs); + + // Make sure we have read + write functions + if (!fs->disk_io.read_media || !fs->disk_io.write_media) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Volume is FAT16 + fs->fat_type = FAT_TYPE_16; + + // Not valid for FAT16 + fs->fs_info_sector = 0; + fs->rootdir_first_cluster = 0; + + // Sector 0: Boot sector + // NOTE: We don't need an MBR, it is a waste of a good sector! + fs->lba_begin = 0; + if (!fatfs_create_boot_sector(fs, fs->lba_begin, volume_sectors, name, 0)) + return 0; + + // For FAT16 (which this may be), rootdir_first_cluster is actuall rootdir_first_sector + fs->rootdir_first_sector = fs->reserved_sectors + (fs->num_of_fats * fs->fat_sectors); + fs->rootdir_sectors = ((fs->root_entry_count * 32) + (FAT_SECTOR_SIZE - 1)) / FAT_SECTOR_SIZE; + + // First FAT LBA address + fs->fat_begin_lba = fs->lba_begin + fs->reserved_sectors; + + // The address of the first data cluster on this volume + fs->cluster_begin_lba = fs->fat_begin_lba + (fs->num_of_fats * fs->fat_sectors); + + // Initialise FAT sectors + if (!fatfs_erase_fat(fs, 0)) + return 0; + + // Erase Root directory + if (!fatfs_erase_sectors(fs, fs->lba_begin + fs->rootdir_first_sector, fs->rootdir_sectors)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_format_fat32: Format a FAT32 partition +//----------------------------------------------------------------------------- +int fatfs_format_fat32(struct fatfs *fs, uint32 volume_sectors, const char *name) +{ + fs->currentsector.address = FAT32_INVALID_CLUSTER; + fs->currentsector.dirty = 0; + + fs->next_free_cluster = 0; // Invalid + + fatfs_fat_init(fs); + + // Make sure we have read + write functions + if (!fs->disk_io.read_media || !fs->disk_io.write_media) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Volume is FAT32 + fs->fat_type = FAT_TYPE_32; + + // Basic defaults for normal FAT32 partitions + fs->fs_info_sector = 1; + fs->rootdir_first_cluster = 2; + + // Sector 0: Boot sector + // NOTE: We don't need an MBR, it is a waste of a good sector! + fs->lba_begin = 0; + if (!fatfs_create_boot_sector(fs, fs->lba_begin, volume_sectors, name, 1)) + return 0; + + // First FAT LBA address + fs->fat_begin_lba = fs->lba_begin + fs->reserved_sectors; + + // The address of the first data cluster on this volume + fs->cluster_begin_lba = fs->fat_begin_lba + (fs->num_of_fats * fs->fat_sectors); + + // Initialise FSInfo sector + if (!fatfs_create_fsinfo_sector(fs, fs->fs_info_sector)) + return 0; + + // Initialise FAT sectors + if (!fatfs_erase_fat(fs, 1)) + return 0; + + // Erase Root directory + if (!fatfs_erase_sectors(fs, fatfs_lba_of_cluster(fs, fs->rootdir_first_cluster), fs->sectors_per_cluster)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_format: Format a partition with either FAT16 or FAT32 based on size +//----------------------------------------------------------------------------- +int fatfs_format(struct fatfs *fs, uint32 volume_sectors, const char *name) +{ + // 2GB - 32K limit for safe behaviour for FAT16 + if (volume_sectors <= 4194304) + return fatfs_format_fat16(fs, volume_sectors, name); + else + return fatfs_format_fat32(fs, volume_sectors, name); +} +#endif /*FATFS_INC_FORMAT_SUPPORT*/ diff --git a/src/hisocli/fat_io_lib/release/fat_format.h b/src/hisocli/fat_io_lib/release/fat_format.h new file mode 100644 index 0000000..a8a6bba --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_format.h @@ -0,0 +1,15 @@ +#ifndef __FAT_FORMAT_H__ +#define __FAT_FORMAT_H__ + +#include "fat_defs.h" +#include "fat_opts.h" +#include "fat_access.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_format(struct fatfs *fs, uint32 volume_sectors, const char *name); +int fatfs_format_fat16(struct fatfs *fs, uint32 volume_sectors, const char *name); +int fatfs_format_fat32(struct fatfs *fs, uint32 volume_sectors, const char *name); + +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_list.h b/src/hisocli/fat_io_lib/release/fat_list.h new file mode 100644 index 0000000..bd386ef --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_list.h @@ -0,0 +1,161 @@ +#ifndef __FAT_LIST_H__ +#define __FAT_LIST_H__ + +#ifndef FAT_ASSERT + #define FAT_ASSERT(x) +#endif + +#ifndef FAT_INLINE + #define FAT_INLINE +#endif + +//----------------------------------------------------------------- +// Types +//----------------------------------------------------------------- +struct fat_list; + +struct fat_node +{ + struct fat_node *previous; + struct fat_node *next; +}; + +struct fat_list +{ + struct fat_node *head; + struct fat_node *tail; +}; + +//----------------------------------------------------------------- +// Macros +//----------------------------------------------------------------- +#define fat_list_entry(p, t, m) p ? ((t *)((char *)(p)-(char*)(&((t *)0)->m))) : 0 +#define fat_list_next(l, p) (p)->next +#define fat_list_prev(l, p) (p)->previous +#define fat_list_first(l) (l)->head +#define fat_list_last(l) (l)->tail +#define fat_list_for_each(l, p) for ((p) = (l)->head; (p); (p) = (p)->next) + +//----------------------------------------------------------------- +// Inline Functions +//----------------------------------------------------------------- + +//----------------------------------------------------------------- +// fat_list_init: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_init(struct fat_list *list) +{ + FAT_ASSERT(list); + + list->head = list->tail = 0; +} +//----------------------------------------------------------------- +// fat_list_remove: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_remove(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if(!node->previous) + list->head = node->next; + else + node->previous->next = node->next; + + if(!node->next) + list->tail = node->previous; + else + node->next->previous = node->previous; +} +//----------------------------------------------------------------- +// fat_list_insert_after: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_after(struct fat_list *list, struct fat_node *node, struct fat_node *new_node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + FAT_ASSERT(new_node); + + new_node->previous = node; + new_node->next = node->next; + if (!node->next) + list->tail = new_node; + else + node->next->previous = new_node; + node->next = new_node; +} +//----------------------------------------------------------------- +// fat_list_insert_before: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_before(struct fat_list *list, struct fat_node *node, struct fat_node *new_node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + FAT_ASSERT(new_node); + + new_node->previous = node->previous; + new_node->next = node; + if (!node->previous) + list->head = new_node; + else + node->previous->next = new_node; + node->previous = new_node; +} +//----------------------------------------------------------------- +// fat_list_insert_first: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_first(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if (!list->head) + { + list->head = node; + list->tail = node; + node->previous = 0; + node->next = 0; + } + else + fat_list_insert_before(list, list->head, node); +} +//----------------------------------------------------------------- +// fat_list_insert_last: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_last(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if (!list->tail) + fat_list_insert_first(list, node); + else + fat_list_insert_after(list, list->tail, node); +} +//----------------------------------------------------------------- +// fat_list_is_empty: +//----------------------------------------------------------------- +static FAT_INLINE int fat_list_is_empty(struct fat_list *list) +{ + FAT_ASSERT(list); + + return !list->head; +} +//----------------------------------------------------------------- +// fat_list_pop_head: +//----------------------------------------------------------------- +static FAT_INLINE struct fat_node * fat_list_pop_head(struct fat_list *list) +{ + struct fat_node * node; + + FAT_ASSERT(list); + + node = fat_list_first(list); + if (node) + fat_list_remove(list, node); + + return node; +} + +#endif + diff --git a/src/hisocli/fat_io_lib/release/fat_misc.c b/src/hisocli/fat_io_lib/release/fat_misc.c new file mode 100644 index 0000000..cbf6f08 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_misc.c @@ -0,0 +1,505 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include +#include "fat_misc.h" + +//----------------------------------------------------------------------------- +// fatfs_lfn_cache_init: Clear long file name cache +//----------------------------------------------------------------------------- +void fatfs_lfn_cache_init(struct lfn_cache *lfn, int wipeTable) +{ + int i = 0; + + lfn->no_of_strings = 0; + +#if FATFS_INC_LFN_SUPPORT + + // Zero out buffer also + if (wipeTable) + for (i=0;iString[i], 0x00, MAX_LFN_ENTRY_LENGTH); +#endif +} +//----------------------------------------------------------------------------- +// fatfs_lfn_cache_entry - Function extracts long file name text from sector +// at a specific offset +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +void fatfs_lfn_cache_entry(struct lfn_cache *lfn, uint8 *entryBuffer) +{ + uint8 LFNIndex, i; + LFNIndex = entryBuffer[0] & 0x1F; + + // Limit file name to cache size! + if (LFNIndex > MAX_LONGFILENAME_ENTRIES) + return ; + + // This is an error condition + if (LFNIndex == 0) + return ; + + if (lfn->no_of_strings == 0) + lfn->no_of_strings = LFNIndex; + + lfn->String[LFNIndex-1][0] = entryBuffer[1]; + lfn->String[LFNIndex-1][1] = entryBuffer[3]; + lfn->String[LFNIndex-1][2] = entryBuffer[5]; + lfn->String[LFNIndex-1][3] = entryBuffer[7]; + lfn->String[LFNIndex-1][4] = entryBuffer[9]; + lfn->String[LFNIndex-1][5] = entryBuffer[0x0E]; + lfn->String[LFNIndex-1][6] = entryBuffer[0x10]; + lfn->String[LFNIndex-1][7] = entryBuffer[0x12]; + lfn->String[LFNIndex-1][8] = entryBuffer[0x14]; + lfn->String[LFNIndex-1][9] = entryBuffer[0x16]; + lfn->String[LFNIndex-1][10] = entryBuffer[0x18]; + lfn->String[LFNIndex-1][11] = entryBuffer[0x1C]; + lfn->String[LFNIndex-1][12] = entryBuffer[0x1E]; + + for (i=0; iString[LFNIndex-1][i]==0xFF) + lfn->String[LFNIndex-1][i] = 0x20; // Replace with spaces +} +#endif +//----------------------------------------------------------------------------- +// fatfs_lfn_cache_get: Get a reference to the long filename +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +char* fatfs_lfn_cache_get(struct lfn_cache *lfn) +{ + // Null terminate long filename + if (lfn->no_of_strings == MAX_LONGFILENAME_ENTRIES) + lfn->Null = '\0'; + else if (lfn->no_of_strings) + lfn->String[lfn->no_of_strings][0] = '\0'; + else + lfn->String[0][0] = '\0'; + + return (char*)&lfn->String[0][0]; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_lfn_text: If LFN text entry found +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_entry_lfn_text(struct fat_dir_entry *entry) +{ + if ((entry->Attr & FILE_ATTR_LFN_TEXT) == FILE_ATTR_LFN_TEXT) + return 1; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_lfn_invalid: If SFN found not relating to LFN +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_entry_lfn_invalid(struct fat_dir_entry *entry) +{ + if ( (entry->Name[0]==FILE_HEADER_BLANK) || + (entry->Name[0]==FILE_HEADER_DELETED)|| + (entry->Attr==FILE_ATTR_VOLUME_ID) || + (entry->Attr & FILE_ATTR_SYSHID) ) + return 1; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_lfn_exists: If LFN exists and correlation SFN found +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_entry_lfn_exists(struct lfn_cache *lfn, struct fat_dir_entry *entry) +{ + if ( (entry->Attr!=FILE_ATTR_LFN_TEXT) && + (entry->Name[0]!=FILE_HEADER_BLANK) && + (entry->Name[0]!=FILE_HEADER_DELETED) && + (entry->Attr!=FILE_ATTR_VOLUME_ID) && + (!(entry->Attr&FILE_ATTR_SYSHID)) && + (lfn->no_of_strings) ) + return 1; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_sfn_only: If SFN only exists +//----------------------------------------------------------------------------- +int fatfs_entry_sfn_only(struct fat_dir_entry *entry) +{ + if ( (entry->Attr!=FILE_ATTR_LFN_TEXT) && + (entry->Name[0]!=FILE_HEADER_BLANK) && + (entry->Name[0]!=FILE_HEADER_DELETED) && + (entry->Attr!=FILE_ATTR_VOLUME_ID) && + (!(entry->Attr&FILE_ATTR_SYSHID)) ) + return 1; + else + return 0; +} +// TODO: FILE_ATTR_SYSHID ?!?!??! +//----------------------------------------------------------------------------- +// fatfs_entry_is_dir: Returns 1 if a directory +//----------------------------------------------------------------------------- +int fatfs_entry_is_dir(struct fat_dir_entry *entry) +{ + if (entry->Attr & FILE_TYPE_DIR) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_entry_is_file: Returns 1 is a file entry +//----------------------------------------------------------------------------- +int fatfs_entry_is_file(struct fat_dir_entry *entry) +{ + if (entry->Attr & FILE_TYPE_FILE) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_lfn_entries_required: Calculate number of 13 characters entries +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_lfn_entries_required(char *filename) +{ + int length = (int)strlen(filename); + + if (length) + return (length + MAX_LFN_ENTRY_LENGTH - 1) / MAX_LFN_ENTRY_LENGTH; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_filename_to_lfn: +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +void fatfs_filename_to_lfn(char *filename, uint8 *buffer, int entry, uint8 sfnChk) +{ + int i; + int nameIndexes[MAX_LFN_ENTRY_LENGTH] = {1,3,5,7,9,0x0E,0x10,0x12,0x14,0x16,0x18,0x1C,0x1E}; + + // 13 characters entries + int length = (int)strlen(filename); + int entriesRequired = fatfs_lfn_entries_required(filename); + + // Filename offset + int start = entry * MAX_LFN_ENTRY_LENGTH; + + // Initialise to zeros + memset(buffer, 0x00, FAT_DIR_ENTRY_SIZE); + + // LFN entry number + buffer[0] = (uint8)(((entriesRequired-1)==entry)?(0x40|(entry+1)):(entry+1)); + + // LFN flag + buffer[11] = 0x0F; + + // Checksum of short filename + buffer[13] = sfnChk; + + // Copy to buffer + for (i=0;iName[i] = shortfilename[i]; + + // Unless we have a RTC we might as well set these to 1980 + entry->CrtTimeTenth = 0x00; + entry->CrtTime[1] = entry->CrtTime[0] = 0x00; + entry->CrtDate[1] = 0x00; + entry->CrtDate[0] = 0x20; + entry->LstAccDate[1] = 0x00; + entry->LstAccDate[0] = 0x20; + entry->WrtTime[1] = entry->WrtTime[0] = 0x00; + entry->WrtDate[1] = 0x00; + entry->WrtDate[0] = 0x20; + + if (!dir) + entry->Attr = FILE_TYPE_FILE; + else + entry->Attr = FILE_TYPE_DIR; + + entry->NTRes = 0x00; + + entry->FstClusHI = FAT_HTONS((uint16)((startCluster>>16) & 0xFFFF)); + entry->FstClusLO = FAT_HTONS((uint16)((startCluster>>0) & 0xFFFF)); + entry->FileSize = FAT_HTONL(size); +} +#endif +//----------------------------------------------------------------------------- +// fatfs_lfn_create_sfn: Create a padded SFN +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_lfn_create_sfn(char *sfn_output, char *filename) +{ + int i; + int dotPos = -1; + char ext[3]; + int pos; + int len = (int)strlen(filename); + + // Invalid to start with . + if (filename[0]=='.') + return 0; + + memset(sfn_output, ' ', FAT_SFN_SIZE_FULL); + memset(ext, ' ', 3); + + // Find dot seperator + for (i = 0; i< len; i++) + { + if (filename[i]=='.') + dotPos = i; + } + + // Extract extensions + if (dotPos!=-1) + { + // Copy first three chars of extension + for (i = (dotPos+1); i < (dotPos+1+3); i++) + if (i= 'a' && filename[i] <= 'z') + sfn_output[pos++] = filename[i] - 'a' + 'A'; + else + sfn_output[pos++] = filename[i]; + } + + // Fill upto 8 characters + if (pos==FAT_SFN_SIZE_PARTIAL) + break; + } + + // Add extension part + for (i=FAT_SFN_SIZE_PARTIAL;i= 'a' && ext[i-FAT_SFN_SIZE_PARTIAL] <= 'z') + sfn_output[i] = ext[i-FAT_SFN_SIZE_PARTIAL] - 'a' + 'A'; + else + sfn_output[i] = ext[i-FAT_SFN_SIZE_PARTIAL]; + } + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_itoa: +//----------------------------------------------------------------------------- +static void fatfs_itoa(uint32 num, char *s) +{ + char* cp; + char outbuf[12]; + const char digits[] = "0123456789ABCDEF"; + + // Build string backwards + cp = outbuf; + do + { + *cp++ = digits[(int)(num % 10)]; + } + while ((num /= 10) > 0); + + *cp-- = 0; + + // Copy in forwards + while (cp >= outbuf) + *s++ = *cp--; + + *s = 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_lfn_generate_tail: +// sfn_input = Input short filename, spaced format & in upper case +// sfn_output = Output short filename with tail +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +#if FATFS_INC_WRITE_SUPPORT +int fatfs_lfn_generate_tail(char *sfn_output, char *sfn_input, uint32 tailNum) +{ + int tail_chars; + char tail_str[12]; + + if (tailNum > 99999) + return 0; + + // Convert to number + memset(tail_str, 0x00, sizeof(tail_str)); + tail_str[0] = '~'; + fatfs_itoa(tailNum, tail_str+1); + + // Copy in base filename + memcpy(sfn_output, sfn_input, FAT_SFN_SIZE_FULL); + + // Overwrite with tail + tail_chars = (int)strlen(tail_str); + memcpy(sfn_output+(FAT_SFN_SIZE_PARTIAL-tail_chars), tail_str, tail_chars); + + return 1; +} +#endif +#endif +//----------------------------------------------------------------------------- +// fatfs_convert_from_fat_time: Convert FAT time to h/m/s +//----------------------------------------------------------------------------- +#if FATFS_INC_TIME_DATE_SUPPORT +void fatfs_convert_from_fat_time(uint16 fat_time, int *hours, int *minutes, int *seconds) +{ + *hours = (fat_time >> FAT_TIME_HOURS_SHIFT) & FAT_TIME_HOURS_MASK; + *minutes = (fat_time >> FAT_TIME_MINUTES_SHIFT) & FAT_TIME_MINUTES_MASK; + *seconds = (fat_time >> FAT_TIME_SECONDS_SHIFT) & FAT_TIME_SECONDS_MASK; + *seconds = *seconds * FAT_TIME_SECONDS_SCALE; +} +//----------------------------------------------------------------------------- +// fatfs_convert_from_fat_date: Convert FAT date to d/m/y +//----------------------------------------------------------------------------- +void fatfs_convert_from_fat_date(uint16 fat_date, int *day, int *month, int *year) +{ + *day = (fat_date >> FAT_DATE_DAY_SHIFT) & FAT_DATE_DAY_MASK; + *month = (fat_date >> FAT_DATE_MONTH_SHIFT) & FAT_DATE_MONTH_MASK; + *year = (fat_date >> FAT_DATE_YEAR_SHIFT) & FAT_DATE_YEAR_MASK; + *year = *year + FAT_DATE_YEAR_OFFSET; +} +//----------------------------------------------------------------------------- +// fatfs_convert_to_fat_time: Convert h/m/s to FAT time +//----------------------------------------------------------------------------- +uint16 fatfs_convert_to_fat_time(int hours, int minutes, int seconds) +{ + uint16 fat_time = 0; + + // Most FAT times are to a resolution of 2 seconds + seconds /= FAT_TIME_SECONDS_SCALE; + + fat_time = (hours & FAT_TIME_HOURS_MASK) << FAT_TIME_HOURS_SHIFT; + fat_time|= (minutes & FAT_TIME_MINUTES_MASK) << FAT_TIME_MINUTES_SHIFT; + fat_time|= (seconds & FAT_TIME_SECONDS_MASK) << FAT_TIME_SECONDS_SHIFT; + + return fat_time; +} +//----------------------------------------------------------------------------- +// fatfs_convert_to_fat_date: Convert d/m/y to FAT date +//----------------------------------------------------------------------------- +uint16 fatfs_convert_to_fat_date(int day, int month, int year) +{ + uint16 fat_date = 0; + + // FAT dates are relative to 1980 + if (year >= FAT_DATE_YEAR_OFFSET) + year -= FAT_DATE_YEAR_OFFSET; + + fat_date = (day & FAT_DATE_DAY_MASK) << FAT_DATE_DAY_SHIFT; + fat_date|= (month & FAT_DATE_MONTH_MASK) << FAT_DATE_MONTH_SHIFT; + fat_date|= (year & FAT_DATE_YEAR_MASK) << FAT_DATE_YEAR_SHIFT; + + return fat_date; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_print_sector: +//----------------------------------------------------------------------------- +#ifdef FATFS_DEBUG +void fatfs_print_sector(uint32 sector, uint8 *data) +{ + int i; + int j; + + FAT_PRINTF(("Sector %d:\n", sector)); + + for (i=0;i 31 && ch < 127) + { + FAT_PRINTF(("%c", ch)); + } + else + { + FAT_PRINTF((".")); + } + } + + FAT_PRINTF(("\n")); + } + } +} +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_misc.h b/src/hisocli/fat_io_lib/release/fat_misc.h new file mode 100644 index 0000000..0c02634 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_misc.h @@ -0,0 +1,63 @@ +#ifndef __FAT_MISC_H__ +#define __FAT_MISC_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#define MAX_LONGFILENAME_ENTRIES 20 +#define MAX_LFN_ENTRY_LENGTH 13 + +//----------------------------------------------------------------------------- +// Macros +//----------------------------------------------------------------------------- +#define GET_32BIT_WORD(buffer, location) ( ((uint32)buffer[location+3]<<24) + ((uint32)buffer[location+2]<<16) + ((uint32)buffer[location+1]<<8) + (uint32)buffer[location+0] ) +#define GET_16BIT_WORD(buffer, location) ( ((uint16)buffer[location+1]<<8) + (uint16)buffer[location+0] ) + +#define SET_32BIT_WORD(buffer, location, value) { buffer[location+0] = (uint8)((value)&0xFF); \ + buffer[location+1] = (uint8)((value>>8)&0xFF); \ + buffer[location+2] = (uint8)((value>>16)&0xFF); \ + buffer[location+3] = (uint8)((value>>24)&0xFF); } + +#define SET_16BIT_WORD(buffer, location, value) { buffer[location+0] = (uint8)((value)&0xFF); \ + buffer[location+1] = (uint8)((value>>8)&0xFF); } + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct lfn_cache +{ +#if FATFS_INC_LFN_SUPPORT + // Long File Name Structure (max 260 LFN length) + uint8 String[MAX_LONGFILENAME_ENTRIES][MAX_LFN_ENTRY_LENGTH]; + uint8 Null; +#endif + uint8 no_of_strings; +}; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +void fatfs_lfn_cache_init(struct lfn_cache *lfn, int wipeTable); +void fatfs_lfn_cache_entry(struct lfn_cache *lfn, uint8 *entryBuffer); +char* fatfs_lfn_cache_get(struct lfn_cache *lfn); +int fatfs_entry_lfn_text(struct fat_dir_entry *entry); +int fatfs_entry_lfn_invalid(struct fat_dir_entry *entry); +int fatfs_entry_lfn_exists(struct lfn_cache *lfn, struct fat_dir_entry *entry); +int fatfs_entry_sfn_only(struct fat_dir_entry *entry); +int fatfs_entry_is_dir(struct fat_dir_entry *entry); +int fatfs_entry_is_file(struct fat_dir_entry *entry); +int fatfs_lfn_entries_required(char *filename); +void fatfs_filename_to_lfn(char *filename, uint8 *buffer, int entry, uint8 sfnChk); +void fatfs_sfn_create_entry(char *shortfilename, uint32 size, uint32 startCluster, struct fat_dir_entry *entry, int dir); +int fatfs_lfn_create_sfn(char *sfn_output, char *filename); +int fatfs_lfn_generate_tail(char *sfn_output, char *sfn_input, uint32 tailNum); +void fatfs_convert_from_fat_time(uint16 fat_time, int *hours, int *minutes, int *seconds); +void fatfs_convert_from_fat_date(uint16 fat_date, int *day, int *month, int *year); +uint16 fatfs_convert_to_fat_time(int hours, int minutes, int seconds); +uint16 fatfs_convert_to_fat_date(int day, int month, int year); +void fatfs_print_sector(uint32 sector, uint8 *data); + +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_opts.h b/src/hisocli/fat_io_lib/release/fat_opts.h new file mode 100644 index 0000000..ac4dc86 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_opts.h @@ -0,0 +1,90 @@ +#ifndef __FAT_OPTS_H__ +#define __FAT_OPTS_H__ + +#ifdef FATFS_USE_CUSTOM_OPTS_FILE + #include "fat_custom.h" +#endif + +//------------------------------------------------------------- +// Configuration +//------------------------------------------------------------- + +// Is the processor little endian (1) or big endian (0) +#ifndef FATFS_IS_LITTLE_ENDIAN + #define FATFS_IS_LITTLE_ENDIAN 1 +#endif + +// Max filename Length +#ifndef FATFS_MAX_LONG_FILENAME + #define FATFS_MAX_LONG_FILENAME 260 +#endif + +// Max open files (reduce to lower memory requirements) +#ifndef FATFS_MAX_OPEN_FILES + #define FATFS_MAX_OPEN_FILES 2 +#endif + +// Number of sectors per FAT_BUFFER (min 1) +#ifndef FAT_BUFFER_SECTORS + #define FAT_BUFFER_SECTORS 1 +#endif + +// Max FAT sectors to buffer (min 1) +// (mem used is FAT_BUFFERS * FAT_BUFFER_SECTORS * FAT_SECTOR_SIZE) +#ifndef FAT_BUFFERS + #define FAT_BUFFERS 1 +#endif + +// Size of cluster chain cache (can be undefined) +// Mem used = FAT_CLUSTER_CACHE_ENTRIES * 4 * 2 +// Improves access speed considerably +//#define FAT_CLUSTER_CACHE_ENTRIES 128 + +// Include support for writing files (1 / 0)? +#ifndef FATFS_INC_WRITE_SUPPORT + #define FATFS_INC_WRITE_SUPPORT 1 +#endif + +// Support long filenames (1 / 0)? +// (if not (0) only 8.3 format is supported) +#ifndef FATFS_INC_LFN_SUPPORT + #define FATFS_INC_LFN_SUPPORT 1 +#endif + +// Support directory listing (1 / 0)? +#ifndef FATFS_DIR_LIST_SUPPORT + #define FATFS_DIR_LIST_SUPPORT 1 +#endif + +// Support time/date (1 / 0)? +#ifndef FATFS_INC_TIME_DATE_SUPPORT + #define FATFS_INC_TIME_DATE_SUPPORT 0 +#endif + +// Include support for formatting disks (1 / 0)? +#ifndef FATFS_INC_FORMAT_SUPPORT + #define FATFS_INC_FORMAT_SUPPORT 1 +#endif + +// Sector size used +#define FAT_SECTOR_SIZE 512 + +// Printf output (directory listing / debug) +#ifndef FAT_PRINTF + // Don't include stdio, but there is a printf function available + #ifdef FAT_PRINTF_NOINC_STDIO + extern int printf(const char* ctrl1, ... ); + #define FAT_PRINTF(a) printf a + // Include stdio to use printf + #else + #include + #define FAT_PRINTF(a) printf a + #endif +#endif + +// Time/Date support requires time.h +#if FATFS_INC_TIME_DATE_SUPPORT + #include +#endif + +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_string.c b/src/hisocli/fat_io_lib/release/fat_string.c new file mode 100644 index 0000000..f7206ce --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_string.c @@ -0,0 +1,514 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include +#include "fat_string.h" + +//----------------------------------------------------------------------------- +// fatfs_total_path_levels: Take a filename and path and count the sub levels +// of folders. E.g. C:\folder\file.zip = 1 level +// Acceptable input formats are: +// c:\folder\file.zip +// /dev/etc/samba.conf +// Returns: -1 = Error, 0 or more = Ok +//----------------------------------------------------------------------------- +int fatfs_total_path_levels(char *path) +{ + int levels = 0; + char expectedchar; + + if (!path) + return -1; + + // Acceptable formats: + // c:\folder\file.zip + // /dev/etc/samba.conf + if (*path == '/') + { + expectedchar = '/'; + path++; + } + else if (path[1] == ':' || path[2] == '\\') + { + expectedchar = '\\'; + path += 3; + } + else + return -1; + + // Count levels in path string + while (*path) + { + // Fast forward through actual subdir text to next slash + for (; *path; ) + { + // If slash detected escape from for loop + if (*path == expectedchar) { path++; break; } + path++; + } + + // Increase number of subdirs founds + levels++; + } + + // Subtract the file itself + return levels-1; +} +//----------------------------------------------------------------------------- +// fatfs_get_substring: Get a substring from 'path' which contains the folder +// (or file) at the specified level. +// E.g. C:\folder\file.zip : Level 0 = C:\folder, Level 1 = file.zip +// Returns: -1 = Error, 0 = Ok +//----------------------------------------------------------------------------- +int fatfs_get_substring(char *path, int levelreq, char *output, int max_len) +{ + int i; + int pathlen=0; + int levels=0; + int copypnt=0; + char expectedchar; + + if (!path || max_len <= 0) + return -1; + + // Acceptable formats: + // c:\folder\file.zip + // /dev/etc/samba.conf + if (*path == '/') + { + expectedchar = '/'; + path++; + } + else if (path[1] == ':' || path[2] == '\\') + { + expectedchar = '\\'; + path += 3; + } + else + return -1; + + // Get string length of path + pathlen = (int)strlen (path); + + // Loop through the number of times as characters in 'path' + for (i = 0; i path = C:\folder filename = file.zip +// E.g. C:\file.zip -> path = [blank] filename = file.zip +//----------------------------------------------------------------------------- +int fatfs_split_path(char *full_path, char *path, int max_path, char *filename, int max_filename) +{ + int strindex; + + // Count the levels to the filepath + int levels = fatfs_total_path_levels(full_path); + if (levels == -1) + return -1; + + // Get filename part of string + if (fatfs_get_substring(full_path, levels, filename, max_filename) != 0) + return -1; + + // If root file + if (levels == 0) + path[0] = '\0'; + else + { + strindex = (int)strlen(full_path) - (int)strlen(filename); + if (strindex > max_path) + strindex = max_path; + + memcpy(path, full_path, strindex); + path[strindex-1] = '\0'; + } + + return 0; +} +//----------------------------------------------------------------------------- +// FileString_StrCmpNoCase: Compare two strings case with case sensitivity +//----------------------------------------------------------------------------- +static int FileString_StrCmpNoCase(char *s1, char *s2, int n) +{ + int diff; + char a,b; + + while (n--) + { + a = *s1; + b = *s2; + + // Make lower case if uppercase + if ((a>='A') && (a<='Z')) + a+= 32; + if ((b>='A') && (b<='Z')) + b+= 32; + + diff = a - b; + + // If different + if (diff) + return diff; + + // If run out of strings + if ( (*s1 == 0) || (*s2 == 0) ) + break; + + s1++; + s2++; + } + return 0; +} +//----------------------------------------------------------------------------- +// FileString_GetExtension: Get index to extension within filename +// Returns -1 if not found or index otherwise +//----------------------------------------------------------------------------- +static int FileString_GetExtension(char *str) +{ + int dotPos = -1; + char *strSrc = str; + + // Find last '.' in string (if at all) + while (*strSrc) + { + if (*strSrc=='.') + dotPos = (int)(strSrc-str); + + strSrc++; + } + + return dotPos; +} +//----------------------------------------------------------------------------- +// FileString_TrimLength: Get length of string excluding trailing spaces +// Returns -1 if not found or index otherwise +//----------------------------------------------------------------------------- +static int FileString_TrimLength(char *str, int strLen) +{ + int length = strLen; + char *strSrc = str+strLen-1; + + // Find last non white space + while (strLen != 0) + { + if (*strSrc == ' ') + length = (int)(strSrc - str); + else + break; + + strSrc--; + strLen--; + } + + return length; +} +//----------------------------------------------------------------------------- +// fatfs_compare_names: Compare two filenames (without copying or changing origonals) +// Returns 1 if match, 0 if not +//----------------------------------------------------------------------------- +int fatfs_compare_names(char* strA, char* strB) +{ + char *ext1 = NULL; + char *ext2 = NULL; + int ext1Pos, ext2Pos; + int file1Len, file2Len; + + // Get both files extension + ext1Pos = FileString_GetExtension(strA); + ext2Pos = FileString_GetExtension(strB); + + // NOTE: Extension position can be different for matching + // filename if trailing space are present before it! + // Check that if one has an extension, so does the other + if ((ext1Pos==-1) && (ext2Pos!=-1)) + return 0; + if ((ext2Pos==-1) && (ext1Pos!=-1)) + return 0; + + // If they both have extensions, compare them + if (ext1Pos!=-1) + { + // Set pointer to start of extension + ext1 = strA+ext1Pos+1; + ext2 = strB+ext2Pos+1; + + // Verify that the file extension lengths match! + if (strlen(ext1) != strlen(ext2)) + return 0; + + // If they dont match + if (FileString_StrCmpNoCase(ext1, ext2, (int)strlen(ext1))!=0) + return 0; + + // Filelength is upto extensions + file1Len = ext1Pos; + file2Len = ext2Pos; + } + // No extensions + else + { + // Filelength is actual filelength + file1Len = (int)strlen(strA); + file2Len = (int)strlen(strB); + } + + // Find length without trailing spaces (before ext) + file1Len = FileString_TrimLength(strA, file1Len); + file2Len = FileString_TrimLength(strB, file2Len); + + // Check the file lengths match + if (file1Len!=file2Len) + return 0; + + // Compare main part of filenames + if (FileString_StrCmpNoCase(strA, strB, file1Len)!=0) + return 0; + else + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_string_ends_with_slash: Does the string end with a slash (\ or /) +//----------------------------------------------------------------------------- +int fatfs_string_ends_with_slash(char *path) +{ + if (path) + { + while (*path) + { + // Last character? + if (!(*(path+1))) + { + if (*path == '\\' || *path == '/') + return 1; + } + + path++; + } + } + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_get_sfn_display_name: Get display name for SFN entry +//----------------------------------------------------------------------------- +int fatfs_get_sfn_display_name(char* out, char* in) +{ + int len = 0; + while (*in && len <= 11) + { + char a = *in++; + + if (a == ' ') + continue; + // Make lower case if uppercase + else if ((a>='A') && (a<='Z')) + a+= 32; + + *out++ = a; + len++; + } + + *out = '\0'; + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_get_extension: Get extension of filename passed in 'filename'. +// Returned extension is always lower case. +// Returns: 1 if ok, 0 if not. +//----------------------------------------------------------------------------- +int fatfs_get_extension(char* filename, char* out, int maxlen) +{ + int len = 0; + + // Get files extension offset + int ext_pos = FileString_GetExtension(filename); + + if (ext_pos > 0 && out && maxlen) + { + filename += ext_pos + 1; + + while (*filename && len < (maxlen-1)) + { + char a = *filename++; + + // Make lowercase if uppercase + if ((a>='A') && (a<='Z')) + a+= 32; + + *out++ = a; + len++; + } + + *out = '\0'; + return 1; + } + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_create_path_string: Append path & filename to create file path string. +// Returns: 1 if ok, 0 if not. +//----------------------------------------------------------------------------- +int fatfs_create_path_string(char* path, char *filename, char* out, int maxlen) +{ + int len = 0; + char last = 0; + char seperator = '/'; + + if (path && filename && out && maxlen > 0) + { + while (*path && len < (maxlen-2)) + { + last = *path++; + if (last == '\\') + seperator = '\\'; + *out++ = last; + len++; + } + + // Add a seperator if trailing one not found + if (last != '\\' && last != '/') + *out++ = seperator; + + while (*filename && len < (maxlen-1)) + { + *out++ = *filename++; + len++; + } + + *out = '\0'; + + return 1; + } + + return 0; +} +//----------------------------------------------------------------------------- +// Test Bench +//----------------------------------------------------------------------------- +#ifdef FAT_STRING_TESTBENCH +void main(void) +{ + char output[255]; + char output2[255]; + + assert(fatfs_total_path_levels("C:\\folder\\file.zip") == 1); + assert(fatfs_total_path_levels("C:\\file.zip") == 0); + assert(fatfs_total_path_levels("C:\\folder\\folder2\\file.zip") == 2); + assert(fatfs_total_path_levels("C:\\") == -1); + assert(fatfs_total_path_levels("") == -1); + assert(fatfs_total_path_levels("/dev/etc/file.zip") == 2); + assert(fatfs_total_path_levels("/dev/file.zip") == 1); + + assert(fatfs_get_substring("C:\\folder\\file.zip", 0, output, sizeof(output)) == 0); + assert(strcmp(output, "folder") == 0); + + assert(fatfs_get_substring("C:\\folder\\file.zip", 1, output, sizeof(output)) == 0); + assert(strcmp(output, "file.zip") == 0); + + assert(fatfs_get_substring("/dev/etc/file.zip", 0, output, sizeof(output)) == 0); + assert(strcmp(output, "dev") == 0); + + assert(fatfs_get_substring("/dev/etc/file.zip", 1, output, sizeof(output)) == 0); + assert(strcmp(output, "etc") == 0); + + assert(fatfs_get_substring("/dev/etc/file.zip", 2, output, sizeof(output)) == 0); + assert(strcmp(output, "file.zip") == 0); + + assert(fatfs_split_path("C:\\folder\\file.zip", output, sizeof(output), output2, sizeof(output2)) == 0); + assert(strcmp(output, "C:\\folder") == 0); + assert(strcmp(output2, "file.zip") == 0); + + assert(fatfs_split_path("C:\\file.zip", output, sizeof(output), output2, sizeof(output2)) == 0); + assert(output[0] == 0); + assert(strcmp(output2, "file.zip") == 0); + + assert(fatfs_split_path("/dev/etc/file.zip", output, sizeof(output), output2, sizeof(output2)) == 0); + assert(strcmp(output, "/dev/etc") == 0); + assert(strcmp(output2, "file.zip") == 0); + + assert(FileString_GetExtension("C:\\file.zip") == strlen("C:\\file")); + assert(FileString_GetExtension("C:\\file.zip.ext") == strlen("C:\\file.zip")); + assert(FileString_GetExtension("C:\\file.zip.") == strlen("C:\\file.zip")); + + assert(FileString_TrimLength("C:\\file.zip", strlen("C:\\file.zip")) == strlen("C:\\file.zip")); + assert(FileString_TrimLength("C:\\file.zip ", strlen("C:\\file.zip ")) == strlen("C:\\file.zip")); + assert(FileString_TrimLength(" ", strlen(" ")) == 0); + + assert(fatfs_compare_names("C:\\file.ext", "C:\\file.ext") == 1); + assert(fatfs_compare_names("C:\\file2.ext", "C:\\file.ext") == 0); + assert(fatfs_compare_names("C:\\file .ext", "C:\\file.ext") == 1); + assert(fatfs_compare_names("C:\\file .ext", "C:\\file2.ext") == 0); + + assert(fatfs_string_ends_with_slash("C:\\folder") == 0); + assert(fatfs_string_ends_with_slash("C:\\folder\\") == 1); + assert(fatfs_string_ends_with_slash("/path") == 0); + assert(fatfs_string_ends_with_slash("/path/a") == 0); + assert(fatfs_string_ends_with_slash("/path/") == 1); + + assert(fatfs_get_extension("/mypath/file.wav", output, 4) == 1); + assert(strcmp(output, "wav") == 0); + assert(fatfs_get_extension("/mypath/file.WAV", output, 4) == 1); + assert(strcmp(output, "wav") == 0); + assert(fatfs_get_extension("/mypath/file.zip", output, 4) == 1); + assert(strcmp(output, "ext") != 0); + + assert(fatfs_create_path_string("/mydir1", "myfile.txt", output, sizeof(output)) == 1); + assert(strcmp(output, "/mydir1/myfile.txt") == 0); + assert(fatfs_create_path_string("/mydir2/", "myfile2.txt", output, sizeof(output)) == 1); + assert(strcmp(output, "/mydir2/myfile2.txt") == 0); + assert(fatfs_create_path_string("C:\\mydir3", "myfile3.txt", output, sizeof(output)) == 1); + assert(strcmp(output, "C:\\mydir3\\myfile3.txt") == 0); +} +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_string.h b/src/hisocli/fat_io_lib/release/fat_string.h new file mode 100644 index 0000000..90ca8e0 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_string.h @@ -0,0 +1,20 @@ +#ifndef __FILESTRING_H__ +#define __FILESTRING_H__ + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_total_path_levels(char *path); +int fatfs_get_substring(char *Path, int levelreq, char *output, int max_len); +int fatfs_split_path(char *FullPath, char *Path, int max_path, char *FileName, int max_filename); +int fatfs_compare_names(char* strA, char* strB); +int fatfs_string_ends_with_slash(char *path); +int fatfs_get_sfn_display_name(char* out, char* in); +int fatfs_get_extension(char* filename, char* out, int maxlen); +int fatfs_create_path_string(char* path, char *filename, char* out, int maxlen); + +#ifndef NULL + #define NULL 0 +#endif + +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_table.c b/src/hisocli/fat_io_lib/release/fat_table.c new file mode 100644 index 0000000..8d05d3b --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_table.c @@ -0,0 +1,478 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" + +#ifndef FAT_BUFFERS + #define FAT_BUFFERS 1 +#endif + +#ifndef FAT_BUFFER_SECTORS + #define FAT_BUFFER_SECTORS 1 +#endif + +#if FAT_BUFFERS < 1 || FAT_BUFFER_SECTORS < 1 + #error "FAT_BUFFERS & FAT_BUFFER_SECTORS must be at least 1" +#endif + +//----------------------------------------------------------------------------- +// FAT Sector Buffer +//----------------------------------------------------------------------------- +#define FAT32_GET_32BIT_WORD(pbuf, location) ( GET_32BIT_WORD(pbuf->ptr, location) ) +#define FAT32_SET_32BIT_WORD(pbuf, location, value) { SET_32BIT_WORD(pbuf->ptr, location, value); pbuf->dirty = 1; } +#define FAT16_GET_16BIT_WORD(pbuf, location) ( GET_16BIT_WORD(pbuf->ptr, location) ) +#define FAT16_SET_16BIT_WORD(pbuf, location, value) { SET_16BIT_WORD(pbuf->ptr, location, value); pbuf->dirty = 1; } + +//----------------------------------------------------------------------------- +// fatfs_fat_init: +//----------------------------------------------------------------------------- +void fatfs_fat_init(struct fatfs *fs) +{ + int i; + + // FAT buffer chain head + fs->fat_buffer_head = NULL; + + for (i=0;ifat_buffers[i].address = FAT32_INVALID_CLUSTER; + fs->fat_buffers[i].dirty = 0; + memset(fs->fat_buffers[i].sector, 0x00, sizeof(fs->fat_buffers[i].sector)); + fs->fat_buffers[i].ptr = NULL; + + // Add to head of queue + fs->fat_buffers[i].next = fs->fat_buffer_head; + fs->fat_buffer_head = &fs->fat_buffers[i]; + } +} +//----------------------------------------------------------------------------- +// fatfs_fat_writeback: Writeback 'dirty' FAT sectors to disk +//----------------------------------------------------------------------------- +static int fatfs_fat_writeback(struct fatfs *fs, struct fat_buffer *pcur) +{ + if (pcur) + { + // Writeback sector if changed + if (pcur->dirty) + { + if (fs->disk_io.write_media) + { + uint32 sectors = FAT_BUFFER_SECTORS; + uint32 offset = pcur->address - fs->fat_begin_lba; + + // Limit to sectors used for the FAT + if ((offset + FAT_BUFFER_SECTORS) <= fs->fat_sectors) + sectors = FAT_BUFFER_SECTORS; + else + sectors = fs->fat_sectors - offset; + + if (!fs->disk_io.write_media(pcur->address, pcur->sector, sectors)) + return 0; + } + + pcur->dirty = 0; + } + + return 1; + } + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_fat_read_sector: Read a FAT sector +//----------------------------------------------------------------------------- +static struct fat_buffer *fatfs_fat_read_sector(struct fatfs *fs, uint32 sector) +{ + struct fat_buffer *last = NULL; + struct fat_buffer *pcur = fs->fat_buffer_head; + + // Itterate through sector buffer list + while (pcur) + { + // Sector within this buffer? + if ((sector >= pcur->address) && (sector < (pcur->address + FAT_BUFFER_SECTORS))) + break; + + // End of list? + if (pcur->next == NULL) + { + // Remove buffer from list + if (last) + last->next = NULL; + // We the first and last buffer in the chain? + else + fs->fat_buffer_head = NULL; + } + + last = pcur; + pcur = pcur->next; + } + + // We found the sector already in FAT buffer chain + if (pcur) + { + pcur->ptr = (uint8 *)(pcur->sector + ((sector - pcur->address) * FAT_SECTOR_SIZE)); + return pcur; + } + + // Else, we removed the last item from the list + pcur = last; + + // Add to start of sector buffer list (now newest sector) + pcur->next = fs->fat_buffer_head; + fs->fat_buffer_head = pcur; + + // Writeback sector if changed + if (pcur->dirty) + if (!fatfs_fat_writeback(fs, pcur)) + return 0; + + // Address is now new sector + pcur->address = sector; + + // Read next sector + if (!fs->disk_io.read_media(pcur->address, pcur->sector, FAT_BUFFER_SECTORS)) + { + // Read failed, invalidate buffer address + pcur->address = FAT32_INVALID_CLUSTER; + return NULL; + } + + pcur->ptr = pcur->sector; + return pcur; +} +//----------------------------------------------------------------------------- +// fatfs_fat_purge: Purge 'dirty' FAT sectors to disk +//----------------------------------------------------------------------------- +int fatfs_fat_purge(struct fatfs *fs) +{ + struct fat_buffer *pcur = fs->fat_buffer_head; + + // Itterate through sector buffer list + while (pcur) + { + // Writeback sector if changed + if (pcur->dirty) + if (!fatfs_fat_writeback(fs, pcur)) + return 0; + + pcur = pcur->next; + } + + return 1; +} + +//----------------------------------------------------------------------------- +// General FAT Table Operations +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// fatfs_find_next_cluster: Return cluster number of next cluster in chain by +// reading FAT table and traversing it. Return 0xffffffff for end of chain. +//----------------------------------------------------------------------------- +uint32 fatfs_find_next_cluster(struct fatfs *fs, uint32 current_cluster) +{ + uint32 fat_sector_offset, position; + uint32 nextcluster; + struct fat_buffer *pbuf; + + // Why is '..' labelled with cluster 0 when it should be 2 ?? + if (current_cluster == 0) + current_cluster = 2; + + // Find which sector of FAT table to read + if (fs->fat_type == FAT_TYPE_16) + fat_sector_offset = current_cluster / 256; + else + fat_sector_offset = current_cluster / 128; + + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba+fat_sector_offset); + if (!pbuf) + return (FAT32_LAST_CLUSTER); + + if (fs->fat_type == FAT_TYPE_16) + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 256)) * 2; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT16_GET_16BIT_WORD(pbuf, (uint16)position); + + // If end of chain found + if (nextcluster >= 0xFFF8 && nextcluster <= 0xFFFF) + return (FAT32_LAST_CLUSTER); + } + else + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 128)) * 4; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT32_GET_32BIT_WORD(pbuf, (uint16)position); + + // Mask out MS 4 bits (its 28bit addressing) + nextcluster = nextcluster & 0x0FFFFFFF; + + // If end of chain found + if (nextcluster >= 0x0FFFFFF8 && nextcluster <= 0x0FFFFFFF) + return (FAT32_LAST_CLUSTER); + } + + // Else return next cluster + return (nextcluster); +} +//----------------------------------------------------------------------------- +// fatfs_set_fs_info_next_free_cluster: Write the next free cluster to the FSINFO table +//----------------------------------------------------------------------------- +void fatfs_set_fs_info_next_free_cluster(struct fatfs *fs, uint32 newValue) +{ + if (fs->fat_type == FAT_TYPE_16) + ; + else + { + // Load sector to change it + struct fat_buffer *pbuf = fatfs_fat_read_sector(fs, fs->lba_begin+fs->fs_info_sector); + if (!pbuf) + return ; + + // Change + FAT32_SET_32BIT_WORD(pbuf, 492, newValue); + fs->next_free_cluster = newValue; + + // Write back FSINFO sector to disk + if (fs->disk_io.write_media) + fs->disk_io.write_media(pbuf->address, pbuf->sector, 1); + + // Invalidate cache entry + pbuf->address = FAT32_INVALID_CLUSTER; + pbuf->dirty = 0; + } +} +//----------------------------------------------------------------------------- +// fatfs_find_blank_cluster: Find a free cluster entry by reading the FAT +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_find_blank_cluster(struct fatfs *fs, uint32 start_cluster, uint32 *free_cluster) +{ + uint32 fat_sector_offset, position; + uint32 nextcluster; + uint32 current_cluster = start_cluster; + struct fat_buffer *pbuf; + + do + { + // Find which sector of FAT table to read + if (fs->fat_type == FAT_TYPE_16) + fat_sector_offset = current_cluster / 256; + else + fat_sector_offset = current_cluster / 128; + + if ( fat_sector_offset < fs->fat_sectors) + { + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba+fat_sector_offset); + if (!pbuf) + return 0; + + if (fs->fat_type == FAT_TYPE_16) + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 256)) * 2; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT16_GET_16BIT_WORD(pbuf, (uint16)position); + } + else + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 128)) * 4; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT32_GET_32BIT_WORD(pbuf, (uint16)position); + + // Mask out MS 4 bits (its 28bit addressing) + nextcluster = nextcluster & 0x0FFFFFFF; + } + + if (nextcluster !=0 ) + current_cluster++; + } + else + // Otherwise, run out of FAT sectors to check... + return 0; + } + while (nextcluster != 0x0); + + // Found blank entry + *free_cluster = current_cluster; + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_fat_set_cluster: Set a cluster link in the chain. NOTE: Immediate +// write (slow). +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_fat_set_cluster(struct fatfs *fs, uint32 cluster, uint32 next_cluster) +{ + struct fat_buffer *pbuf; + uint32 fat_sector_offset, position; + + // Find which sector of FAT table to read + if (fs->fat_type == FAT_TYPE_16) + fat_sector_offset = cluster / 256; + else + fat_sector_offset = cluster / 128; + + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba+fat_sector_offset); + if (!pbuf) + return 0; + + if (fs->fat_type == FAT_TYPE_16) + { + // Find 16 bit entry of current sector relating to cluster number + position = (cluster - (fat_sector_offset * 256)) * 2; + + // Write Next Clusters value to Sector Buffer + FAT16_SET_16BIT_WORD(pbuf, (uint16)position, ((uint16)next_cluster)); + } + else + { + // Find 32 bit entry of current sector relating to cluster number + position = (cluster - (fat_sector_offset * 128)) * 4; + + // Write Next Clusters value to Sector Buffer + FAT32_SET_32BIT_WORD(pbuf, (uint16)position, next_cluster); + } + + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_free_cluster_chain: Follow a chain marking each element as free +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_free_cluster_chain(struct fatfs *fs, uint32 start_cluster) +{ + uint32 last_cluster; + uint32 next_cluster = start_cluster; + + // Loop until end of chain + while ( (next_cluster != FAT32_LAST_CLUSTER) && (next_cluster != 0x00000000) ) + { + last_cluster = next_cluster; + + // Find next link + next_cluster = fatfs_find_next_cluster(fs, next_cluster); + + // Clear last link + fatfs_fat_set_cluster(fs, last_cluster, 0x00000000); + } + + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_fat_add_cluster_to_chain: Follow a chain marking and then add a new entry +// to the current tail. +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_fat_add_cluster_to_chain(struct fatfs *fs, uint32 start_cluster, uint32 newEntry) +{ + uint32 last_cluster = FAT32_LAST_CLUSTER; + uint32 next_cluster = start_cluster; + + if (start_cluster == FAT32_LAST_CLUSTER) + return 0; + + // Loop until end of chain + while ( next_cluster != FAT32_LAST_CLUSTER ) + { + last_cluster = next_cluster; + + // Find next link + next_cluster = fatfs_find_next_cluster(fs, next_cluster); + if (!next_cluster) + return 0; + } + + // Add link in for new cluster + fatfs_fat_set_cluster(fs, last_cluster, newEntry); + + // Mark new cluster as end of chain + fatfs_fat_set_cluster(fs, newEntry, FAT32_LAST_CLUSTER); + + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_count_free_clusters: +//----------------------------------------------------------------------------- +uint32 fatfs_count_free_clusters(struct fatfs *fs) +{ + uint32 i,j; + uint32 count = 0; + struct fat_buffer *pbuf; + + for (i = 0; i < fs->fat_sectors; i++) + { + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba + i); + if (!pbuf) + break; + + for (j = 0; j < FAT_SECTOR_SIZE; ) + { + if (fs->fat_type == FAT_TYPE_16) + { + if (FAT16_GET_16BIT_WORD(pbuf, (uint16)j) == 0) + count++; + + j += 2; + } + else + { + if (FAT32_GET_32BIT_WORD(pbuf, (uint16)j) == 0) + count++; + + j += 4; + } + } + } + + return count; +} diff --git a/src/hisocli/fat_io_lib/release/fat_table.h b/src/hisocli/fat_io_lib/release/fat_table.h new file mode 100644 index 0000000..ead75f3 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_table.h @@ -0,0 +1,20 @@ +#ifndef __FAT_TABLE_H__ +#define __FAT_TABLE_H__ + +#include "fat_opts.h" +#include "fat_misc.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +void fatfs_fat_init(struct fatfs *fs); +int fatfs_fat_purge(struct fatfs *fs); +uint32 fatfs_find_next_cluster(struct fatfs *fs, uint32 current_cluster); +void fatfs_set_fs_info_next_free_cluster(struct fatfs *fs, uint32 newValue); +int fatfs_find_blank_cluster(struct fatfs *fs, uint32 start_cluster, uint32 *free_cluster); +int fatfs_fat_set_cluster(struct fatfs *fs, uint32 cluster, uint32 next_cluster); +int fatfs_fat_add_cluster_to_chain(struct fatfs *fs, uint32 start_cluster, uint32 newEntry); +int fatfs_free_cluster_chain(struct fatfs *fs, uint32 start_cluster); +uint32 fatfs_count_free_clusters(struct fatfs *fs); + +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_types.h b/src/hisocli/fat_io_lib/release/fat_types.h new file mode 100644 index 0000000..5e2cca8 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_types.h @@ -0,0 +1,69 @@ +#ifndef __FAT_TYPES_H__ +#define __FAT_TYPES_H__ + +// Detect 64-bit compilation on GCC +#if defined(__GNUC__) && defined(__SIZEOF_LONG__) + #if __SIZEOF_LONG__ == 8 + #define FATFS_DEF_UINT32_AS_INT + #endif +#endif + +//------------------------------------------------------------- +// System specific types +//------------------------------------------------------------- +#ifndef FATFS_NO_DEF_TYPES + typedef unsigned char uint8; + typedef unsigned short uint16; + + // If compiling on a 64-bit machine, use int as 32-bits + #ifdef FATFS_DEF_UINT32_AS_INT + typedef unsigned int uint32; + // Else for 32-bit machines & embedded systems, use long... + #else + typedef unsigned long uint32; + #endif +#endif + +#ifndef NULL + #define NULL 0 +#endif + +//------------------------------------------------------------- +// Endian Macros +//------------------------------------------------------------- +// FAT is little endian so big endian systems need to swap words + +// Little Endian - No swap required +#if FATFS_IS_LITTLE_ENDIAN == 1 + + #define FAT_HTONS(n) (n) + #define FAT_HTONL(n) (n) + +// Big Endian - Swap required +#else + + #define FAT_HTONS(n) ((((uint16)((n) & 0xff)) << 8) | (((n) & 0xff00) >> 8)) + #define FAT_HTONL(n) (((((uint32)(n) & 0xFF)) << 24) | \ + ((((uint32)(n) & 0xFF00)) << 8) | \ + ((((uint32)(n) & 0xFF0000)) >> 8) | \ + ((((uint32)(n) & 0xFF000000)) >> 24)) + +#endif + +//------------------------------------------------------------- +// Structure Packing Compile Options +//------------------------------------------------------------- +#ifdef __GNUC__ + #define STRUCT_PACK + #define STRUCT_PACK_BEGIN + #define STRUCT_PACK_END + #define STRUCT_PACKED __attribute__ ((packed)) +#else + // Other compilers may require other methods of packing structures + #define STRUCT_PACK + #define STRUCT_PACK_BEGIN + #define STRUCT_PACK_END + #define STRUCT_PACKED +#endif + +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_write.c b/src/hisocli/fat_io_lib/release/fat_write.c new file mode 100644 index 0000000..0718cb1 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_write.c @@ -0,0 +1,373 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_string.h" +#include "fat_misc.h" + +#if FATFS_INC_WRITE_SUPPORT +//----------------------------------------------------------------------------- +// fatfs_add_free_space: Allocate another cluster of free space to the end +// of a files cluster chain. +//----------------------------------------------------------------------------- +int fatfs_add_free_space(struct fatfs *fs, uint32 *startCluster, uint32 clusters) +{ + uint32 i; + uint32 nextcluster; + uint32 start = *startCluster; + + // Set the next free cluster hint to unknown + if (fs->next_free_cluster != FAT32_LAST_CLUSTER) + fatfs_set_fs_info_next_free_cluster(fs, FAT32_LAST_CLUSTER); + + for (i=0;irootdir_first_cluster, &nextcluster)) + { + // Point last to this + fatfs_fat_set_cluster(fs, start, nextcluster); + + // Point this to end of file + fatfs_fat_set_cluster(fs, nextcluster, FAT32_LAST_CLUSTER); + + // Adjust argument reference + start = nextcluster; + if (i == 0) + *startCluster = nextcluster; + } + else + return 0; + } + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_allocate_free_space: Add an ammount of free space to a file either from +// 'startCluster' if newFile = false, or allocating a new start to the chain if +// newFile = true. +//----------------------------------------------------------------------------- +int fatfs_allocate_free_space(struct fatfs *fs, int newFile, uint32 *startCluster, uint32 size) +{ + uint32 clusterSize; + uint32 clusterCount; + uint32 nextcluster; + + if (size==0) + return 0; + + // Set the next free cluster hint to unknown + if (fs->next_free_cluster != FAT32_LAST_CLUSTER) + fatfs_set_fs_info_next_free_cluster(fs, FAT32_LAST_CLUSTER); + + // Work out size and clusters + clusterSize = fs->sectors_per_cluster * FAT_SECTOR_SIZE; + clusterCount = (size / clusterSize); + + // If any left over + if (size-(clusterSize*clusterCount)) + clusterCount++; + + // Allocated first link in the chain if a new file + if (newFile) + { + if (!fatfs_find_blank_cluster(fs, fs->rootdir_first_cluster, &nextcluster)) + return 0; + + // If this is all that is needed then all done + if (clusterCount==1) + { + fatfs_fat_set_cluster(fs, nextcluster, FAT32_LAST_CLUSTER); + *startCluster = nextcluster; + return 1; + } + } + // Allocate from end of current chain (startCluster is end of chain) + else + nextcluster = *startCluster; + + if (!fatfs_add_free_space(fs, &nextcluster, clusterCount)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_find_free_dir_offset: Find a free space in the directory for a new entry +// which takes up 'entryCount' blocks (or allocate some more) +//----------------------------------------------------------------------------- +static int fatfs_find_free_dir_offset(struct fatfs *fs, uint32 dirCluster, int entryCount, uint32 *pSector, uint8 *pOffset) +{ + struct fat_dir_entry *directoryEntry; + uint8 item=0; + uint16 recordoffset = 0; + uint8 i=0; + int x=0; + int possible_spaces = 0; + int start_recorded = 0; + + // No entries required? + if (entryCount == 0) + return 0; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, dirCluster, x++, 0)) + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + + // LFN Entry + if (fatfs_entry_lfn_text(directoryEntry)) + { + // First entry? + if (possible_spaces == 0) + { + // Store start + *pSector = x-1; + *pOffset = item; + start_recorded = 1; + } + + // Increment the count in-case the file turns + // out to be deleted... + possible_spaces++; + } + // SFN Entry + else + { + // Has file been deleted? + if (fs->currentsector.sector[recordoffset] == FILE_HEADER_DELETED) + { + // First entry? + if (possible_spaces == 0) + { + // Store start + *pSector = x-1; + *pOffset = item; + start_recorded = 1; + } + + possible_spaces++; + + // We have found enough space? + if (possible_spaces >= entryCount) + return 1; + + // Else continue counting until we find a valid entry! + } + // Is the file entry empty? + else if (fs->currentsector.sector[recordoffset] == FILE_HEADER_BLANK) + { + // First entry? + if (possible_spaces == 0) + { + // Store start + *pSector = x-1; + *pOffset = item; + start_recorded = 1; + } + + // Increment the blank entries count + possible_spaces++; + + // We have found enough space? + if (possible_spaces >= entryCount) + return 1; + } + // File entry is valid + else + { + // Reset all flags + possible_spaces = 0; + start_recorded = 0; + } + } + } // End of for + } // End of if + // Run out of free space in the directory, allocate some more + else + { + uint32 newCluster; + + // Get a new cluster for directory + if (!fatfs_find_blank_cluster(fs, fs->rootdir_first_cluster, &newCluster)) + return 0; + + // Add cluster to end of directory tree + if (!fatfs_fat_add_cluster_to_chain(fs, dirCluster, newCluster)) + return 0; + + // Erase new directory cluster + memset(fs->currentsector.sector, 0x00, FAT_SECTOR_SIZE); + for (i=0;isectors_per_cluster;i++) + { + if (!fatfs_write_sector(fs, newCluster, i, 0)) + return 0; + } + + // If non of the name fitted on previous sectors + if (!start_recorded) + { + // Store start + *pSector = (x-1); + *pOffset = 0; + start_recorded = 1; + } + + return 1; + } + } // End of while loop + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_add_file_entry: Add a directory entry to a location found by FindFreeOffset +//----------------------------------------------------------------------------- +int fatfs_add_file_entry(struct fatfs *fs, uint32 dirCluster, char *filename, char *shortfilename, uint32 startCluster, uint32 size, int dir) +{ + uint8 item=0; + uint16 recordoffset = 0; + uint8 i=0; + uint32 x=0; + int entryCount; + struct fat_dir_entry shortEntry; + int dirtySector = 0; + + uint32 dirSector = 0; + uint8 dirOffset = 0; + int foundEnd = 0; + + uint8 checksum; + uint8 *pSname; + + // No write access? + if (!fs->disk_io.write_media) + return 0; + +#if FATFS_INC_LFN_SUPPORT + // How many LFN entries are required? + // NOTE: We always request one LFN even if it would fit in a SFN! + entryCount = fatfs_lfn_entries_required(filename); + if (!entryCount) + return 0; +#else + entryCount = 0; +#endif + + // Find space in the directory for this filename (or allocate some more) + // NOTE: We need to find space for at least the LFN + SFN (or just the SFN if LFNs not supported). + if (!fatfs_find_free_dir_offset(fs, dirCluster, entryCount + 1, &dirSector, &dirOffset)) + return 0; + + // Generate checksum of short filename + pSname = (uint8*)shortfilename; + checksum = 0; + for (i=11; i!=0; i--) checksum = ((checksum & 1) ? 0x80 : 0) + (checksum >> 1) + *pSname++; + + // Start from current sector where space was found! + x = dirSector; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, dirCluster, x++, 0)) + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // If the start position for the entry has been found + if (foundEnd==0) + if ( (dirSector==(x-1)) && (dirOffset==item) ) + foundEnd = 1; + + // Start adding filename + if (foundEnd) + { + if (entryCount==0) + { + // Short filename + fatfs_sfn_create_entry(shortfilename, size, startCluster, &shortEntry, dir); + +#if FATFS_INC_TIME_DATE_SUPPORT + // Update create, access & modify time & date + fatfs_update_timestamps(&shortEntry, 1, 1, 1); +#endif + + memcpy(&fs->currentsector.sector[recordoffset], &shortEntry, sizeof(shortEntry)); + + // Writeback + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } +#if FATFS_INC_LFN_SUPPORT + else + { + entryCount--; + + // Copy entry to directory buffer + fatfs_filename_to_lfn(filename, &fs->currentsector.sector[recordoffset], entryCount, checksum); + dirtySector = 1; + } +#endif + } + } // End of if + + // Write back to disk before loading another sector + if (dirtySector) + { + if (!fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1)) + return 0; + + dirtySector = 0; + } + } + else + return 0; + } // End of while loop + + return 0; +} +#endif diff --git a/src/hisocli/fat_io_lib/release/fat_write.h b/src/hisocli/fat_io_lib/release/fat_write.h new file mode 100644 index 0000000..5558a86 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/fat_write.h @@ -0,0 +1,14 @@ +#ifndef __FAT_WRITE_H__ +#define __FAT_WRITE_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_add_file_entry(struct fatfs *fs, uint32 dirCluster, char *filename, char *shortfilename, uint32 startCluster, uint32 size, int dir); +int fatfs_add_free_space(struct fatfs *fs, uint32 *startCluster, uint32 clusters); +int fatfs_allocate_free_space(struct fatfs *fs, int newFile, uint32 *startCluster, uint32 size); + +#endif diff --git a/src/hisocli/fat_io_lib/release/version.txt b/src/hisocli/fat_io_lib/release/version.txt new file mode 100644 index 0000000..5a00a98 --- /dev/null +++ b/src/hisocli/fat_io_lib/release/version.txt @@ -0,0 +1 @@ +2.6.11 diff --git a/src/hisocli/hisocli.c b/src/hisocli/hisocli.c new file mode 100644 index 0000000..197cdb2 --- /dev/null +++ b/src/hisocli/hisocli.c @@ -0,0 +1,120 @@ +/****************************************************************************** + * hisocli.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hisocli.h" + +void hiperiso_gen_preudo_uuid(void *uuid) +{ + int i; + int fd; + + fd = open("/dev/urandom", O_RDONLY); + if (fd < 0) + { + srand(time(NULL)); + for (i = 0; i < 8; i++) + { + *((uint16_t *)uuid + i) = (uint16_t)(rand() & 0xFFFF); + } + } + else + { + read(fd, uuid, 16); + close(fd); + } +} + +UINT64 get_disk_size_in_byte(const char *disk) +{ + int fd; + int rc; + const char *pos = disk; + unsigned long long size = 0; + char diskpath[256] = {0}; + char sizebuf[64] = {0}; + + if (strncmp(disk, "/dev/", 5) == 0) + { + pos = disk + 5; + } + + // Try 1: get size from sysfs + snprintf(diskpath, sizeof(diskpath) - 1, "/sys/block/%s/size", pos); + if (access(diskpath, F_OK) >= 0) + { + fd = open(diskpath, O_RDONLY); + if (fd >= 0) + { + read(fd, sizebuf, sizeof(sizebuf)); + size = strtoull(sizebuf, NULL, 10); + close(fd); + return (size * 512); + } + } + else + { + printf("%s not exist \n", diskpath); + } + + printf("disk %s size %llu bytes\n", disk, (unsigned long long)size); + return size; +} + + +int main(int argc, char **argv) +{ + if (argc < 2) + { + return 1; + } + else if (strcmp(argv[1], "fat") == 0) + { + return hisofat_main(argc - 1, argv + 1); + } + else if (strcmp(argv[1], "gpt") == 0) + { + return hisogpt_main(argc - 1, argv + 1); + } + else if (strcmp(argv[1], "partresize") == 0) + { + return partresize_main(argc - 1, argv + 1); + } + else + { + return 1; + } +} + diff --git a/src/hisocli/hisocli.h b/src/hisocli/hisocli.h new file mode 100644 index 0000000..6d21895 --- /dev/null +++ b/src/hisocli/hisocli.h @@ -0,0 +1,138 @@ +/****************************************************************************** + * hisocli.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#ifndef __HISOCLI_H__ +#define __HISOCLI_H__ + +#define HIPERISO_EFI_PART_ATTR 0x8000000000000000ULL + +#define SIZE_1MB (1024 * 1024) +#define HIPERISO_EFI_PART_SIZE (32 * SIZE_1MB) + +#define check_free(p) if (p) free(p) +#define check_close(fd) if (fd >= 0) close(fd) + +#define VOID void +#define CHAR char +#define UINT64 unsigned long long +#define UINT32 unsigned int +#define UINT16 unsigned short +#define CHAR16 unsigned short +#define UINT8 unsigned char + +UINT32 HisoCrc32(VOID *Buffer, UINT32 Length); + +#define COMPILE_ASSERT(expr) extern char __compile_assert[(expr) ? 1 : -1] + +#pragma pack(1) + +typedef struct PART_TABLE +{ + UINT8 Active; + + UINT8 StartHead; + UINT16 StartSector : 6; + UINT16 StartCylinder : 10; + + UINT8 FsFlag; + + UINT8 EndHead; + UINT16 EndSector : 6; + UINT16 EndCylinder : 10; + + UINT32 StartSectorId; + UINT32 SectorCount; +}PART_TABLE; + +typedef struct MBR_HEAD +{ + UINT8 BootCode[446]; + PART_TABLE PartTbl[4]; + UINT8 Byte55; + UINT8 ByteAA; +}MBR_HEAD; + +typedef struct GUID +{ + UINT32 data1; + UINT16 data2; + UINT16 data3; + UINT8 data4[8]; +}GUID; + +typedef struct HISO_GPT_HDR +{ + CHAR Signature[8]; /* EFI PART */ + UINT8 Version[4]; + UINT32 Length; + UINT32 Crc; + UINT8 Reserved1[4]; + UINT64 EfiStartLBA; + UINT64 EfiBackupLBA; + UINT64 PartAreaStartLBA; + UINT64 PartAreaEndLBA; + GUID DiskGuid; + UINT64 PartTblStartLBA; + UINT32 PartTblTotNum; + UINT32 PartTblEntryLen; + UINT32 PartTblCrc; + UINT8 Reserved2[420]; +}HISO_GPT_HDR; + +COMPILE_ASSERT(sizeof(HISO_GPT_HDR) == 512); + +typedef struct HISO_GPT_PART_TBL +{ + GUID PartType; + GUID PartGuid; + UINT64 StartLBA; + UINT64 LastLBA; + UINT64 Attr; + CHAR16 Name[36]; +}HISO_GPT_PART_TBL; +COMPILE_ASSERT(sizeof(HISO_GPT_PART_TBL) == 128); + +typedef struct HISO_GPT_INFO +{ + MBR_HEAD MBR; + HISO_GPT_HDR Head; + HISO_GPT_PART_TBL PartTbl[128]; +}HISO_GPT_INFO; + +typedef struct HISO_BK_GPT_INFO +{ + HISO_GPT_PART_TBL PartTbl[128]; + HISO_GPT_HDR Head; +}HISO_BK_GPT_INFO; + +COMPILE_ASSERT(sizeof(HISO_GPT_INFO) == 512 * 34); +COMPILE_ASSERT(sizeof(HISO_BK_GPT_INFO) == 512 * 33); + +#pragma pack() + +UINT32 HisoCrc32(VOID *Buffer, UINT32 Length); +int hisogpt_main(int argc, char **argv); +int hisofat_main(int argc, char **argv); +int partresize_main(int argc, char **argv); +void hiperiso_gen_preudo_uuid(void *uuid); +UINT64 get_disk_size_in_byte(const char *disk); + +#endif /* __HISOCLI_H__ */ + diff --git a/src/hisocli/hisocli_64 b/src/hisocli/hisocli_64 new file mode 100755 index 0000000000000000000000000000000000000000..4b7ea9338d74de0570f35728648d1ab5f3e28176 GIT binary patch literal 810544 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 z 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 N{*F`-xyYPy{{d8Pop=BM literal 0 HcmV?d00001 diff --git a/src/hisocli/hisofat.c b/src/hisocli/hisofat.c new file mode 100644 index 0000000..71a5e06 --- /dev/null +++ b/src/hisocli/hisofat.c @@ -0,0 +1,159 @@ +/****************************************************************************** + * hisofat.c ---- Parse fat file system + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +static int g_disk_fd = 0; + +static int hiso_disk_read(uint32 sector, uint8 *buffer, uint32 sector_count) +{ + lseek(g_disk_fd, sector * 512, SEEK_SET); + read(g_disk_fd, buffer, sector_count * 512); + + return 1; +} + +static int check_secure_boot(void) +{ + void *flfile = NULL; + + flfile = fl_fopen("/EFI/BOOT/grubx64_real.efi", "rb"); + if (flfile) + { + fl_fclose(flfile); + return 0; + } + + return 1; +} + +static int get_hiperiso_version(void) +{ + int rc = 1; + int size = 0; + char *buf = NULL; + char *pos = NULL; + char *end = NULL; + void *flfile = NULL; + + flfile = fl_fopen("/grub/grub.cfg", "rb"); + if (flfile) + { + fl_fseek(flfile, 0, SEEK_END); + size = (int)fl_ftell(flfile); + + fl_fseek(flfile, 0, SEEK_SET); + + buf = malloc(size + 1); + if (buf) + { + fl_fread(buf, 1, size, flfile); + buf[size] = 0; + + pos = strstr(buf, "HIPERISO_VERSION="); + if (pos) + { + pos += strlen("HIPERISO_VERSION="); + if (*pos == '"') + { + pos++; + } + + end = pos; + while (*end != 0 && *end != '"' && *end != '\r' && *end != '\n') + { + end++; + } + + *end = 0; + + printf("%s\n", pos); + rc = 0; + } + free(buf); + } + + fl_fclose(flfile); + } + + return rc; +} + +int hisofat_main(int argc, char **argv) +{ + int op = 0; + int rc = 1; + char *disk; + + if (argc != 2 && argc != 3) + { + printf("Usage: hisofat /dev/sdbs \n"); + printf("Usage: hisofat -s /dev/sdbs \n"); + return 1; + } + + if (argv[1][0] == '-' && argv[1][1] == 'T') + { + return 0; + } + + disk = argv[1]; + if (argv[1][0] == '-' && argv[1][1] == 's') + { + op = 1; + disk = argv[2]; + } + + g_disk_fd = open(disk, O_RDONLY); + if (g_disk_fd < 0) + { + printf("Failed to open %s\n", disk); + return 1; + } + + fl_init(); + + if (0 == fl_attach_media(hiso_disk_read, NULL)) + { + if (op == 0) + { + rc = get_hiperiso_version(); + } + else + { + rc = check_secure_boot(); + } + } + + fl_shutdown(); + + close(g_disk_fd); + + return rc; +} + diff --git a/src/hisocli/hisogpt.c b/src/hisocli/hisogpt.c new file mode 100644 index 0000000..d903309 --- /dev/null +++ b/src/hisocli/hisogpt.c @@ -0,0 +1,223 @@ +/****************************************************************************** + * hisogpt.c ---- hiperiso gpt util + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "hisocli.h" + +void DumpGuid(const char *prefix, GUID *guid) +{ + printf("%s: %08x-%04x-%04x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\n", + prefix, + guid->data1, guid->data2, guid->data3, + guid->data4[0], guid->data4[1], guid->data4[2], guid->data4[3], + guid->data4[4], guid->data4[5], guid->data4[6], guid->data4[7] + ); +} + +void DumpHead(HISO_GPT_HDR *pHead) +{ + UINT32 CrcRead; + UINT32 CrcCalc; + + printf("Signature:<%s>\n", pHead->Signature); + printf("Version:<%02x %02x %02x %02x>\n", pHead->Version[0], pHead->Version[1], pHead->Version[2], pHead->Version[3]); + printf("Length:%u\n", pHead->Length); + printf("Crc:0x%08x\n", pHead->Crc); + printf("EfiStartLBA:%lu\n", pHead->EfiStartLBA); + printf("EfiBackupLBA:%lu\n", pHead->EfiBackupLBA); + printf("PartAreaStartLBA:%lu\n", pHead->PartAreaStartLBA); + printf("PartAreaEndLBA:%lu\n", pHead->PartAreaEndLBA); + DumpGuid("DiskGuid", &pHead->DiskGuid); + + printf("PartTblStartLBA:%lu\n", pHead->PartTblStartLBA); + printf("PartTblTotNum:%u\n", pHead->PartTblTotNum); + printf("PartTblEntryLen:%u\n", pHead->PartTblEntryLen); + printf("PartTblCrc:0x%08x\n", pHead->PartTblCrc); + + CrcRead = pHead->Crc; + pHead->Crc = 0; + CrcCalc = HisoCrc32(pHead, pHead->Length); + + if (CrcCalc != CrcRead) + { + printf("Head CRC Check Failed\n"); + } + else + { + printf("Head CRC Check SUCCESS [%x] [%x]\n", CrcCalc, CrcRead); + } + + CrcRead = pHead->PartTblCrc; + CrcCalc = HisoCrc32(pHead + 1, pHead->PartTblEntryLen * pHead->PartTblTotNum); + if (CrcCalc != CrcRead) + { + printf("Part Table CRC Check Failed\n"); + } + else + { + printf("Part Table CRC Check SUCCESS [%x] [%x]\n", CrcCalc, CrcRead); + } +} + +void DumpPartTable(HISO_GPT_PART_TBL *Tbl) +{ + int i; + + DumpGuid("PartType", &Tbl->PartType); + DumpGuid("PartGuid", &Tbl->PartGuid); + printf("StartLBA:%lu\n", Tbl->StartLBA); + printf("LastLBA:%lu\n", Tbl->LastLBA); + printf("Attr:0x%lx\n", Tbl->Attr); + printf("Name:"); + + for (i = 0; i < 36 && Tbl->Name[i]; i++) + { + printf("%c", (CHAR)(Tbl->Name[i])); + } + printf("\n"); +} + +void DumpMBR(MBR_HEAD *pMBR) +{ + int i; + + for (i = 0; i < 4; i++) + { + printf("=========== Partition Table %d ============\n", i + 1); + printf("PartTbl.Active = 0x%x\n", pMBR->PartTbl[i].Active); + printf("PartTbl.FsFlag = 0x%x\n", pMBR->PartTbl[i].FsFlag); + printf("PartTbl.StartSectorId = %u\n", pMBR->PartTbl[i].StartSectorId); + printf("PartTbl.SectorCount = %u\n", pMBR->PartTbl[i].SectorCount); + printf("PartTbl.StartHead = %u\n", pMBR->PartTbl[i].StartHead); + printf("PartTbl.StartSector = %u\n", pMBR->PartTbl[i].StartSector); + printf("PartTbl.StartCylinder = %u\n", pMBR->PartTbl[i].StartCylinder); + printf("PartTbl.EndHead = %u\n", pMBR->PartTbl[i].EndHead); + printf("PartTbl.EndSector = %u\n", pMBR->PartTbl[i].EndSector); + printf("PartTbl.EndCylinder = %u\n", pMBR->PartTbl[i].EndCylinder); + } +} + +int DumpGptInfo(HISO_GPT_INFO *pGptInfo) +{ + int i; + + DumpMBR(&pGptInfo->MBR); + DumpHead(&pGptInfo->Head); + + for (i = 0; i < 128; i++) + { + if (pGptInfo->PartTbl[i].StartLBA == 0) + { + break; + } + + printf("=====Part %d=====\n", i); + DumpPartTable(pGptInfo->PartTbl + i); + } + + return 0; +} + +int hisogpt_main(int argc, char **argv) +{ + int i; + int fd; + UINT64 DiskSize; + CHAR16 *Name = NULL; + HISO_GPT_INFO *pMainGptInfo = NULL; + HISO_BK_GPT_INFO *pBackGptInfo = NULL; + + if (argc != 3) + { + printf("usage: hisogpt -f /dev/sdb\n"); + return 1; + } + + fd = open(argv[2], O_RDWR); + if (fd < 0) + { + printf("Failed to open %s\n", argv[2]); + return 1; + } + + pMainGptInfo = malloc(sizeof(HISO_GPT_INFO)); + pBackGptInfo = malloc(sizeof(HISO_BK_GPT_INFO)); + if (NULL == pMainGptInfo || NULL == pBackGptInfo) + { + close(fd); + return 1; + } + + read(fd, pMainGptInfo, sizeof(HISO_GPT_INFO)); + + if (argv[1][0] == '-' && argv[1][1] == 'd') + { + DumpGptInfo(pMainGptInfo); + } + else + { + DiskSize = lseek(fd, 0, SEEK_END); + lseek(fd, DiskSize - 33 * 512, SEEK_SET); + read(fd, pBackGptInfo, sizeof(HISO_BK_GPT_INFO)); + + Name = pMainGptInfo->PartTbl[1].Name; + if (Name[0] == 'V' && Name[1] == 'T' && Name[2] == 'O' && Name[3] == 'Y') + { + if (pMainGptInfo->PartTbl[1].Attr != HIPERISO_EFI_PART_ATTR) + { + pMainGptInfo->PartTbl[1].Attr = HIPERISO_EFI_PART_ATTR; + pMainGptInfo->Head.PartTblCrc = HisoCrc32(pMainGptInfo->PartTbl, sizeof(pMainGptInfo->PartTbl)); + pMainGptInfo->Head.Crc = 0; + pMainGptInfo->Head.Crc = HisoCrc32(&pMainGptInfo->Head, pMainGptInfo->Head.Length); + + pBackGptInfo->PartTbl[1].Attr = HIPERISO_EFI_PART_ATTR; + pBackGptInfo->Head.PartTblCrc = HisoCrc32(pBackGptInfo->PartTbl, sizeof(pBackGptInfo->PartTbl)); + pBackGptInfo->Head.Crc = 0; + pBackGptInfo->Head.Crc = HisoCrc32(&pBackGptInfo->Head, pBackGptInfo->Head.Length); + + lseek(fd, 512, SEEK_SET); + write(fd, (UINT8 *)pMainGptInfo + 512, sizeof(HISO_GPT_INFO) - 512); + + lseek(fd, DiskSize - 33 * 512, SEEK_SET); + write(fd, pBackGptInfo, sizeof(HISO_BK_GPT_INFO)); + + fsync(fd); + } + } + } + + free(pMainGptInfo); + free(pBackGptInfo); + close(fd); + + return 0; +} + diff --git a/src/hisocli/partresize.c b/src/hisocli/partresize.c new file mode 100644 index 0000000..8e5491b --- /dev/null +++ b/src/hisocli/partresize.c @@ -0,0 +1,683 @@ +/****************************************************************************** + * partresize.c ---- hiperiso part resize util + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "hisocli.h" + +static int g_disk_fd = 0; +static UINT64 g_disk_offset = 0; +static GUID g_ZeroGuid = {0}; +static GUID g_WindowsDataPartGuid = { 0xebd0a0a2, 0xb9e5, 0x4433, { 0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7 } }; + +static int hiso_disk_read(uint32 sector, uint8 *buffer, uint32 sector_count) +{ + UINT64 offset = sector * 512ULL; + + lseek(g_disk_fd, g_disk_offset + offset, SEEK_SET); + read(g_disk_fd, buffer, sector_count * 512); + + return 1; +} + +static int hiso_disk_write(uint32 sector, uint8 *buffer, uint32 sector_count) +{ + UINT64 offset = sector * 512ULL; + + lseek(g_disk_fd, g_disk_offset + offset, SEEK_SET); + write(g_disk_fd, buffer, sector_count * 512); + + return 1; +} + + +static int gpt_check(const char *disk) +{ + int fd = -1; + int rc = 1; + HISO_GPT_INFO *pGPT = NULL; + + fd = open(disk, O_RDONLY); + if (fd < 0) + { + printf("Failed to open %s\n", disk); + goto out; + } + + pGPT = malloc(sizeof(HISO_GPT_INFO)); + if (NULL == pGPT) + { + goto out; + } + memset(pGPT, 0, sizeof(HISO_GPT_INFO)); + + read(fd, pGPT, sizeof(HISO_GPT_INFO)); + + if (pGPT->MBR.PartTbl[0].FsFlag == 0xEE && memcmp(pGPT->Head.Signature, "EFI PART", 8) == 0) + { + rc = 0; + } + +out: + check_close(fd); + check_free(pGPT); + return rc; +} + +static int part_check(const char *disk) +{ + int i; + int fd = -1; + int rc = 0; + int Index = 0; + int Count = 0; + int PartStyle = 0; + UINT64 Part1Start; + UINT64 Part1End; + UINT64 NextPartStart; + UINT64 DiskSizeInBytes; + HISO_GPT_INFO *pGPT = NULL; + + DiskSizeInBytes = get_disk_size_in_byte(disk); + if (DiskSizeInBytes == 0) + { + printf("Failed to get disk size of %s\n", disk); + goto out; + } + + fd = open(disk, O_RDONLY); + if (fd < 0) + { + printf("Failed to open %s\n", disk); + goto out; + } + + pGPT = malloc(sizeof(HISO_GPT_INFO)); + if (NULL == pGPT) + { + goto out; + } + memset(pGPT, 0, sizeof(HISO_GPT_INFO)); + + read(fd, pGPT, sizeof(HISO_GPT_INFO)); + + if (pGPT->MBR.PartTbl[0].FsFlag == 0xEE && memcmp(pGPT->Head.Signature, "EFI PART", 8) == 0) + { + PartStyle = 1; + } + else + { + PartStyle = 0; + } + + if (PartStyle == 0) + { + PART_TABLE *PartTbl = pGPT->MBR.PartTbl; + + for (Count = 0, i = 0; i < 4; i++) + { + if (PartTbl[i].SectorCount > 0) + { + printf("MBR Part%d SectorStart:%u SectorCount:%u\n", i + 1, PartTbl[i].StartSectorId, PartTbl[i].SectorCount); + Count++; + } + } + + //We must have a free partition table for HISOEFI partition + if (Count >= 4) + { + printf("###[FAIL] 4 MBR partition tables are all used.\n"); + goto out; + } + + if (PartTbl[0].SectorCount > 0) + { + Part1Start = PartTbl[0].StartSectorId; + Part1End = PartTbl[0].SectorCount + Part1Start; + } + else + { + printf("###[FAIL] MBR Partition 1 is invalid\n"); + goto out; + } + + Index = -1; + NextPartStart = DiskSizeInBytes / 512ULL; + for (i = 1; i < 4; i++) + { + if (PartTbl[i].SectorCount > 0 && NextPartStart > PartTbl[i].StartSectorId) + { + Index = i; + NextPartStart = PartTbl[i].StartSectorId; + } + } + + NextPartStart *= 512ULL; + printf("DiskSize:%llu NextPartStart:%llu(LBA:%llu) Index:%d\n", + DiskSizeInBytes, NextPartStart, NextPartStart / 512ULL, Index); + } + else + { + HISO_GPT_PART_TBL *PartTbl = pGPT->PartTbl; + + for (Count = 0, i = 0; i < 128; i++) + { + if (memcmp(&(PartTbl[i].PartGuid), &g_ZeroGuid, sizeof(GUID))) + { + printf("GPT Part%d StartLBA:%llu LastLBA:%llu\n", i + 1, PartTbl[i].StartLBA, PartTbl[i].LastLBA); + Count++; + } + } + + if (Count >= 128) + { + printf("###[FAIL] 128 GPT partition tables are all used.\n"); + goto out; + } + + if (memcmp(&(PartTbl[0].PartGuid), &g_ZeroGuid, sizeof(GUID))) + { + Part1Start = PartTbl[0].StartLBA; + Part1End = PartTbl[0].LastLBA + 1; + } + else + { + printf("###[FAIL] GPT Partition 1 is invalid\n"); + goto out; + } + + Index = -1; + NextPartStart = (pGPT->Head.PartAreaEndLBA + 1); + for (i = 1; i < 128; i++) + { + if (memcmp(&(PartTbl[i].PartGuid), &g_ZeroGuid, sizeof(GUID)) && NextPartStart > PartTbl[i].StartLBA) + { + Index = i; + NextPartStart = PartTbl[i].StartLBA; + } + } + + NextPartStart *= 512ULL; + printf("DiskSize:%llu NextPartStart:%llu(LBA:%llu) Index:%d\n", + DiskSizeInBytes, NextPartStart, NextPartStart / 512ULL, Index); + } + + printf("Valid partition table (%s): Valid partition count:%d\n", (PartStyle == 0) ? "MBR" : "GPT", Count); + + //Partition 1 MUST start at 1MB + Part1Start *= 512ULL; + Part1End *= 512ULL; + + printf("Partition 1 start at: %llu %lluKB, end:%llu, NextPartStart:%llu\n", + Part1Start, Part1Start / 1024, Part1End, NextPartStart); + if (Part1Start != SIZE_1MB) + { + printf("###[FAIL] Partition 1 is not start at 1MB\n"); + goto out; + } + + + //If we have free space after partition 1 + if (NextPartStart - Part1End >= HIPERISO_EFI_PART_SIZE) + { + printf("Free space after partition 1 (%llu) is enough for HISOEFI part\n", NextPartStart - Part1End); + rc = 1; + } + else if (NextPartStart == Part1End) + { + printf("There is no free space after partition 1\n"); + rc = 2; + } + else + { + printf("The free space after partition 1 is not enough\n"); + rc = 2; + } + +out: + check_close(fd); + check_free(pGPT); + return rc; +} + +static int secureboot_proc(char *disk, UINT64 part2start) +{ + int rc = 0; + int size; + int fd = -1; + char *filebuf = NULL; + void *file = NULL; + + fd = open(disk, O_RDWR); + if (fd < 0) + { + printf("Failed to open %s\n", disk); + return 1; + } + + g_disk_fd = fd; + g_disk_offset = part2start * 512ULL; + + fl_init(); + + if (0 == fl_attach_media(hiso_disk_read, hiso_disk_write)) + { + file = fl_fopen("/EFI/BOOT/grubx64_real.efi", "rb"); + printf("Open hiperiso efi file %p\n", file); + if (file) + { + fl_fseek(file, 0, SEEK_END); + size = (int)fl_ftell(file); + fl_fseek(file, 0, SEEK_SET); + + printf("hiperiso x64 efi file size %d ...\n", size); + + filebuf = (char *)malloc(size); + if (filebuf) + { + fl_fread(filebuf, 1, size, file); + } + + fl_fclose(file); + + fl_remove("/EFI/BOOT/BOOTX64.EFI"); + fl_remove("/EFI/BOOT/grubx64.efi"); + fl_remove("/EFI/BOOT/grubx64_real.efi"); + fl_remove("/EFI/BOOT/MokManager.efi"); + fl_remove("/EFI/BOOT/mmx64.efi"); + fl_remove("/ENROLL_THIS_KEY_IN_MOKMANAGER.cer"); + + file = fl_fopen("/EFI/BOOT/BOOTX64.EFI", "wb"); + printf("Open bootx64 efi file %p\n", file); + if (file) + { + if (filebuf) + { + fl_fwrite(filebuf, 1, size, file); + } + + fl_fflush(file); + fl_fclose(file); + } + + if (filebuf) + { + free(filebuf); + } + } + + file = fl_fopen("/EFI/BOOT/grubia32_real.efi", "rb"); + printf("Open hiperiso ia32 efi file %p\n", file); + if (file) + { + fl_fseek(file, 0, SEEK_END); + size = (int)fl_ftell(file); + fl_fseek(file, 0, SEEK_SET); + + printf("hiperiso efi file size %d ...\n", size); + + filebuf = (char *)malloc(size); + if (filebuf) + { + fl_fread(filebuf, 1, size, file); + } + + fl_fclose(file); + + fl_remove("/EFI/BOOT/BOOTIA32.EFI"); + fl_remove("/EFI/BOOT/grubia32.efi"); + fl_remove("/EFI/BOOT/grubia32_real.efi"); + fl_remove("/EFI/BOOT/mmia32.efi"); + + file = fl_fopen("/EFI/BOOT/BOOTIA32.EFI", "wb"); + printf("Open bootia32 efi file %p\n", file); + if (file) + { + if (filebuf) + { + fl_fwrite(filebuf, 1, size, file); + } + + fl_fflush(file); + fl_fclose(file); + } + + if (filebuf) + { + free(filebuf); + } + } + + } + else + { + rc = 1; + } + + fl_shutdown(); + fsync(fd); + + return rc; +} + +static int HiperisoFillMBRLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 SectorCount, PART_TABLE *Table) +{ + UINT8 Head; + UINT8 Sector; + UINT8 nSector = 63; + UINT8 nHead = 8; + UINT32 Cylinder; + UINT32 EndSectorId; + + while (nHead != 0 && (DiskSizeInBytes / 512 / nSector / nHead) > 1024) + { + nHead = (UINT8)nHead * 2; + } + + if (nHead == 0) + { + nHead = 255; + } + + Cylinder = StartSectorId / nSector / nHead; + Head = StartSectorId / nSector % nHead; + Sector = StartSectorId % nSector + 1; + + Table->StartHead = Head; + Table->StartSector = Sector; + Table->StartCylinder = Cylinder; + + EndSectorId = StartSectorId + SectorCount - 1; + Cylinder = EndSectorId / nSector / nHead; + Head = EndSectorId / nSector % nHead; + Sector = EndSectorId % nSector + 1; + + Table->EndHead = Head; + Table->EndSector = Sector; + Table->EndCylinder = Cylinder; + + Table->StartSectorId = StartSectorId; + Table->SectorCount = SectorCount; + + return 0; +} + + +static int WriteDataToPhyDisk(int fd, UINT64 offset, void *buffer, int len) +{ + ssize_t wrlen; + off_t newseek; + + newseek = lseek(fd, offset, SEEK_SET); + if (newseek != offset) + { + printf("Failed to lseek %llu %lld %d\n", offset, (long long)newseek, errno); + return 0; + } + + wrlen = write(fd, buffer, len); + if ((int)wrlen != len) + { + printf("Failed to write %d %d %d\n", len, (int)wrlen, errno); + return 0; + } + + return 1; +} + +static int HiperisoFillBackupGptHead(HISO_GPT_INFO *pInfo, HISO_GPT_HDR *pHead) +{ + UINT64 LBA; + UINT64 BackupLBA; + + memcpy(pHead, &pInfo->Head, sizeof(HISO_GPT_HDR)); + + LBA = pHead->EfiStartLBA; + BackupLBA = pHead->EfiBackupLBA; + + pHead->EfiStartLBA = BackupLBA; + pHead->EfiBackupLBA = LBA; + pHead->PartTblStartLBA = BackupLBA + 1 - 33; + + pHead->Crc = 0; + pHead->Crc = HisoCrc32(pHead, pHead->Length); + + return 0; +} + +static int update_part_table(char *disk, UINT64 part2start) +{ + int i; + int j; + int fd = -1; + int rc = 1; + int PartStyle = 0; + ssize_t len = 0; + UINT64 DiskSizeInBytes; + HISO_GPT_INFO *pGPT = NULL; + HISO_GPT_HDR *pBack = NULL; + + DiskSizeInBytes = get_disk_size_in_byte(disk); + if (DiskSizeInBytes == 0) + { + printf("Failed to get disk size of %s\n", disk); + goto out; + } + + fd = open(disk, O_RDWR); + if (fd < 0) + { + printf("Failed to open %s\n", disk); + goto out; + } + + pGPT = malloc(sizeof(HISO_GPT_INFO) + sizeof(HISO_GPT_HDR)); + if (NULL == pGPT) + { + goto out; + } + memset(pGPT, 0, sizeof(HISO_GPT_INFO) + sizeof(HISO_GPT_HDR)); + + pBack = (HISO_GPT_HDR *)(pGPT + 1); + + len = read(fd, pGPT, sizeof(HISO_GPT_INFO)); + if (len != (ssize_t)sizeof(HISO_GPT_INFO)) + { + printf("Failed to read partition table %d err:%d\n", (int)len, errno); + goto out; + } + + if (pGPT->MBR.PartTbl[0].FsFlag == 0xEE && memcmp(pGPT->Head.Signature, "EFI PART", 8) == 0) + { + PartStyle = 1; + } + else + { + PartStyle = 0; + } + + if (PartStyle == 0) + { + PART_TABLE *PartTbl = pGPT->MBR.PartTbl; + + for (i = 1; i < 4; i++) + { + if (PartTbl[i].SectorCount == 0) + { + break; + } + } + + if (i >= 4) + { + printf("###[FAIL] Can not find a free MBR partition table.\n"); + goto out; + } + + for (j = i - 1; j > 0; j--) + { + printf("Move MBR partition table %d --> %d\n", j + 1, j + 2); + memcpy(PartTbl + (j + 1), PartTbl + j, sizeof(PART_TABLE)); + } + + memset(PartTbl + 1, 0, sizeof(PART_TABLE)); + HiperisoFillMBRLocation(DiskSizeInBytes, (UINT32)part2start, HIPERISO_EFI_PART_SIZE / 512, PartTbl + 1); + PartTbl[1].Active = 0x00; + PartTbl[1].FsFlag = 0xEF; // EFI System Partition + + PartTbl[0].Active = 0x80; // bootable + PartTbl[0].SectorCount = (UINT32)part2start - 2048; + + if (!WriteDataToPhyDisk(fd, 0, &(pGPT->MBR), 512)) + { + printf("MBR write MBR failed\n"); + goto out; + } + + fsync(fd); + printf("MBR update partition table success.\n"); + rc = 0; + } + else + { + HISO_GPT_PART_TBL *PartTbl = pGPT->PartTbl; + + for (i = 1; i < 128; i++) + { + if (memcmp(&(PartTbl[i].PartGuid), &g_ZeroGuid, sizeof(GUID)) == 0) + { + break; + } + } + + if (i >= 128) + { + printf("###[FAIL] Can not find a free GPT partition table.\n"); + goto out; + } + + for (j = i - 1; j > 0; j--) + { + printf("Move GPT partition table %d --> %d\n", j + 1, j + 2); + memcpy(PartTbl + (j + 1), PartTbl + j, sizeof(HISO_GPT_PART_TBL)); + } + + // to fix windows issue + memset(PartTbl + 1, 0, sizeof(HISO_GPT_PART_TBL)); + memcpy(&(PartTbl[1].PartType), &g_WindowsDataPartGuid, sizeof(GUID)); + hiperiso_gen_preudo_uuid(&(PartTbl[1].PartGuid)); + + PartTbl[0].LastLBA = part2start - 1; + + PartTbl[1].StartLBA = PartTbl[0].LastLBA + 1; + PartTbl[1].LastLBA = PartTbl[1].StartLBA + HIPERISO_EFI_PART_SIZE / 512 - 1; + PartTbl[1].Attr = HIPERISO_EFI_PART_ATTR; + PartTbl[1].Name[0] = 'V'; + PartTbl[1].Name[1] = 'T'; + PartTbl[1].Name[2] = 'O'; + PartTbl[1].Name[3] = 'Y'; + PartTbl[1].Name[4] = 'E'; + PartTbl[1].Name[5] = 'F'; + PartTbl[1].Name[6] = 'I'; + PartTbl[1].Name[7] = 0; + + //Update CRC + pGPT->Head.PartTblCrc = HisoCrc32(pGPT->PartTbl, sizeof(pGPT->PartTbl)); + pGPT->Head.Crc = 0; + pGPT->Head.Crc = HisoCrc32(&(pGPT->Head), pGPT->Head.Length); + + printf("pGPT->Head.EfiStartLBA=%llu\n", pGPT->Head.EfiStartLBA); + printf("pGPT->Head.EfiBackupLBA=%llu\n", pGPT->Head.EfiBackupLBA); + + HiperisoFillBackupGptHead(pGPT, pBack); + if (!WriteDataToPhyDisk(fd, pGPT->Head.EfiBackupLBA * 512, pBack, 512)) + { + printf("GPT write backup head failed\n"); + goto out; + } + + if (!WriteDataToPhyDisk(fd, (pGPT->Head.EfiBackupLBA - 32) * 512, pGPT->PartTbl, 512 * 32)) + { + printf("GPT write backup partition table failed\n"); + goto out; + } + + if (!WriteDataToPhyDisk(fd, 0, pGPT, 512 * 34)) + { + printf("GPT write MBR & Main partition table failed\n"); + goto out; + } + + fsync(fd); + printf("GPT update partition table success.\n"); + rc = 0; + } + +out: + check_close(fd); + check_free(pGPT); + return rc; +} + +int partresize_main(int argc, char **argv) +{ + UINT64 sector; + + if (argc != 3 && argc != 4) + { + printf("usage: partresize -c/-f /dev/sdb\n"); + return 1; + } + + if (strcmp(argv[1], "-c") == 0) + { + return part_check(argv[2]); + } + else if (strcmp(argv[1], "-s") == 0) + { + sector = strtoull(argv[3], NULL, 10); + return secureboot_proc(argv[2], sector); + } + else if (strcmp(argv[1], "-p") == 0) + { + sector = strtoull(argv[3], NULL, 10); + return update_part_table(argv[2], sector); + } + else if (strcmp(argv[1], "-t") == 0) + { + return gpt_check(argv[2]); + } + else + { + return 1; + } +} + diff --git a/src/hisofat/build.sh b/src/hisofat/build.sh new file mode 100644 index 0000000..d9604f9 --- /dev/null +++ b/src/hisofat/build.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +rm -f hisofat_64 +rm -f hisofat_32 +rm -f hisofat_aa64 +rm -f hisofat_m64e + + +gcc -O2 -D_FILE_OFFSET_BITS=64 hisofat_linux.c -Ifat_io_lib/include fat_io_lib/lib/libfat_io_64.a -o hisofat_64 +gcc -m32 -O2 -D_FILE_OFFSET_BITS=64 hisofat_linux.c -Ifat_io_lib/include fat_io_lib/lib/libfat_io_32.a -o hisofat_32 +aarch64-buildroot-linux-uclibc-gcc -static -O2 -D_FILE_OFFSET_BITS=64 hisofat_linux.c -Ifat_io_lib/include fat_io_lib/lib/libfat_io_aa64.a -o hisofat_aa64 +mips64el-linux-musl-gcc -mips64r2 -mabi=64 -static -O2 -D_FILE_OFFSET_BITS=64 hisofat_linux.c -Ifat_io_lib/include fat_io_lib/lib/libfat_io_m64e.a -o hisofat_m64e + + +if [ -e hisofat_64 ] && [ -e hisofat_32 ] && [ -e hisofat_aa64 ] && [ -e hisofat_m64e ]; then + echo -e "\n===== success $name =======\n" + + strip --strip-all hisofat_32 + strip --strip-all hisofat_64 + aarch64-buildroot-linux-uclibc-strip --strip-all hisofat_aa64 + mips64el-linux-musl-strip --strip-all hisofat_m64e + + [ -d ../INSTALL/tool/i386/ ] && mv hisofat_32 ../INSTALL/tool/i386/hisofat + [ -d ../INSTALL/tool/x86_64/ ] && mv hisofat_64 ../INSTALL/tool/x86_64/hisofat + [ -d ../INSTALL/tool/aarch64/ ] && mv hisofat_aa64 ../INSTALL/tool/aarch64/hisofat + [ -d ../INSTALL/tool/mips64el/ ] && mv hisofat_m64e ../INSTALL/tool/mips64el/hisofat +else + echo -e "\n===== failed =======\n" + exit 1 +fi diff --git a/src/hisofat/fat_io_lib/buildlib.sh b/src/hisofat/fat_io_lib/buildlib.sh new file mode 100644 index 0000000..eaab119 --- /dev/null +++ b/src/hisofat/fat_io_lib/buildlib.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +if ! [ -f fat_io_lib.zip ]; then + echo "No fat_io_lib.zip found ..." + exit 1 +fi + +unzip fat_io_lib.zip + +rm -rf include +rm -rf lib + + +cd release +gcc -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c +ar -rc libfat_io_64.a *.o +rm -f *.o + + +gcc -m32 -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c +ar -rc libfat_io_32.a *.o +rm -f *.o + + +aarch64-linux-gnu-gcc -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c +ar -rc libfat_io_aa64.a *.o +rm -f *.o + + +mips64el-linux-musl-gcc -mips64r2 -mabi=64 -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c +ar -rc libfat_io_m64e.a *.o +rm -f *.o + +cd - + + +mkdir lib +mkdir include + +mv release/*.a lib/ +cp -a release/*.h include/ + + diff --git a/src/hisofat/fat_io_lib/fat_io_lib.zip b/src/hisofat/fat_io_lib/fat_io_lib.zip new file mode 100644 index 0000000000000000000000000000000000000000..71f4e83e1d449e59d30389a39ec6113cbeb0441a GIT binary patch literal 55500 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°t%CNP{ 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 F{{!vU@%{h+ literal 0 HcmV?d00001 diff --git a/src/hisofat/hisofat_linux.c b/src/hisofat/hisofat_linux.c new file mode 100644 index 0000000..a73ae61 --- /dev/null +++ b/src/hisofat/hisofat_linux.c @@ -0,0 +1,159 @@ +/****************************************************************************** + * hisofat.c ---- Parse fat file system + * + * Copyright (c) 2020, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +static int g_disk_fd = 0; + +static int hiso_disk_read(uint32 sector, uint8 *buffer, uint32 sector_count) +{ + lseek(g_disk_fd, sector * 512, SEEK_SET); + read(g_disk_fd, buffer, sector_count * 512); + + return 1; +} + +static int check_secure_boot(void) +{ + void *flfile = NULL; + + flfile = fl_fopen("/EFI/BOOT/grubx64_real.efi", "rb"); + if (flfile) + { + fl_fclose(flfile); + return 0; + } + + return 1; +} + +static int get_hiperiso_version(void) +{ + int rc = 1; + int size = 0; + char *buf = NULL; + char *pos = NULL; + char *end = NULL; + void *flfile = NULL; + + flfile = fl_fopen("/grub/grub.cfg", "rb"); + if (flfile) + { + fl_fseek(flfile, 0, SEEK_END); + size = (int)fl_ftell(flfile); + + fl_fseek(flfile, 0, SEEK_SET); + + buf = malloc(size + 1); + if (buf) + { + fl_fread(buf, 1, size, flfile); + buf[size] = 0; + + pos = strstr(buf, "HIPERISO_VERSION="); + if (pos) + { + pos += strlen("HIPERISO_VERSION="); + if (*pos == '"') + { + pos++; + } + + end = pos; + while (*end != 0 && *end != '"' && *end != '\r' && *end != '\n') + { + end++; + } + + *end = 0; + + printf("%s\n", pos); + rc = 0; + } + free(buf); + } + + fl_fclose(flfile); + } + + return rc; +} + +int main(int argc, char **argv) +{ + int op = 0; + int rc = 1; + char *disk; + + if (argc != 2 && argc != 3) + { + printf("Usage: hisofat /dev/sdbs \n"); + printf("Usage: hisofat -s /dev/sdbs \n"); + return 1; + } + + if (argv[1][0] == '-' && argv[1][1] == 'T') + { + return 0; + } + + disk = argv[1]; + if (argv[1][0] == '-' && argv[1][1] == 's') + { + op = 1; + disk = argv[2]; + } + + g_disk_fd = open(disk, O_RDONLY); + if (g_disk_fd < 0) + { + printf("Failed to open %s\n", disk); + return 1; + } + + fl_init(); + + if (0 == fl_attach_media(hiso_disk_read, NULL)) + { + if (op == 0) + { + rc = get_hiperiso_version(); + } + else + { + rc = check_secure_boot(); + } + } + + fl_shutdown(); + + close(g_disk_fd); + + return rc; +} + diff --git a/src/hisogpt/build.sh b/src/hisogpt/build.sh new file mode 100644 index 0000000..65ab39d --- /dev/null +++ b/src/hisogpt/build.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +rm -f hisogpt_64 +rm -f hisogpt_32 +rm -f hisogpt_aa64 + +/opt/diet64/bin/diet -Os gcc -D_FILE_OFFSET_BITS=64 hisogpt.c crc32.c -o hisogpt_64 +/opt/diet32/bin/diet -Os gcc -D_FILE_OFFSET_BITS=64 -m32 hisogpt.c crc32.c -o hisogpt_32 + +aarch64-buildroot-linux-uclibc-gcc -Os -static -D_FILE_OFFSET_BITS=64 hisogpt.c crc32.c -o hisogpt_aa64 +mips64el-linux-musl-gcc -mips64r2 -mabi=64 -static -Os -D_FILE_OFFSET_BITS=64 hisogpt.c crc32.c -o hisogpt_m64e + + +#gcc -D_FILE_OFFSET_BITS=64 -static -Wall hisogpt.c -o hisotool_64 +#gcc -D_FILE_OFFSET_BITS=64 -Wall -m32 hisogpt.c -o hisotool_32 + +if [ -e hisogpt_64 ] && [ -e hisogpt_32 ] && [ -e hisogpt_aa64 ] && [ -e hisogpt_m64e ]; then + echo -e '\n############### SUCCESS ###############\n' + mv hisogpt_64 ../INSTALL/tool/x86_64/hisogpt + mv hisogpt_32 ../INSTALL/tool/i386/hisogpt + + aarch64-buildroot-linux-uclibc-strip --strip-all hisogpt_aa64 + mv hisogpt_aa64 ../INSTALL/tool/aarch64/hisogpt + + mips64el-linux-musl-strip --strip-all hisogpt_m64e + mv hisogpt_m64e ../INSTALL/tool/mips64el/hisogpt + +else + echo -e '\n############### FAILED ################\n' + exit 1 +fi + diff --git a/src/hisogpt/crc32.c b/src/hisogpt/crc32.c new file mode 100644 index 0000000..fca19e6 --- /dev/null +++ b/src/hisogpt/crc32.c @@ -0,0 +1,315 @@ +/****************************************************************************** + * hisogpt.c ---- hiperiso gpt util + * + * Copyright (c) 2020, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define VOID void +#define CHAR char +#define UINT64 unsigned long long +#define UINT32 unsigned int +#define UINT16 unsigned short +#define CHAR16 unsigned short +#define UINT8 unsigned char + +UINT32 g_crc_table[256] = { + 0x00000000, + 0x77073096, + 0xEE0E612C, + 0x990951BA, + 0x076DC419, + 0x706AF48F, + 0xE963A535, + 0x9E6495A3, + 0x0EDB8832, + 0x79DCB8A4, + 0xE0D5E91E, + 0x97D2D988, + 0x09B64C2B, + 0x7EB17CBD, + 0xE7B82D07, + 0x90BF1D91, + 0x1DB71064, + 0x6AB020F2, + 0xF3B97148, + 0x84BE41DE, + 0x1ADAD47D, + 0x6DDDE4EB, + 0xF4D4B551, + 0x83D385C7, + 0x136C9856, + 0x646BA8C0, + 0xFD62F97A, + 0x8A65C9EC, + 0x14015C4F, + 0x63066CD9, + 0xFA0F3D63, + 0x8D080DF5, + 0x3B6E20C8, + 0x4C69105E, + 0xD56041E4, + 0xA2677172, + 0x3C03E4D1, + 0x4B04D447, + 0xD20D85FD, + 0xA50AB56B, + 0x35B5A8FA, + 0x42B2986C, + 0xDBBBC9D6, + 0xACBCF940, + 0x32D86CE3, + 0x45DF5C75, + 0xDCD60DCF, + 0xABD13D59, + 0x26D930AC, + 0x51DE003A, + 0xC8D75180, + 0xBFD06116, + 0x21B4F4B5, + 0x56B3C423, + 0xCFBA9599, + 0xB8BDA50F, + 0x2802B89E, + 0x5F058808, + 0xC60CD9B2, + 0xB10BE924, + 0x2F6F7C87, + 0x58684C11, + 0xC1611DAB, + 0xB6662D3D, + 0x76DC4190, + 0x01DB7106, + 0x98D220BC, + 0xEFD5102A, + 0x71B18589, + 0x06B6B51F, + 0x9FBFE4A5, + 0xE8B8D433, + 0x7807C9A2, + 0x0F00F934, + 0x9609A88E, + 0xE10E9818, + 0x7F6A0DBB, + 0x086D3D2D, + 0x91646C97, + 0xE6635C01, + 0x6B6B51F4, + 0x1C6C6162, + 0x856530D8, + 0xF262004E, + 0x6C0695ED, + 0x1B01A57B, + 0x8208F4C1, + 0xF50FC457, + 0x65B0D9C6, + 0x12B7E950, + 0x8BBEB8EA, + 0xFCB9887C, + 0x62DD1DDF, + 0x15DA2D49, + 0x8CD37CF3, + 0xFBD44C65, + 0x4DB26158, + 0x3AB551CE, + 0xA3BC0074, + 0xD4BB30E2, + 0x4ADFA541, + 0x3DD895D7, + 0xA4D1C46D, + 0xD3D6F4FB, + 0x4369E96A, + 0x346ED9FC, + 0xAD678846, + 0xDA60B8D0, + 0x44042D73, + 0x33031DE5, + 0xAA0A4C5F, + 0xDD0D7CC9, + 0x5005713C, + 0x270241AA, + 0xBE0B1010, + 0xC90C2086, + 0x5768B525, + 0x206F85B3, + 0xB966D409, + 0xCE61E49F, + 0x5EDEF90E, + 0x29D9C998, + 0xB0D09822, + 0xC7D7A8B4, + 0x59B33D17, + 0x2EB40D81, + 0xB7BD5C3B, + 0xC0BA6CAD, + 0xEDB88320, + 0x9ABFB3B6, + 0x03B6E20C, + 0x74B1D29A, + 0xEAD54739, + 0x9DD277AF, + 0x04DB2615, + 0x73DC1683, + 0xE3630B12, + 0x94643B84, + 0x0D6D6A3E, + 0x7A6A5AA8, + 0xE40ECF0B, + 0x9309FF9D, + 0x0A00AE27, + 0x7D079EB1, + 0xF00F9344, + 0x8708A3D2, + 0x1E01F268, + 0x6906C2FE, + 0xF762575D, + 0x806567CB, + 0x196C3671, + 0x6E6B06E7, + 0xFED41B76, + 0x89D32BE0, + 0x10DA7A5A, + 0x67DD4ACC, + 0xF9B9DF6F, + 0x8EBEEFF9, + 0x17B7BE43, + 0x60B08ED5, + 0xD6D6A3E8, + 0xA1D1937E, + 0x38D8C2C4, + 0x4FDFF252, + 0xD1BB67F1, + 0xA6BC5767, + 0x3FB506DD, + 0x48B2364B, + 0xD80D2BDA, + 0xAF0A1B4C, + 0x36034AF6, + 0x41047A60, + 0xDF60EFC3, + 0xA867DF55, + 0x316E8EEF, + 0x4669BE79, + 0xCB61B38C, + 0xBC66831A, + 0x256FD2A0, + 0x5268E236, + 0xCC0C7795, + 0xBB0B4703, + 0x220216B9, + 0x5505262F, + 0xC5BA3BBE, + 0xB2BD0B28, + 0x2BB45A92, + 0x5CB36A04, + 0xC2D7FFA7, + 0xB5D0CF31, + 0x2CD99E8B, + 0x5BDEAE1D, + 0x9B64C2B0, + 0xEC63F226, + 0x756AA39C, + 0x026D930A, + 0x9C0906A9, + 0xEB0E363F, + 0x72076785, + 0x05005713, + 0x95BF4A82, + 0xE2B87A14, + 0x7BB12BAE, + 0x0CB61B38, + 0x92D28E9B, + 0xE5D5BE0D, + 0x7CDCEFB7, + 0x0BDBDF21, + 0x86D3D2D4, + 0xF1D4E242, + 0x68DDB3F8, + 0x1FDA836E, + 0x81BE16CD, + 0xF6B9265B, + 0x6FB077E1, + 0x18B74777, + 0x88085AE6, + 0xFF0F6A70, + 0x66063BCA, + 0x11010B5C, + 0x8F659EFF, + 0xF862AE69, + 0x616BFFD3, + 0x166CCF45, + 0xA00AE278, + 0xD70DD2EE, + 0x4E048354, + 0x3903B3C2, + 0xA7672661, + 0xD06016F7, + 0x4969474D, + 0x3E6E77DB, + 0xAED16A4A, + 0xD9D65ADC, + 0x40DF0B66, + 0x37D83BF0, + 0xA9BCAE53, + 0xDEBB9EC5, + 0x47B2CF7F, + 0x30B5FFE9, + 0xBDBDF21C, + 0xCABAC28A, + 0x53B39330, + 0x24B4A3A6, + 0xBAD03605, + 0xCDD70693, + 0x54DE5729, + 0x23D967BF, + 0xB3667A2E, + 0xC4614AB8, + 0x5D681B02, + 0x2A6F2B94, + 0xB40BBE37, + 0xC30C8EA1, + 0x5A05DF1B, + 0x2D02EF8D +}; + +UINT32 HisoCrc32(VOID *Buffer, UINT32 Length) +{ + UINT32 i; + UINT8 *Ptr = Buffer; + UINT32 Crc = 0xFFFFFFFF; + + for (i = 0; i < Length; i++, Ptr++) + { + Crc = (Crc >> 8) ^ g_crc_table[(UINT8) Crc ^ *Ptr]; + } + + return Crc ^ 0xffffffff; +} + diff --git a/src/hisogpt/hisogpt.c b/src/hisogpt/hisogpt.c new file mode 100644 index 0000000..0d9e1e5 --- /dev/null +++ b/src/hisogpt/hisogpt.c @@ -0,0 +1,323 @@ +/****************************************************************************** + * hisogpt.c ---- hiperiso gpt util + * + * Copyright (c) 2020, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define VOID void +#define CHAR char +#define UINT64 unsigned long long +#define UINT32 unsigned int +#define UINT16 unsigned short +#define CHAR16 unsigned short +#define UINT8 unsigned char + +UINT32 HisoCrc32(VOID *Buffer, UINT32 Length); + +#define COMPILE_ASSERT(expr) extern char __compile_assert[(expr) ? 1 : -1] + +#pragma pack(1) + +typedef struct PART_TABLE +{ + UINT8 Active; + + UINT8 StartHead; + UINT16 StartSector : 6; + UINT16 StartCylinder : 10; + + UINT8 FsFlag; + + UINT8 EndHead; + UINT16 EndSector : 6; + UINT16 EndCylinder : 10; + + UINT32 StartSectorId; + UINT32 SectorCount; +}PART_TABLE; + +typedef struct MBR_HEAD +{ + UINT8 BootCode[446]; + PART_TABLE PartTbl[4]; + UINT8 Byte55; + UINT8 ByteAA; +}MBR_HEAD; + +typedef struct GUID +{ + UINT32 data1; + UINT16 data2; + UINT16 data3; + UINT8 data4[8]; +}GUID; + +typedef struct HISO_GPT_HDR +{ + CHAR Signature[8]; /* EFI PART */ + UINT8 Version[4]; + UINT32 Length; + UINT32 Crc; + UINT8 Reserved1[4]; + UINT64 EfiStartLBA; + UINT64 EfiBackupLBA; + UINT64 PartAreaStartLBA; + UINT64 PartAreaEndLBA; + GUID DiskGuid; + UINT64 PartTblStartLBA; + UINT32 PartTblTotNum; + UINT32 PartTblEntryLen; + UINT32 PartTblCrc; + UINT8 Reserved2[420]; +}HISO_GPT_HDR; + +COMPILE_ASSERT(sizeof(HISO_GPT_HDR) == 512); + +typedef struct HISO_GPT_PART_TBL +{ + GUID PartType; + GUID PartGuid; + UINT64 StartLBA; + UINT64 LastLBA; + UINT64 Attr; + CHAR16 Name[36]; +}HISO_GPT_PART_TBL; +COMPILE_ASSERT(sizeof(HISO_GPT_PART_TBL) == 128); + +typedef struct HISO_GPT_INFO +{ + MBR_HEAD MBR; + HISO_GPT_HDR Head; + HISO_GPT_PART_TBL PartTbl[128]; +}HISO_GPT_INFO; + +typedef struct HISO_BK_GPT_INFO +{ + HISO_GPT_PART_TBL PartTbl[128]; + HISO_GPT_HDR Head; +}HISO_BK_GPT_INFO; + +COMPILE_ASSERT(sizeof(HISO_GPT_INFO) == 512 * 34); +COMPILE_ASSERT(sizeof(HISO_BK_GPT_INFO) == 512 * 33); + +#pragma pack() + +void DumpGuid(const char *prefix, GUID *guid) +{ + printf("%s: %08x-%04x-%04x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\n", + prefix, + guid->data1, guid->data2, guid->data3, + guid->data4[0], guid->data4[1], guid->data4[2], guid->data4[3], + guid->data4[4], guid->data4[5], guid->data4[6], guid->data4[7] + ); +} + +void DumpHead(HISO_GPT_HDR *pHead) +{ + UINT32 CrcRead; + UINT32 CrcCalc; + + printf("Signature:<%s>\n", pHead->Signature); + printf("Version:<%02x %02x %02x %02x>\n", pHead->Version[0], pHead->Version[1], pHead->Version[2], pHead->Version[3]); + printf("Length:%u\n", pHead->Length); + printf("Crc:0x%08x\n", pHead->Crc); + printf("EfiStartLBA:%lu\n", pHead->EfiStartLBA); + printf("EfiBackupLBA:%lu\n", pHead->EfiBackupLBA); + printf("PartAreaStartLBA:%lu\n", pHead->PartAreaStartLBA); + printf("PartAreaEndLBA:%lu\n", pHead->PartAreaEndLBA); + DumpGuid("DiskGuid", &pHead->DiskGuid); + + printf("PartTblStartLBA:%lu\n", pHead->PartTblStartLBA); + printf("PartTblTotNum:%u\n", pHead->PartTblTotNum); + printf("PartTblEntryLen:%u\n", pHead->PartTblEntryLen); + printf("PartTblCrc:0x%08x\n", pHead->PartTblCrc); + + CrcRead = pHead->Crc; + pHead->Crc = 0; + CrcCalc = HisoCrc32(pHead, pHead->Length); + + if (CrcCalc != CrcRead) + { + printf("Head CRC Check Failed\n"); + } + else + { + printf("Head CRC Check SUCCESS [%x] [%x]\n", CrcCalc, CrcRead); + } + + CrcRead = pHead->PartTblCrc; + CrcCalc = HisoCrc32(pHead + 1, pHead->PartTblEntryLen * pHead->PartTblTotNum); + if (CrcCalc != CrcRead) + { + printf("Part Table CRC Check Failed\n"); + } + else + { + printf("Part Table CRC Check SUCCESS [%x] [%x]\n", CrcCalc, CrcRead); + } +} + +void DumpPartTable(HISO_GPT_PART_TBL *Tbl) +{ + int i; + + DumpGuid("PartType", &Tbl->PartType); + DumpGuid("PartGuid", &Tbl->PartGuid); + printf("StartLBA:%lu\n", Tbl->StartLBA); + printf("LastLBA:%lu\n", Tbl->LastLBA); + printf("Attr:0x%lx\n", Tbl->Attr); + printf("Name:"); + + for (i = 0; i < 36 && Tbl->Name[i]; i++) + { + printf("%c", (CHAR)(Tbl->Name[i])); + } + printf("\n"); +} + +void DumpMBR(MBR_HEAD *pMBR) +{ + int i; + + for (i = 0; i < 4; i++) + { + printf("=========== Partition Table %d ============\n", i + 1); + printf("PartTbl.Active = 0x%x\n", pMBR->PartTbl[i].Active); + printf("PartTbl.FsFlag = 0x%x\n", pMBR->PartTbl[i].FsFlag); + printf("PartTbl.StartSectorId = %u\n", pMBR->PartTbl[i].StartSectorId); + printf("PartTbl.SectorCount = %u\n", pMBR->PartTbl[i].SectorCount); + printf("PartTbl.StartHead = %u\n", pMBR->PartTbl[i].StartHead); + printf("PartTbl.StartSector = %u\n", pMBR->PartTbl[i].StartSector); + printf("PartTbl.StartCylinder = %u\n", pMBR->PartTbl[i].StartCylinder); + printf("PartTbl.EndHead = %u\n", pMBR->PartTbl[i].EndHead); + printf("PartTbl.EndSector = %u\n", pMBR->PartTbl[i].EndSector); + printf("PartTbl.EndCylinder = %u\n", pMBR->PartTbl[i].EndCylinder); + } +} + +int DumpGptInfo(HISO_GPT_INFO *pGptInfo) +{ + int i; + + DumpMBR(&pGptInfo->MBR); + DumpHead(&pGptInfo->Head); + + for (i = 0; i < 128; i++) + { + if (pGptInfo->PartTbl[i].StartLBA == 0) + { + break; + } + + printf("=====Part %d=====\n", i); + DumpPartTable(pGptInfo->PartTbl + i); + } + + return 0; +} + +#define HIPERISO_EFI_PART_ATTR 0x8000000000000000ULL + +int main(int argc, const char **argv) +{ + int i; + int fd; + UINT64 DiskSize; + CHAR16 *Name = NULL; + HISO_GPT_INFO *pMainGptInfo = NULL; + HISO_BK_GPT_INFO *pBackGptInfo = NULL; + + if (argc != 3) + { + printf("usage: hisogpt -f /dev/sdb\n"); + return 1; + } + + fd = open(argv[2], O_RDWR); + if (fd < 0) + { + printf("Failed to open %s\n", argv[2]); + return 1; + } + + pMainGptInfo = malloc(sizeof(HISO_GPT_INFO)); + pBackGptInfo = malloc(sizeof(HISO_BK_GPT_INFO)); + if (NULL == pMainGptInfo || NULL == pBackGptInfo) + { + close(fd); + return 1; + } + + read(fd, pMainGptInfo, sizeof(HISO_GPT_INFO)); + + if (argv[1][0] == '-' && argv[1][1] == 'd') + { + DumpGptInfo(pMainGptInfo); + } + else + { + DiskSize = lseek(fd, 0, SEEK_END); + lseek(fd, DiskSize - 33 * 512, SEEK_SET); + read(fd, pBackGptInfo, sizeof(HISO_BK_GPT_INFO)); + + Name = pMainGptInfo->PartTbl[1].Name; + if (Name[0] == 'V' && Name[1] == 'T' && Name[2] == 'O' && Name[3] == 'Y') + { + if (pMainGptInfo->PartTbl[1].Attr != HIPERISO_EFI_PART_ATTR) + { + pMainGptInfo->PartTbl[1].Attr = HIPERISO_EFI_PART_ATTR; + pMainGptInfo->Head.PartTblCrc = HisoCrc32(pMainGptInfo->PartTbl, sizeof(pMainGptInfo->PartTbl)); + pMainGptInfo->Head.Crc = 0; + pMainGptInfo->Head.Crc = HisoCrc32(&pMainGptInfo->Head, pMainGptInfo->Head.Length); + + pBackGptInfo->PartTbl[1].Attr = HIPERISO_EFI_PART_ATTR; + pBackGptInfo->Head.PartTblCrc = HisoCrc32(pBackGptInfo->PartTbl, sizeof(pBackGptInfo->PartTbl)); + pBackGptInfo->Head.Crc = 0; + pBackGptInfo->Head.Crc = HisoCrc32(&pBackGptInfo->Head, pBackGptInfo->Head.Length); + + lseek(fd, 512, SEEK_SET); + write(fd, (UINT8 *)pMainGptInfo + 512, sizeof(HISO_GPT_INFO) - 512); + + lseek(fd, DiskSize - 33 * 512, SEEK_SET); + write(fd, pBackGptInfo, sizeof(HISO_BK_GPT_INFO)); + + fsync(fd); + } + } + } + + free(pMainGptInfo); + free(pBackGptInfo); + close(fd); + + return 0; +} +