Simple sd card driver (#162)
* fixed inline functions for modern C standart * more stack for application * added library * init fatfs library * fatfs example application * Merge with current master * fix typo and delete old files * cmsis os 2 reentrance fix * Reworked dependency wait to support multiple dependency * Build FatFS on local target, syscall.c is target-specific. * run local target ok * testcase for fatfs Co-authored-by: aanper <mail@s3f.ru>
This commit is contained in:
		
							parent
							
								
									2ab6f82ddf
								
							
						
					
					
						commit
						59513b05ee
					
				| @ -57,6 +57,14 @@ C_SOURCES	+= $(APP_DIR)/examples/u8g2_example.c | ||||
| APP_DISPLAY = 1 | ||||
| endif | ||||
| 
 | ||||
| APP_EXAMPLE_FATFS ?= 0 | ||||
| ifeq ($(APP_EXAMPLE_FATFS), 1) | ||||
| CFLAGS		+= -DAPP_EXAMPLE_FATFS | ||||
| C_SOURCES	+= $(APP_DIR)/examples/fatfs_list.c | ||||
| APP_INPUT = 1 | ||||
| APP_DISPLAY = 1 | ||||
| endif | ||||
| 
 | ||||
| # device drivers
 | ||||
| 
 | ||||
| ifeq ($(APP_DISPLAY), 1) | ||||
|  | ||||
							
								
								
									
										169
									
								
								applications/examples/fatfs_list.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								applications/examples/fatfs_list.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,169 @@ | ||||
| #include "u8g2/u8g2.h" | ||||
| #include "fatfs/ff.h" | ||||
| #include "flipper.h" | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| // TODO currently we have small stack, so it will be static
 | ||||
| FuriRecordSubscriber* furi_log; | ||||
| #define STR_BUFFER_SIZE 128 | ||||
| char str_buffer[STR_BUFFER_SIZE]; | ||||
| uint8_t line_current = 0; | ||||
| uint16_t line_position = 0; | ||||
| 
 | ||||
| // TODO this should be in the target driver
 | ||||
| FATFS SD_FatFs; | ||||
| char SD_Path[4]; | ||||
| 
 | ||||
| typedef enum { | ||||
|     EventTypeStart, | ||||
|     EventTypeKey, | ||||
| } AppEventType; | ||||
| 
 | ||||
| typedef struct { | ||||
|     union { | ||||
|         InputEvent input; | ||||
|     } value; | ||||
|     AppEventType type; | ||||
| } AppEvent; | ||||
| 
 | ||||
| static void event_cb(const void* value, size_t size, void* ctx) { | ||||
|     QueueHandle_t event_queue = (QueueHandle_t)ctx; | ||||
| 
 | ||||
|     AppEvent event; | ||||
|     event.type = EventTypeKey; | ||||
|     event.value.input = *(InputEvent*)value; | ||||
|     xQueueSend(event_queue, (void*)&event, 0); | ||||
| } | ||||
| 
 | ||||
| void fatfs_list(void* p) { | ||||
|     const uint8_t line_size = 10; | ||||
|     const uint8_t lines_on_display = 6; | ||||
| 
 | ||||
|     uint8_t bsp_result; | ||||
|     FRESULT result; | ||||
|     DIR dir; | ||||
|     FILINFO fno; | ||||
|     AppEvent event; | ||||
| 
 | ||||
|     QueueHandle_t event_queue = xQueueCreate(2, sizeof(AppEvent)); | ||||
| 
 | ||||
|     furi_log = get_default_log(); | ||||
| 
 | ||||
|     FuriRecordSubscriber* fb_record = furi_open("u8g2_fb", false, false, NULL, NULL, NULL); | ||||
|     if(fb_record == NULL) { | ||||
|         fuprintf(furi_log, "[widget][fatfs_list] cannot create fb record\n"); | ||||
|         furiac_exit(NULL); | ||||
|     } | ||||
| 
 | ||||
|     FuriRecordSubscriber* event_record = | ||||
|         furi_open("input_events", false, false, event_cb, NULL, event_queue); | ||||
|     if(event_record == NULL) { | ||||
|         fuprintf(furi_log, "[widget][fatfs_list] cannot register input_events callback\n"); | ||||
|         furiac_exit(NULL); | ||||
|     } | ||||
| 
 | ||||
|     // clear display
 | ||||
|     u8g2_t* fb = furi_take(fb_record); | ||||
|     u8g2_ClearBuffer(fb); | ||||
|     furi_commit(fb_record); | ||||
| 
 | ||||
|     // TODO these lines should be executed in the target driver
 | ||||
|     // so i dont fix "implicit declaration of function 'BSP_SD_Init'"
 | ||||
|     bsp_result = BSP_SD_Init(); | ||||
| 
 | ||||
|     if(bsp_result != 0) { | ||||
|         furi_take(fb_record); | ||||
| 
 | ||||
|         u8g2_SetFont(fb, u8g2_font_6x10_mf); | ||||
|         u8g2_SetDrawColor(fb, 1); | ||||
|         u8g2_SetFontMode(fb, 1); | ||||
|         u8g2_DrawStr(fb, 0, 12, "SD card init error"); | ||||
| 
 | ||||
|         furi_commit(fb_record); | ||||
|         furiac_exit(NULL); | ||||
|     } | ||||
| 
 | ||||
|     result = f_mount(&SD_FatFs, (TCHAR const*)SD_Path, 1); | ||||
| 
 | ||||
|     if(result != FR_OK) { | ||||
|         furi_take(fb_record); | ||||
| 
 | ||||
|         u8g2_SetFont(fb, u8g2_font_6x10_mf); | ||||
|         u8g2_SetDrawColor(fb, 1); | ||||
|         u8g2_SetFontMode(fb, 1); | ||||
|         u8g2_DrawStr(fb, 0, 12, "SD card mount error"); | ||||
| 
 | ||||
|         furi_commit(fb_record); | ||||
|         furiac_exit(NULL); | ||||
|     } | ||||
| 
 | ||||
|     // ok, now we can work with sd card
 | ||||
| 
 | ||||
|     // send start event
 | ||||
|     event.type = EventTypeStart; | ||||
|     xQueueSend(event_queue, (void*)&event, 0); | ||||
| 
 | ||||
|     while(1) { | ||||
|         if(xQueueReceive(event_queue, (void*)&event, portMAX_DELAY)) { | ||||
| 
 | ||||
|             // process buttons event
 | ||||
|             if(event.type == EventTypeKey) { | ||||
|                 // button pressed
 | ||||
|                 if(event.value.input.state == true) { | ||||
|                     if(event.value.input.input == InputUp && line_position > 0) { | ||||
|                         line_position--; | ||||
|                     } | ||||
|                     if(event.value.input.input == InputDown) { | ||||
|                         line_position++; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             // get display and draw
 | ||||
|             furi_take(fb_record); | ||||
|             u8g2_ClearBuffer(fb); | ||||
|             u8g2_SetFont(fb, u8g2_font_6x10_mf); | ||||
|             u8g2_SetDrawColor(fb, 1); | ||||
|             u8g2_SetFontMode(fb, 1); | ||||
|             line_current = 1; | ||||
| 
 | ||||
|             // open root dir
 | ||||
|             result = f_opendir(&dir, ""); | ||||
| 
 | ||||
|             while(1) { | ||||
|                 // read a directory item
 | ||||
|                 result = f_readdir(&dir, &fno); | ||||
| 
 | ||||
|                 if(result != FR_OK) { | ||||
|                     // cannot read dir
 | ||||
|                     break; | ||||
|                 } | ||||
| 
 | ||||
|                 if(fno.fname[0] == 0) { | ||||
|                     // Break on end of dir
 | ||||
|                     break; | ||||
|                 } | ||||
| 
 | ||||
|                 // draw files on display
 | ||||
|                 if(line_current > line_position && | ||||
|                    line_current <= (line_position + lines_on_display)) { | ||||
|                     if(fno.fattrib & AM_DIR) { | ||||
|                         snprintf(str_buffer, STR_BUFFER_SIZE, "DIR %s\n", fno.fname); | ||||
|                     } else { | ||||
|                         snprintf(str_buffer, STR_BUFFER_SIZE, "FIL %s\n", fno.fname); | ||||
|                     } | ||||
| 
 | ||||
|                     u8g2_DrawStr(fb, 0, line_size * (line_current - line_position), str_buffer); | ||||
|                 } | ||||
| 
 | ||||
|                 line_current++; | ||||
|             } | ||||
| 
 | ||||
|             result = f_closedir(&dir); | ||||
| 
 | ||||
|             furi_commit(fb_record); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     furiac_exit(NULL); | ||||
| } | ||||
| @ -2,11 +2,7 @@ | ||||
| 
 | ||||
| #include "furi.h" | ||||
| 
 | ||||
| typedef struct { | ||||
|     FlipperApplication app; | ||||
|     const char* name; | ||||
|     const char* libs; | ||||
| } FlipperStartupApp; | ||||
| #define FURI_LIB (const char*[]) | ||||
| 
 | ||||
| #ifdef APP_TEST | ||||
| void flipper_test_app(void* p); | ||||
| @ -28,45 +24,50 @@ void menu_task(void* p); | ||||
| void coreglitch_demo_0(void* p); | ||||
| 
 | ||||
| void u8g2_qrcode(void* p); | ||||
| void fatfs_list(void* p); | ||||
| 
 | ||||
| const FlipperStartupApp FLIPPER_STARTUP[] = { | ||||
| #ifdef APP_DISPLAY | ||||
|     {.app = display_u8g2, .name = "display_u8g2", .libs = ""}, | ||||
|     {.app = display_u8g2, .name = "display_u8g2", .libs = {0}}, | ||||
| #endif | ||||
| 
 | ||||
| #ifdef APP_INPUT | ||||
|     {.app = input_task, .name = "input_task", .libs = ""}, | ||||
|     {.app = input_task, .name = "input_task", .libs = {0}}, | ||||
| #endif | ||||
| 
 | ||||
| // {.app = coreglitch_demo_0, .name = "coreglitch_demo_0", .libs = ""},
 | ||||
| 
 | ||||
| #ifdef APP_TEST | ||||
|     {.app = flipper_test_app, .name = "test app", .libs = ""}, | ||||
|     {.app = flipper_test_app, .name = "test app", .libs = {0}}, | ||||
| #endif | ||||
| 
 | ||||
| #ifdef APP_EXAMPLE_BLINK | ||||
|     {.app = application_blink, .name = "blink", .libs = ""}, | ||||
|     {.app = application_blink, .name = "blink", .libs = {0}}, | ||||
| #endif | ||||
| 
 | ||||
| #ifdef APP_EXAMPLE_UART_WRITE | ||||
|     {.app = application_uart_write, .name = "uart write", .libs = ""}, | ||||
|     {.app = application_uart_write, .name = "uart write", .libs = {0}}, | ||||
| #endif | ||||
| 
 | ||||
| #ifdef APP_EXAMPLE_IPC | ||||
|     {.app = application_ipc_display, .name = "ipc display", .libs = ""}, | ||||
|     {.app = application_ipc_widget, .name = "ipc widget", .libs = ""}, | ||||
|     {.app = application_ipc_display, .name = "ipc display", .libs = {0}}, | ||||
|     {.app = application_ipc_widget, .name = "ipc widget", .libs = {0}}, | ||||
| #endif | ||||
| 
 | ||||
| #ifdef APP_EXAMPLE_INPUT_DUMP | ||||
|     {.app = application_input_dump, .name = "input dump", .libs = "input_task"}, | ||||
|     {.app = application_input_dump, .name = "input dump", .libs = {1, FURI_LIB{"input_task"}}}, | ||||
| #endif | ||||
| 
 | ||||
| #ifdef APP_EXAMPLE_QRCODE | ||||
|     {.app = u8g2_qrcode, .name = "u8g2_qrcode", .libs = "display_u8g2"}, | ||||
|     {.app = u8g2_qrcode, .name = "u8g2_qrcode", .libs = {1, FURI_LIB{"display_u8g2"}}}, | ||||
| #endif | ||||
| 
 | ||||
| #ifdef APP_EXAMPLE_FATFS | ||||
|     {.app = fatfs_list, .name = "fatfs_list", .libs = {2, FURI_LIB{"display_u8g2", "input_task"}}}, | ||||
| #endif | ||||
| 
 | ||||
| #ifdef APP_EXAMPLE_DISPLAY | ||||
|     {.app = u8g2_example, .name = "u8g2_example", .libs = "display_u8g2"}, | ||||
|     {.app = u8g2_example, .name = "u8g2_example", .libs = {1, FURI_LIB{"display_u8g2"}}}, | ||||
| #endif | ||||
|      | ||||
| 
 | ||||
| }; | ||||
|  | ||||
| @ -20,7 +20,7 @@ extern "C" void app() { | ||||
| 
 | ||||
|     for(size_t i = 0; i < flipper_app_count; i++) { | ||||
|         // TODO create a dependency tree and run tasks in the desired order
 | ||||
|         furiac_wait_libs(FLIPPER_STARTUP[i].libs); | ||||
|         furiac_wait_libs(&FLIPPER_STARTUP[i].libs); | ||||
|         handlers[i] = furiac_start(FLIPPER_STARTUP[i].app, FLIPPER_STARTUP[i].name, NULL); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										15
									
								
								core/furi.h
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								core/furi.h
									
									
									
									
									
								
							| @ -63,6 +63,19 @@ typedef struct { | ||||
|     bool ready; | ||||
| } FuriApp; | ||||
| 
 | ||||
| // application dependency info
 | ||||
| typedef struct { | ||||
|     uint8_t count; | ||||
|     const char** name; | ||||
| } FlipperAppLibrary; | ||||
| 
 | ||||
| // application startup info
 | ||||
| typedef struct { | ||||
|     FlipperApplication app; | ||||
|     const char* name; | ||||
|     FlipperAppLibrary libs; | ||||
| } FlipperStartupApp; | ||||
| 
 | ||||
| /*!
 | ||||
| Simply starts application. | ||||
| It call app entrypoint with param passed as argument. | ||||
| @ -95,7 +108,7 @@ void furiac_ready(); | ||||
| /* 
 | ||||
| Wait for the libraries we depend on | ||||
| */ | ||||
| void furiac_wait_libs(const char* libs); | ||||
| void furiac_wait_libs(const FlipperAppLibrary* libs); | ||||
| 
 | ||||
| /*!
 | ||||
| Stop specified app without returning to prev application. | ||||
|  | ||||
| @ -9,7 +9,7 @@ | ||||
| 
 | ||||
| #include <string.h> | ||||
| 
 | ||||
| #define DEFAULT_STACK_SIZE 1024 // Stack size in bytes
 | ||||
| #define DEFAULT_STACK_SIZE 2048 // Stack size in bytes
 | ||||
| #define MAX_TASK_COUNT 8 | ||||
| #define INVALID_TASK_ID UINT16_MAX | ||||
| 
 | ||||
| @ -27,19 +27,9 @@ uint16_t furiac_get_task_id_by_name(const char* app_name) { | ||||
|     return INVALID_TASK_ID; | ||||
| } | ||||
| 
 | ||||
| void furiac_wait_libs(const char* libs) { | ||||
|     char* lib_rest = NULL; | ||||
|     char* lib_name = strtok_r((char*)libs, " ", &lib_rest); | ||||
| 
 | ||||
|     while(lib_name != NULL) { | ||||
|         // trim library name
 | ||||
|         for(uint16_t i = 0; i < strlen(lib_name); i++) { | ||||
|             if(lib_name[i] == ' ') { | ||||
|                 lib_name[i] = 0; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         uint16_t app_id = furiac_get_task_id_by_name(lib_name); | ||||
| void furiac_wait_libs(const FlipperAppLibrary* libs) { | ||||
|     for(uint8_t i = 0; i < libs->count; i++){ | ||||
|         uint16_t app_id = furiac_get_task_id_by_name(libs->name[i]); | ||||
| 
 | ||||
|         if(app_id == INVALID_TASK_ID) { | ||||
| #ifdef FURI_DEBUG | ||||
| @ -53,8 +43,6 @@ void furiac_wait_libs(const char* libs) { | ||||
|                 osDelay(50); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         lib_name = strtok_r(NULL, " ", &lib_rest); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										56
									
								
								firmware/targets/f2/Src/fatfs/fatfs.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								firmware/targets/f2/Src/fatfs/fatfs.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file   fatfs.c | ||||
|   * @brief  Code for fatfs applications | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| #include "fatfs.h" | ||||
| 
 | ||||
| uint8_t retUSER;    /* Return value for USER */ | ||||
| char USERPath[4];   /* USER logical drive path */ | ||||
| FATFS USERFatFS;    /* File system object for USER logical drive */ | ||||
| FIL USERFile;       /* File object for USER */ | ||||
| 
 | ||||
| /* USER CODE BEGIN Variables */ | ||||
| 
 | ||||
| /* USER CODE END Variables */     | ||||
| 
 | ||||
| void MX_FATFS_Init(void)  | ||||
| { | ||||
|   /*## FatFS: Link the USER driver ###########################*/ | ||||
|   retUSER = FATFS_LinkDriver(&USER_Driver, USERPath); | ||||
| 
 | ||||
|   /* USER CODE BEGIN Init */ | ||||
|   /* additional user code for init */      | ||||
|   /* USER CODE END Init */ | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Gets Time from RTC  | ||||
|   * @param  None | ||||
|   * @retval Time in DWORD | ||||
|   */ | ||||
| DWORD get_fattime(void) | ||||
| { | ||||
|   /* USER CODE BEGIN get_fattime */ | ||||
|   return 0; | ||||
|   /* USER CODE END get_fattime */   | ||||
| } | ||||
| 
 | ||||
| /* USER CODE BEGIN Application */ | ||||
|       | ||||
| /* USER CODE END Application */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										49
									
								
								firmware/targets/f2/Src/fatfs/fatfs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								firmware/targets/f2/Src/fatfs/fatfs.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file   fatfs.h | ||||
|   * @brief  Header for fatfs applications | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __fatfs_H | ||||
| #define __fatfs_H | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #include "fatfs/ff.h" | ||||
| #include "fatfs/ff_gen_drv.h" | ||||
| #include "user_diskio.h" /* defines USER_Driver as external */ | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern uint8_t retUSER; /* Return value for USER */ | ||||
| extern char USERPath[4]; /* USER logical drive path */ | ||||
| extern FATFS USERFatFS; /* File system object for USER logical drive */ | ||||
| extern FIL USERFile; /* File object for USER */ | ||||
| 
 | ||||
| void MX_FATFS_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| #endif /*__fatfs_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										270
									
								
								firmware/targets/f2/Src/fatfs/ffconf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								firmware/targets/f2/Src/fatfs/ffconf.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,270 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   *  FatFs - Generic FAT file system module  R0.12c (C)ChaN, 2017 | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| #ifndef _FFCONF | ||||
| #define _FFCONF 68300	/* Revision ID */ | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------------/
 | ||||
| / Additional user header to be used   | ||||
| /-----------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #include "main.h" | ||||
| #include "stm32l4xx_hal.h" | ||||
| #include "cmsis_os.h" /* _FS_REENTRANT set to 1 and CMSIS API chosen */ | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------------/
 | ||||
| / Function Configurations | ||||
| /-----------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _FS_READONLY         0      /* 0:Read/Write or 1:Read only */ | ||||
| /* This option switches read-only configuration. (0:Read/Write or 1:Read-only)
 | ||||
| /  Read-only configuration removes writing API functions, f_write(), f_sync(), | ||||
| /  f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() | ||||
| /  and optional writing functions as well. */ | ||||
| 
 | ||||
| #define _FS_MINIMIZE         0      /* 0 to 3 */ | ||||
| /* This option defines minimization level to remove some basic API functions.
 | ||||
| / | ||||
| /   0: All basic functions are enabled. | ||||
| /   1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() | ||||
| /      are removed. | ||||
| /   2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. | ||||
| /   3: f_lseek() function is removed in addition to 2. */ | ||||
| 
 | ||||
| #define _USE_STRFUNC         2      /* 0:Disable or 1-2:Enable */ | ||||
| /* This option switches string functions, f_gets(), f_putc(), f_puts() and
 | ||||
| /  f_printf(). | ||||
| / | ||||
| /  0: Disable string functions. | ||||
| /  1: Enable without LF-CRLF conversion. | ||||
| /  2: Enable with LF-CRLF conversion. */ | ||||
| 
 | ||||
| #define _USE_FIND            0 | ||||
| /* This option switches filtered directory read functions, f_findfirst() and
 | ||||
| /  f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ | ||||
| 
 | ||||
| #define _USE_MKFS            1 | ||||
| /* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| #define _USE_FASTSEEK        1 | ||||
| /* This option switches fast seek feature. (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| #define	_USE_EXPAND		0 | ||||
| /* This option switches f_expand function. (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| #define _USE_CHMOD		0 | ||||
| /* This option switches attribute manipulation functions, f_chmod() and f_utime().
 | ||||
| /  (0:Disable or 1:Enable) Also _FS_READONLY needs to be 0 to enable this option. */ | ||||
| 
 | ||||
| #define _USE_LABEL           0 | ||||
| /* This option switches volume label functions, f_getlabel() and f_setlabel().
 | ||||
| /  (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| #define _USE_FORWARD         0 | ||||
| /* This option switches f_forward() function. (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------------/
 | ||||
| / Locale and Namespace Configurations | ||||
| /-----------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _CODE_PAGE         850 | ||||
| /* This option specifies the OEM code page to be used on the target system.
 | ||||
| /  Incorrect setting of the code page can cause a file open failure. | ||||
| / | ||||
| /   1   - ASCII (No extended character. Non-LFN cfg. only) | ||||
| /   437 - U.S. | ||||
| /   720 - Arabic | ||||
| /   737 - Greek | ||||
| /   771 - KBL | ||||
| /   775 - Baltic | ||||
| /   850 - Latin 1 | ||||
| /   852 - Latin 2 | ||||
| /   855 - Cyrillic | ||||
| /   857 - Turkish | ||||
| /   860 - Portuguese | ||||
| /   861 - Icelandic | ||||
| /   862 - Hebrew | ||||
| /   863 - Canadian French | ||||
| /   864 - Arabic | ||||
| /   865 - Nordic | ||||
| /   866 - Russian | ||||
| /   869 - Greek 2 | ||||
| /   932 - Japanese (DBCS) | ||||
| /   936 - Simplified Chinese (DBCS) | ||||
| /   949 - Korean (DBCS) | ||||
| /   950 - Traditional Chinese (DBCS) | ||||
| */ | ||||
| 
 | ||||
| #define _USE_LFN     2    /* 0 to 3 */ | ||||
| #define _MAX_LFN     255  /* Maximum LFN length to handle (12 to 255) */ | ||||
| /* The _USE_LFN switches the support of long file name (LFN).
 | ||||
| / | ||||
| /   0: Disable support of LFN. _MAX_LFN has no effect. | ||||
| /   1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. | ||||
| /   2: Enable LFN with dynamic working buffer on the STACK. | ||||
| /   3: Enable LFN with dynamic working buffer on the HEAP. | ||||
| / | ||||
| /  To enable the LFN, Unicode handling functions (option/unicode.c) must be added | ||||
| /  to the project. The working buffer occupies (_MAX_LFN + 1) * 2 bytes and | ||||
| /  additional 608 bytes at exFAT enabled. _MAX_LFN can be in range from 12 to 255. | ||||
| /  It should be set 255 to support full featured LFN operations. | ||||
| /  When use stack for the working buffer, take care on stack overflow. When use heap | ||||
| /  memory for the working buffer, memory management functions, ff_memalloc() and | ||||
| /  ff_memfree(), must be added to the project. */ | ||||
| 
 | ||||
| #define _LFN_UNICODE    0 /* 0:ANSI/OEM or 1:Unicode */ | ||||
| /* This option switches character encoding on the API. (0:ANSI/OEM or 1:UTF-16)
 | ||||
| /  To use Unicode string for the path name, enable LFN and set _LFN_UNICODE = 1. | ||||
| /  This option also affects behavior of string I/O functions. */ | ||||
| 
 | ||||
| #define _STRF_ENCODE    3 | ||||
| /* When _LFN_UNICODE == 1, this option selects the character encoding ON THE FILE to
 | ||||
| /  be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf(). | ||||
| / | ||||
| /  0: ANSI/OEM | ||||
| /  1: UTF-16LE | ||||
| /  2: UTF-16BE | ||||
| /  3: UTF-8 | ||||
| / | ||||
| /  This option has no effect when _LFN_UNICODE == 0. */ | ||||
| 
 | ||||
| #define _FS_RPATH       0 /* 0 to 2 */ | ||||
| /* This option configures support of relative path.
 | ||||
| / | ||||
| /   0: Disable relative path and remove related functions. | ||||
| /   1: Enable relative path. f_chdir() and f_chdrive() are available. | ||||
| /   2: f_getcwd() function is available in addition to 1. | ||||
| */ | ||||
| 
 | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| / Drive/Volume Configurations | ||||
| /----------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _VOLUMES    1 | ||||
| /* Number of volumes (logical drives) to be used. */ | ||||
| 
 | ||||
| /* USER CODE BEGIN Volumes */   | ||||
| #define _STR_VOLUME_ID          0	/* 0:Use only 0-9 for drive ID, 1:Use strings for drive ID */ | ||||
| #define _VOLUME_STRS            "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3" | ||||
| /* _STR_VOLUME_ID switches string support of volume ID.
 | ||||
| /  When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive | ||||
| /  number in the path name. _VOLUME_STRS defines the drive ID strings for each | ||||
| /  logical drives. Number of items must be equal to _VOLUMES. Valid characters for | ||||
| /  the drive ID strings are: A-Z and 0-9. */ | ||||
| /* USER CODE END Volumes */   | ||||
| 
 | ||||
| #define _MULTI_PARTITION     0 /* 0:Single partition, 1:Multiple partition */ | ||||
| /* This option switches support of multi-partition on a physical drive.
 | ||||
| /  By default (0), each logical drive number is bound to the same physical drive | ||||
| /  number and only an FAT volume found on the physical drive will be mounted. | ||||
| /  When multi-partition is enabled (1), each logical drive number can be bound to | ||||
| /  arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() | ||||
| /  funciton will be available. */ | ||||
| #define _MIN_SS    512  /* 512, 1024, 2048 or 4096 */ | ||||
| #define _MAX_SS    512  /* 512, 1024, 2048 or 4096 */ | ||||
| /* These options configure the range of sector size to be supported. (512, 1024,
 | ||||
| /  2048 or 4096) Always set both 512 for most systems, all type of memory cards and | ||||
| /  harddisk. But a larger value may be required for on-board flash memory and some | ||||
| /  type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured | ||||
| /  to variable sector size and GET_SECTOR_SIZE command must be implemented to the | ||||
| /  disk_ioctl() function. */ | ||||
| 
 | ||||
| #define	_USE_TRIM      0 | ||||
| /* This option switches support of ATA-TRIM. (0:Disable or 1:Enable)
 | ||||
| /  To enable Trim function, also CTRL_TRIM command should be implemented to the | ||||
| /  disk_ioctl() function. */ | ||||
| 
 | ||||
| #define _FS_NOFSINFO    0 /* 0,1,2 or 3 */ | ||||
| /* If you need to know correct free space on the FAT32 volume, set bit 0 of this
 | ||||
| /  option, and f_getfree() function at first time after volume mount will force | ||||
| /  a full FAT scan. Bit 1 controls the use of last allocated cluster number. | ||||
| / | ||||
| /  bit0=0: Use free cluster count in the FSINFO if available. | ||||
| /  bit0=1: Do not trust free cluster count in the FSINFO. | ||||
| /  bit1=0: Use last allocated cluster number in the FSINFO if available. | ||||
| /  bit1=1: Do not trust last allocated cluster number in the FSINFO. | ||||
| */ | ||||
| 
 | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| / System Configurations | ||||
| /----------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _FS_TINY    0      /* 0:Normal or 1:Tiny */ | ||||
| /* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
 | ||||
| /  At the tiny configuration, size of file object (FIL) is reduced _MAX_SS bytes. | ||||
| /  Instead of private sector buffer eliminated from the file object, common sector | ||||
| /  buffer in the file system object (FATFS) is used for the file data transfer. */ | ||||
| 
 | ||||
| #define _FS_EXFAT	0 | ||||
| /* This option switches support of exFAT file system. (0:Disable or 1:Enable)
 | ||||
| /  When enable exFAT, also LFN needs to be enabled. (_USE_LFN >= 1) | ||||
| /  Note that enabling exFAT discards C89 compatibility. */ | ||||
| 
 | ||||
| #define _FS_NORTC	0 | ||||
| #define _NORTC_MON	6 | ||||
| #define _NORTC_MDAY	4 | ||||
| #define _NORTC_YEAR	2015 | ||||
| /* The option _FS_NORTC switches timestamp functiton. If the system does not have
 | ||||
| /  any RTC function or valid timestamp is not needed, set _FS_NORTC = 1 to disable | ||||
| /  the timestamp function. All objects modified by FatFs will have a fixed timestamp | ||||
| /  defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR in local time. | ||||
| /  To enable timestamp function (_FS_NORTC = 0), get_fattime() function need to be | ||||
| /  added to the project to get current time form real-time clock. _NORTC_MON, | ||||
| /  _NORTC_MDAY and _NORTC_YEAR have no effect.  | ||||
| /  These options have no effect at read-only configuration (_FS_READONLY = 1). */ | ||||
| 
 | ||||
| #define _FS_LOCK    2     /* 0:Disable or >=1:Enable */ | ||||
| /* The option _FS_LOCK switches file lock function to control duplicated file open
 | ||||
| /  and illegal operation to open objects. This option must be 0 when _FS_READONLY | ||||
| /  is 1. | ||||
| / | ||||
| /  0:  Disable file lock function. To avoid volume corruption, application program | ||||
| /      should avoid illegal open, remove and rename to the open objects. | ||||
| /  >0: Enable file lock function. The value defines how many files/sub-directories | ||||
| /      can be opened simultaneously under file lock control. Note that the file | ||||
| /      lock control is independent of re-entrancy. */ | ||||
| 
 | ||||
| #define _FS_REENTRANT    1  /* 0:Disable or 1:Enable */ | ||||
| #define _FS_TIMEOUT      1000 /* Timeout period in unit of time ticks */ | ||||
| #define _SYNC_t          osMutexId_t | ||||
| /* The option _FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs
 | ||||
| /  module itself. Note that regardless of this option, file access to different | ||||
| /  volume is always re-entrant and volume control functions, f_mount(), f_mkfs() | ||||
| /  and f_fdisk() function, are always not re-entrant. Only file/directory access | ||||
| /  to the same volume is under control of this function. | ||||
| / | ||||
| /   0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect. | ||||
| /   1: Enable re-entrancy. Also user provided synchronization handlers, | ||||
| /      ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() | ||||
| /      function, must be added to the project. Samples are available in | ||||
| /      option/syscall.c. | ||||
| / | ||||
| /  The _FS_TIMEOUT defines timeout period in unit of time tick. | ||||
| /  The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, | ||||
| /  SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be | ||||
| /  included somewhere in the scope of ff.h. */ | ||||
| 
 | ||||
| /* define the ff_malloc ff_free macros as standard malloc free */ | ||||
| #if !defined(ff_malloc) && !defined(ff_free) | ||||
| #include <stdlib.h> | ||||
| #define ff_malloc  malloc | ||||
| #define ff_free  free | ||||
| #endif | ||||
| 
 | ||||
| #endif /* _FFCONF */ | ||||
							
								
								
									
										167
									
								
								firmware/targets/f2/Src/fatfs/spi_sd_hal.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								firmware/targets/f2/Src/fatfs/spi_sd_hal.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,167 @@ | ||||
| #include "main.h" | ||||
| 
 | ||||
| #define SD_DUMMY_BYTE 0xFF | ||||
| #define SD_CS_LOW() HAL_GPIO_WritePin(SD_CS_GPIO_Port, SD_CS_Pin, GPIO_PIN_RESET) | ||||
| #define SD_CS_HIGH() HAL_GPIO_WritePin(SD_CS_GPIO_Port, SD_CS_Pin, GPIO_PIN_SET) | ||||
| 
 | ||||
| #define SPI_SD_INSTANCE SPI3 | ||||
| #define SPI_SD_HANDLE hspi3 | ||||
| 
 | ||||
| const uint32_t SpiTimeout = 1000; | ||||
| extern SPI_HandleTypeDef SPI_SD_HANDLE; | ||||
| uint8_t SD_IO_WriteByte(uint8_t Data); | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|                             BUS OPERATIONS | ||||
|  *******************************************************************************/ | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief  SPI error treatment function | ||||
|  * @retval None | ||||
|  */ | ||||
| static void SPIx_Error(void) { | ||||
|     /* De-initialize the SPI communication BUS */ | ||||
|     HAL_SPI_DeInit(&SPI_SD_HANDLE); | ||||
| 
 | ||||
|     /* Re-Initiaize the SPI communication BUS */ | ||||
|     HAL_SPI_Init(&SPI_SD_HANDLE); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief  SPI Write byte(s) to device | ||||
|  * @param  DataIn: Pointer to data buffer to write | ||||
|  * @param  DataOut: Pointer to data buffer for read data | ||||
|  * @param  DataLength: number of bytes to write | ||||
|  * @retval None | ||||
|  */ | ||||
| static void SPIx_WriteReadData(const uint8_t* DataIn, uint8_t* DataOut, uint16_t DataLength) { | ||||
|     HAL_StatusTypeDef status = HAL_OK; | ||||
|     status = | ||||
|         HAL_SPI_TransmitReceive(&SPI_SD_HANDLE, (uint8_t*)DataIn, DataOut, DataLength, SpiTimeout); | ||||
| 
 | ||||
|     /* Check the communication status */ | ||||
|     if(status != HAL_OK) { | ||||
|         /* Execute user timeout callback */ | ||||
|         SPIx_Error(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief  SPI Write a byte to device | ||||
|  * @param  Value: value to be written | ||||
|  * @retval None | ||||
|  */ | ||||
| static void SPIx_Write(uint8_t Value) { | ||||
|     HAL_StatusTypeDef status = HAL_OK; | ||||
|     uint8_t data; | ||||
| 
 | ||||
|     status = HAL_SPI_TransmitReceive(&SPI_SD_HANDLE, (uint8_t*)&Value, &data, 1, SpiTimeout); | ||||
| 
 | ||||
|     /* Check the communication status */ | ||||
|     if(status != HAL_OK) { | ||||
|         /* Execute user timeout callback */ | ||||
|         SPIx_Error(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void SD_SPI_Slow_Init(void) { | ||||
|     SPI_SD_HANDLE.Instance = SPI_SD_INSTANCE; | ||||
|     SPI_SD_HANDLE.Init.Mode = SPI_MODE_MASTER; | ||||
|     SPI_SD_HANDLE.Init.Direction = SPI_DIRECTION_2LINES; | ||||
|     SPI_SD_HANDLE.Init.DataSize = SPI_DATASIZE_8BIT; | ||||
|     SPI_SD_HANDLE.Init.CLKPolarity = SPI_POLARITY_LOW; | ||||
|     SPI_SD_HANDLE.Init.CLKPhase = SPI_PHASE_1EDGE; | ||||
|     SPI_SD_HANDLE.Init.NSS = SPI_NSS_SOFT; | ||||
|     SPI_SD_HANDLE.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; | ||||
|     SPI_SD_HANDLE.Init.FirstBit = SPI_FIRSTBIT_MSB; | ||||
|     SPI_SD_HANDLE.Init.TIMode = SPI_TIMODE_DISABLE; | ||||
|     SPI_SD_HANDLE.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; | ||||
|     SPI_SD_HANDLE.Init.CRCPolynomial = 7; | ||||
|     SPI_SD_HANDLE.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; | ||||
|     SPI_SD_HANDLE.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; | ||||
|     if(HAL_SPI_Init(&SPI_SD_HANDLE) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void SD_SPI_Fast_Init(void) { | ||||
|     SPI_SD_HANDLE.Instance = SPI_SD_INSTANCE; | ||||
|     SPI_SD_HANDLE.Init.Mode = SPI_MODE_MASTER; | ||||
|     SPI_SD_HANDLE.Init.Direction = SPI_DIRECTION_2LINES; | ||||
|     SPI_SD_HANDLE.Init.DataSize = SPI_DATASIZE_8BIT; | ||||
|     SPI_SD_HANDLE.Init.CLKPolarity = SPI_POLARITY_LOW; | ||||
|     SPI_SD_HANDLE.Init.CLKPhase = SPI_PHASE_1EDGE; | ||||
|     SPI_SD_HANDLE.Init.NSS = SPI_NSS_SOFT; | ||||
|     SPI_SD_HANDLE.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; | ||||
|     SPI_SD_HANDLE.Init.FirstBit = SPI_FIRSTBIT_MSB; | ||||
|     SPI_SD_HANDLE.Init.TIMode = SPI_TIMODE_DISABLE; | ||||
|     SPI_SD_HANDLE.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; | ||||
|     SPI_SD_HANDLE.Init.CRCPolynomial = 7; | ||||
|     SPI_SD_HANDLE.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; | ||||
|     SPI_SD_HANDLE.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; | ||||
|     if(HAL_SPI_Init(&SPI_SD_HANDLE) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|                             LINK OPERATIONS | ||||
|  *******************************************************************************/ | ||||
| 
 | ||||
| /********************************* LINK SD ************************************/ | ||||
| /**
 | ||||
|  * @brief  Initialize the SD Card and put it into StandBy State (Ready for | ||||
|  *         data transfer). | ||||
|  * @retval None | ||||
|  */ | ||||
| void SD_IO_Init(void) { | ||||
|     uint8_t counter = 0; | ||||
| 
 | ||||
|     /* SD chip select high */ | ||||
|     SD_CS_HIGH(); | ||||
| 
 | ||||
|     /* Send dummy byte 0xFF, 10 times with CS high */ | ||||
|     /* Rise CS and MOSI for 80 clocks cycles */ | ||||
|     for(counter = 0; counter <= 200; counter++) { | ||||
|         /* Send dummy byte 0xFF */ | ||||
|         SD_IO_WriteByte(SD_DUMMY_BYTE); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief  Set SD interface Chip Select state | ||||
|  * @param  val: 0 (low) or 1 (high) state | ||||
|  * @retval None | ||||
|  */ | ||||
| void SD_IO_CSState(uint8_t val) { | ||||
|     if(val == 1) { | ||||
|         SD_CS_HIGH(); | ||||
|     } else { | ||||
|         SD_CS_LOW(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief  Write byte(s) on the SD | ||||
|  * @param  DataIn: Pointer to data buffer to write | ||||
|  * @param  DataOut: Pointer to data buffer for read data | ||||
|  * @param  DataLength: number of bytes to write | ||||
|  * @retval None | ||||
|  */ | ||||
| void SD_IO_WriteReadData(const uint8_t* DataIn, uint8_t* DataOut, uint16_t DataLength) { | ||||
|     /* Send the byte */ | ||||
|     SPIx_WriteReadData(DataIn, DataOut, DataLength); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief  Write a byte on the SD. | ||||
|  * @param  Data: byte to send. | ||||
|  * @retval Data written | ||||
|  */ | ||||
| uint8_t SD_IO_WriteByte(uint8_t Data) { | ||||
|     uint8_t tmp; | ||||
| 
 | ||||
|     /* Send the byte */ | ||||
|     SPIx_WriteReadData(&Data, &tmp, 1); | ||||
|     return tmp; | ||||
| } | ||||
							
								
								
									
										1012
									
								
								firmware/targets/f2/Src/fatfs/stm32_adafruit_sd.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1012
									
								
								firmware/targets/f2/Src/fatfs/stm32_adafruit_sd.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										251
									
								
								firmware/targets/f2/Src/fatfs/stm32_adafruit_sd.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										251
									
								
								firmware/targets/f2/Src/fatfs/stm32_adafruit_sd.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,251 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32_adafruit_sd.h | ||||
|   * @author  MCD Application Team | ||||
|   * @version V3.0.0 | ||||
|   * @date    23-December-2016 | ||||
|   * @brief   This file contains the common defines and functions prototypes for | ||||
|   *          the stm32_adafruit_sd.c driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> | ||||
|   * | ||||
|   * Redistribution and use in source and binary forms, with or without modification, | ||||
|   * are permitted provided that the following conditions are met: | ||||
|   *   1. Redistributions of source code must retain the above copyright notice, | ||||
|   *      this list of conditions and the following disclaimer. | ||||
|   *   2. Redistributions in binary form must reproduce the above copyright notice, | ||||
|   *      this list of conditions and the following disclaimer in the documentation | ||||
|   *      and/or other materials provided with the distribution. | ||||
|   *   3. Neither the name of STMicroelectronics nor the names of its contributors | ||||
|   *      may be used to endorse or promote products derived from this software | ||||
|   *      without specific prior written permission. | ||||
|   * | ||||
|   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
|   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
|   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||||
|   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||
|   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||
|   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||||
|   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
|   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */  | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __STM32_ADAFRUIT_SD_H | ||||
| #define __STM32_ADAFRUIT_SD_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif  | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| /** @addtogroup BSP
 | ||||
|   * @{ | ||||
|   */  | ||||
| #define __IO    volatile    | ||||
|     | ||||
| /** @addtogroup STM32_ADAFRUIT
 | ||||
|   * @{ | ||||
|   */ | ||||
|      | ||||
| /** @defgroup STM32_ADAFRUIT_SD
 | ||||
|   * @{ | ||||
|   */     | ||||
| 
 | ||||
| /** @defgroup STM32_ADAFRUIT_SD_Exported_Types
 | ||||
|   * @{ | ||||
|   */ | ||||
|     | ||||
| /** 
 | ||||
|   * @brief  SD status structure definition   | ||||
|   */      | ||||
| enum {     | ||||
|       BSP_SD_OK = 0x00,       | ||||
|       MSD_OK = 0x00, | ||||
|       BSP_SD_ERROR = 0x01, | ||||
|       BSP_SD_TIMEOUT | ||||
| }; | ||||
|     | ||||
| typedef struct               | ||||
| { | ||||
|   uint8_t  Reserved1:2;               /* Reserved */ | ||||
|   uint16_t DeviceSize:12;             /* Device Size */ | ||||
|   uint8_t  MaxRdCurrentVDDMin:3;      /* Max. read current @ VDD min */ | ||||
|   uint8_t  MaxRdCurrentVDDMax:3;      /* Max. read current @ VDD max */ | ||||
|   uint8_t  MaxWrCurrentVDDMin:3;      /* Max. write current @ VDD min */ | ||||
|   uint8_t  MaxWrCurrentVDDMax:3;      /* Max. write current @ VDD max */ | ||||
|   uint8_t  DeviceSizeMul:3;           /* Device size multiplier */ | ||||
| } struct_v1; | ||||
| 
 | ||||
| 
 | ||||
| typedef struct               | ||||
| { | ||||
|   uint8_t  Reserved1:6;               /* Reserved */ | ||||
|   uint32_t DeviceSize:22;             /* Device Size */ | ||||
|   uint8_t  Reserved2:1;               /* Reserved */ | ||||
| } struct_v2; | ||||
| 
 | ||||
| /** 
 | ||||
|   * @brief  Card Specific Data: CSD Register | ||||
|   */  | ||||
| typedef struct | ||||
| { | ||||
|   /* Header part */ | ||||
|   uint8_t  CSDStruct:2;            /* CSD structure */ | ||||
|   uint8_t  Reserved1:6;            /* Reserved */ | ||||
|   uint8_t  TAAC:8;                 /* Data read access-time 1 */ | ||||
|   uint8_t  NSAC:8;                 /* Data read access-time 2 in CLK cycles */ | ||||
|   uint8_t  MaxBusClkFrec:8;        /* Max. bus clock frequency */ | ||||
|   uint16_t CardComdClasses:12;      /* Card command classes */ | ||||
|   uint8_t  RdBlockLen:4;           /* Max. read data block length */ | ||||
|   uint8_t  PartBlockRead:1;        /* Partial blocks for read allowed */ | ||||
|   uint8_t  WrBlockMisalign:1;      /* Write block misalignment */ | ||||
|   uint8_t  RdBlockMisalign:1;      /* Read block misalignment */ | ||||
|   uint8_t  DSRImpl:1;              /* DSR implemented */ | ||||
|    | ||||
|   /* v1 or v2 struct */ | ||||
|   union csd_version { | ||||
|     struct_v1 v1; | ||||
|     struct_v2 v2; | ||||
|   } version; | ||||
|    | ||||
|   uint8_t  EraseSingleBlockEnable:1;  /* Erase single block enable */ | ||||
|   uint8_t  EraseSectorSize:7;         /* Erase group size multiplier */ | ||||
|   uint8_t  WrProtectGrSize:7;         /* Write protect group size */ | ||||
|   uint8_t  WrProtectGrEnable:1;       /* Write protect group enable */ | ||||
|   uint8_t  Reserved2:2;               /* Reserved */ | ||||
|   uint8_t  WrSpeedFact:3;             /* Write speed factor */ | ||||
|   uint8_t  MaxWrBlockLen:4;           /* Max. write data block length */ | ||||
|   uint8_t  WriteBlockPartial:1;       /* Partial blocks for write allowed */ | ||||
|   uint8_t  Reserved3:5;               /* Reserved */ | ||||
|   uint8_t  FileFormatGrouop:1;        /* File format group */ | ||||
|   uint8_t  CopyFlag:1;                /* Copy flag (OTP) */ | ||||
|   uint8_t  PermWrProtect:1;           /* Permanent write protection */ | ||||
|   uint8_t  TempWrProtect:1;           /* Temporary write protection */ | ||||
|   uint8_t  FileFormat:2;              /* File Format */ | ||||
|   uint8_t  Reserved4:2;               /* Reserved */ | ||||
|   uint8_t  crc:7;                     /* Reserved */ | ||||
|   uint8_t  Reserved5:1;               /* always 1*/ | ||||
|    | ||||
| } SD_CSD; | ||||
| 
 | ||||
| /** 
 | ||||
|   * @brief  Card Identification Data: CID Register    | ||||
|   */ | ||||
| typedef struct | ||||
| { | ||||
|   __IO uint8_t  ManufacturerID;       /* ManufacturerID */ | ||||
|   __IO uint16_t OEM_AppliID;          /* OEM/Application ID */ | ||||
|   __IO uint32_t ProdName1;            /* Product Name part1 */ | ||||
|   __IO uint8_t  ProdName2;            /* Product Name part2*/ | ||||
|   __IO uint8_t  ProdRev;              /* Product Revision */ | ||||
|   __IO uint32_t ProdSN;               /* Product Serial Number */ | ||||
|   __IO uint8_t  Reserved1;            /* Reserved1 */ | ||||
|   __IO uint16_t ManufactDate;         /* Manufacturing Date */ | ||||
|   __IO uint8_t  CID_CRC;              /* CID CRC */ | ||||
|   __IO uint8_t  Reserved2;            /* always 1 */ | ||||
| } SD_CID; | ||||
| 
 | ||||
| /** 
 | ||||
|   * @brief SD Card information  | ||||
|   */ | ||||
| typedef struct | ||||
| { | ||||
|   SD_CSD Csd; | ||||
|   SD_CID Cid; | ||||
|   uint32_t CardCapacity;              /*!< Card Capacity */ | ||||
|   uint32_t CardBlockSize;             /*!< Card Block Size */ | ||||
|   uint32_t LogBlockNbr;               /*!< Specifies the Card logical Capacity in blocks   */ | ||||
|   uint32_t LogBlockSize;              /*!< Specifies logical block size in bytes           */ | ||||
| } SD_CardInfo; | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
|    | ||||
| /** @defgroup STM32_ADAFRUIT_SPI_SD_Exported_Constants
 | ||||
|   * @{ | ||||
|   */  | ||||
|    | ||||
| /**
 | ||||
|   * @brief  Block Size | ||||
|   */ | ||||
| #define SD_BLOCK_SIZE    0x200 | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  SD detection on its memory slot | ||||
|   */ | ||||
| #define SD_PRESENT               ((uint8_t)0x01) | ||||
| #define SD_NOT_PRESENT           ((uint8_t)0x00) | ||||
| 
 | ||||
| #define SD_DATATIMEOUT           ((uint32_t)100000000) | ||||
| 
 | ||||
| /** 
 | ||||
|   * @brief SD Card information structure  | ||||
|   */    | ||||
| #define BSP_SD_CardInfo SD_CardInfo | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */ | ||||
|    | ||||
| /** @defgroup STM32_ADAFRUIT_SD_Exported_Macro
 | ||||
|   * @{ | ||||
|   */  | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */  | ||||
| 
 | ||||
| /** @defgroup STM32_ADAFRUIT_SD_Exported_Functions
 | ||||
|   * @{ | ||||
|   */    | ||||
| uint8_t BSP_SD_Init(void); | ||||
| uint8_t BSP_SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout); | ||||
| uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout); | ||||
| uint8_t BSP_SD_Erase(uint32_t StartAddr, uint32_t EndAddr); | ||||
| uint8_t BSP_SD_GetCardState(void); | ||||
| uint8_t BSP_SD_GetCardInfo(SD_CardInfo *pCardInfo); | ||||
|     | ||||
| /* Link functions for SD Card peripheral*/ | ||||
| void    SD_SPI_Slow_Init(void); | ||||
| void    SD_SPI_Fast_Init(void); | ||||
| void    SD_IO_Init(void); | ||||
| void    SD_IO_CSState(uint8_t state); | ||||
| void    SD_IO_WriteReadData(const uint8_t *DataIn, uint8_t *DataOut, uint16_t DataLength); | ||||
| uint8_t SD_IO_WriteByte(uint8_t Data); | ||||
| 
 | ||||
| /* Link function for HAL delay */ | ||||
| void HAL_Delay(__IO uint32_t Delay); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __STM32_ADAFRUIT_SD_H */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */  | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */  | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */  | ||||
| 
 | ||||
| /**
 | ||||
|   * @} | ||||
|   */  | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										138
									
								
								firmware/targets/f2/Src/fatfs/syscall.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								firmware/targets/f2/Src/fatfs/syscall.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,138 @@ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Sample code of OS dependent controls for FatFs                         */ | ||||
| /* (C)ChaN, 2014                                                          */ | ||||
| /*   Portions COPYRIGHT 2017 STMicroelectronics                           */ | ||||
| /*   Portions Copyright (C) 2014, ChaN, all right reserved                */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. All rights reserved. | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                       opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
| **/ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #include "fatfs/ff.h" | ||||
| 
 | ||||
| 
 | ||||
| #if _FS_REENTRANT | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Create a Synchronization Object                                        */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* This function is called in f_mount() function to create a new
 | ||||
| /  synchronization object, such as semaphore and mutex. When a 0 is returned, | ||||
| /  the f_mount() function fails with FR_INT_ERR. | ||||
| */ | ||||
| 
 | ||||
| int ff_cre_syncobj (	/* 1:Function succeeded, 0:Could not create the sync object */ | ||||
| 	BYTE vol,			/* Corresponding volume (logical drive number) */ | ||||
| 	_SYNC_t *sobj		/* Pointer to return the created sync object */ | ||||
| ) | ||||
| { | ||||
| 
 | ||||
|     int ret; | ||||
| 
 | ||||
|     //osSemaphoreDef(SEM);
 | ||||
|     //*sobj = osSemaphoreCreate(osSemaphore(SEM), 1);
 | ||||
|     *sobj = osMutexNew(NULL); | ||||
|     ret = (*sobj != NULL); | ||||
| 
 | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Delete a Synchronization Object                                        */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* This function is called in f_mount() function to delete a synchronization
 | ||||
| /  object that created with ff_cre_syncobj() function. When a 0 is returned, | ||||
| /  the f_mount() function fails with FR_INT_ERR. | ||||
| */ | ||||
| 
 | ||||
| int ff_del_syncobj (	/* 1:Function succeeded, 0:Could not delete due to any error */ | ||||
| 	_SYNC_t sobj		/* Sync object tied to the logical drive to be deleted */ | ||||
| ) | ||||
| { | ||||
|     osMutexDelete(sobj); | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Request Grant to Access the Volume                                     */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* This function is called on entering file functions to lock the volume.
 | ||||
| /  When a 0 is returned, the file function fails with FR_TIMEOUT. | ||||
| */ | ||||
| 
 | ||||
| int ff_req_grant (	/* 1:Got a grant to access the volume, 0:Could not get a grant */ | ||||
| 	_SYNC_t sobj	/* Sync object to wait */ | ||||
| ) | ||||
| { | ||||
|   int ret = 0; | ||||
| 
 | ||||
|   if(osMutexAcquire(sobj, _FS_TIMEOUT) == osOK) { | ||||
|       ret = 1; | ||||
|   } | ||||
| 
 | ||||
|   return ret; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Release Grant to Access the Volume                                     */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* This function is called on leaving file functions to unlock the volume.
 | ||||
| */ | ||||
| 
 | ||||
| void ff_rel_grant ( | ||||
| 	_SYNC_t sobj	/* Sync object to be signaled */ | ||||
| ) | ||||
| { | ||||
|     osMutexRelease(sobj); | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #if _USE_LFN == 3	/* LFN with a working buffer on the heap */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Allocate a memory block                                                */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* If a NULL is returned, the file function fails with FR_NOT_ENOUGH_CORE.
 | ||||
| */ | ||||
| 
 | ||||
| void* ff_memalloc (	/* Returns pointer to the allocated memory block */ | ||||
| 	UINT msize		/* Number of bytes to allocate */ | ||||
| ) | ||||
| { | ||||
| 	return ff_malloc(msize);	/* Allocate a new memory block with POSIX API */ | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Free a memory block                                                    */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| void ff_memfree ( | ||||
| 	void* mblock	/* Pointer to the memory block to free */ | ||||
| ) | ||||
| { | ||||
| 	ff_free(mblock);	/* Discard the memory block with POSIX API */ | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										219
									
								
								firmware/targets/f2/Src/fatfs/user_diskio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								firmware/targets/f2/Src/fatfs/user_diskio.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,219 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|  ****************************************************************************** | ||||
|  * @file    user_diskio.c | ||||
|  * @brief   This file includes a diskio driver skeleton to be completed by the user. | ||||
|  ****************************************************************************** | ||||
|  * @attention | ||||
|  * | ||||
|  * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|  * All rights reserved.</center></h2> | ||||
|  * | ||||
|  * This software component is licensed by ST under Ultimate Liberty license | ||||
|  * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|  * the License. You may obtain a copy of the License at: | ||||
|  *                             www.st.com/SLA0044 | ||||
|  * | ||||
|  ****************************************************************************** | ||||
|  */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| #ifdef USE_OBSOLETE_USER_CODE_SECTION_0 | ||||
| /* 
 | ||||
|  * Warning: the user section 0 is no more in use (starting from CubeMx version 4.16.0) | ||||
|  * To be suppressed in the future.  | ||||
|  * Kept to ensure backward compatibility with previous CubeMx versions when  | ||||
|  * migrating projects.  | ||||
|  * User code previously added there should be copied in the new user sections before  | ||||
|  * the section contents can be deleted. | ||||
|  */ | ||||
| /* USER CODE BEGIN 0 */ | ||||
| /* USER CODE END 0 */ | ||||
| #endif | ||||
| 
 | ||||
| /* USER CODE BEGIN DECL */ | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "user_diskio.h" | ||||
| 
 | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| 
 | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Disk status */ | ||||
| static volatile DSTATUS Stat = STA_NOINIT; | ||||
| 
 | ||||
| static DSTATUS User_CheckStatus(BYTE lun) { | ||||
|     Stat = STA_NOINIT; | ||||
| 
 | ||||
|     if(BSP_SD_GetCardState() == MSD_OK) { | ||||
|         Stat &= ~STA_NOINIT; | ||||
|     } | ||||
| 
 | ||||
|     return Stat; | ||||
| } | ||||
| /* USER CODE END DECL */ | ||||
| 
 | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| DSTATUS USER_initialize(BYTE pdrv); | ||||
| DSTATUS USER_status(BYTE pdrv); | ||||
| DRESULT USER_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count); | ||||
| #if _USE_WRITE == 1 | ||||
| DRESULT USER_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); | ||||
| #endif /* _USE_WRITE == 1 */ | ||||
| #if _USE_IOCTL == 1 | ||||
| DRESULT USER_ioctl(BYTE pdrv, BYTE cmd, void* buff); | ||||
| #endif /* _USE_IOCTL == 1 */ | ||||
| 
 | ||||
| Diskio_drvTypeDef USER_Driver = { | ||||
|     USER_initialize, | ||||
|     USER_status, | ||||
|     USER_read, | ||||
| #if _USE_WRITE | ||||
|     USER_write, | ||||
| #endif /* _USE_WRITE == 1 */ | ||||
| #if _USE_IOCTL == 1 | ||||
|     USER_ioctl, | ||||
| #endif /* _USE_IOCTL == 1 */ | ||||
| }; | ||||
| 
 | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Initializes a Drive | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @retval DSTATUS: Operation status | ||||
|   */ | ||||
| DSTATUS USER_initialize(BYTE pdrv /* Physical drive nmuber to identify the drive */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN INIT */ | ||||
|     return User_CheckStatus(pdrv); | ||||
|     /* USER CODE END INIT */ | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Gets Disk Status  | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @retval DSTATUS: Operation status | ||||
|   */ | ||||
| DSTATUS USER_status(BYTE pdrv /* Physical drive number to identify the drive */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN STATUS */ | ||||
|     return Stat; | ||||
|     /* USER CODE END STATUS */ | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Reads Sector(s)  | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @param  *buff: Data buffer to store read data | ||||
|   * @param  sector: Sector address (LBA) | ||||
|   * @param  count: Number of sectors to read (1..128) | ||||
|   * @retval DRESULT: Operation result | ||||
|   */ | ||||
| DRESULT USER_read( | ||||
|     BYTE pdrv, /* Physical drive nmuber to identify the drive */ | ||||
|     BYTE* buff, /* Data buffer to store read data */ | ||||
|     DWORD sector, /* Sector address in LBA */ | ||||
|     UINT count /* Number of sectors to read */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN READ */ | ||||
|     DRESULT res = RES_ERROR; | ||||
|     if(BSP_SD_ReadBlocks((uint32_t*)buff, (uint32_t)(sector), count, SD_DATATIMEOUT) == MSD_OK) { | ||||
|         /* wait until the read operation is finished */ | ||||
|         while(BSP_SD_GetCardState() != MSD_OK) { | ||||
|         } | ||||
|         res = RES_OK; | ||||
|     } | ||||
| 
 | ||||
|     return res; | ||||
|     /* USER CODE END READ */ | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Writes Sector(s)   | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @param  *buff: Data to be written | ||||
|   * @param  sector: Sector address (LBA) | ||||
|   * @param  count: Number of sectors to write (1..128) | ||||
|   * @retval DRESULT: Operation result | ||||
|   */ | ||||
| #if _USE_WRITE == 1 | ||||
| DRESULT USER_write( | ||||
|     BYTE pdrv, /* Physical drive nmuber to identify the drive */ | ||||
|     const BYTE* buff, /* Data to be written */ | ||||
|     DWORD sector, /* Sector address in LBA */ | ||||
|     UINT count /* Number of sectors to write */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN WRITE */ | ||||
|     /* USER CODE HERE */ | ||||
|     DRESULT res = RES_ERROR; | ||||
| 
 | ||||
|     if(BSP_SD_WriteBlocks((uint32_t*)buff, (uint32_t)(sector), count, SD_DATATIMEOUT) == MSD_OK) { | ||||
|         /* wait until the Write operation is finished */ | ||||
|         while(BSP_SD_GetCardState() != MSD_OK) { | ||||
|         } | ||||
|         res = RES_OK; | ||||
|     } | ||||
| 
 | ||||
|     return res; | ||||
|     /* USER CODE END WRITE */ | ||||
| } | ||||
| #endif /* _USE_WRITE == 1 */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  I/O control operation   | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @param  cmd: Control code | ||||
|   * @param  *buff: Buffer to send/receive control data | ||||
|   * @retval DRESULT: Operation result | ||||
|   */ | ||||
| #if _USE_IOCTL == 1 | ||||
| DRESULT USER_ioctl( | ||||
|     BYTE pdrv, /* Physical drive nmuber (0..) */ | ||||
|     BYTE cmd, /* Control code */ | ||||
|     void* buff /* Buffer to send/receive control data */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN IOCTL */ | ||||
|     DRESULT res = RES_ERROR; | ||||
|     BSP_SD_CardInfo CardInfo; | ||||
| 
 | ||||
|     if(Stat & STA_NOINIT) return RES_NOTRDY; | ||||
| 
 | ||||
|     switch(cmd) { | ||||
|     /* Make sure that no pending write process */ | ||||
|     case CTRL_SYNC: | ||||
|         res = RES_OK; | ||||
|         break; | ||||
| 
 | ||||
|     /* Get number of sectors on the disk (DWORD) */ | ||||
|     case GET_SECTOR_COUNT: | ||||
|         BSP_SD_GetCardInfo(&CardInfo); | ||||
|         *(DWORD*)buff = CardInfo.LogBlockNbr; | ||||
|         res = RES_OK; | ||||
|         break; | ||||
| 
 | ||||
|     /* Get R/W sector size (WORD) */ | ||||
|     case GET_SECTOR_SIZE: | ||||
|         BSP_SD_GetCardInfo(&CardInfo); | ||||
|         *(WORD*)buff = CardInfo.LogBlockSize; | ||||
|         res = RES_OK; | ||||
|         break; | ||||
| 
 | ||||
|     /* Get erase block size in unit of sector (DWORD) */ | ||||
|     case GET_BLOCK_SIZE: | ||||
|         BSP_SD_GetCardInfo(&CardInfo); | ||||
|         *(DWORD*)buff = CardInfo.LogBlockSize; | ||||
|         res = RES_OK; | ||||
|         break; | ||||
| 
 | ||||
|     default: | ||||
|         res = RES_PARERR; | ||||
|     } | ||||
| 
 | ||||
|     return res; | ||||
|     /* USER CODE END IOCTL */ | ||||
| } | ||||
| #endif /* _USE_IOCTL == 1 */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										48
									
								
								firmware/targets/f2/Src/fatfs/user_diskio.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								firmware/targets/f2/Src/fatfs/user_diskio.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|  ****************************************************************************** | ||||
|   * @file    user_diskio.h | ||||
|   * @brief   This file contains the common defines and functions prototypes for   | ||||
|   *          the user_diskio driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __USER_DISKIO_H | ||||
| #define __USER_DISKIO_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* USER CODE BEGIN 0 */ | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32_adafruit_sd.h" | ||||
| #include "fatfs/ff_gen_drv.h" | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /* Exported functions ------------------------------------------------------- */ | ||||
| extern Diskio_drvTypeDef USER_Driver; | ||||
| 
 | ||||
| /* USER CODE END 0 */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __USER_DISKIO_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -30,7 +30,7 @@ | ||||
| 
 | ||||
| /* Private includes ----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| #include "fatfs/fatfs.h" | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| @ -101,7 +101,7 @@ int main(void) | ||||
|   MX_USART1_UART_Init(); | ||||
|   MX_TIM8_Init(); | ||||
|   /* USER CODE BEGIN 2 */ | ||||
| 
 | ||||
|   MX_FATFS_Init(); | ||||
|   /* USER CODE END 2 */ | ||||
| 
 | ||||
|   /* Init scheduler */ | ||||
|  | ||||
| @ -54,7 +54,8 @@ C_SOURCES		+= \ | ||||
| 	$(CUBE_DIR)/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c \
 | ||||
| 	$(CUBE_DIR)/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c \
 | ||||
| 	$(CUBE_DIR)/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c \
 | ||||
| 	$(wildcard $(TARGET_DIR)/Src/*.c) | ||||
| 	$(wildcard $(TARGET_DIR)/Src/*.c) \
 | ||||
| 	$(wildcard $(TARGET_DIR)/Src/fatfs/*.c) | ||||
| 
 | ||||
| ASM_SOURCES += $(TARGET_DIR)/startup_stm32l476xx.s | ||||
| 
 | ||||
| @ -77,5 +78,6 @@ CFLAGS += \ | ||||
| 	-I$(CUBE_DIR)/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc \
 | ||||
| 	-I$(CUBE_DIR)/Drivers/CMSIS/Device/ST/STM32L4xx/Include \
 | ||||
| 	-I$(CUBE_DIR)/Drivers/CMSIS/Include \
 | ||||
| 	-I$(CUBE_DIR)/Drivers/CMSIS/Include | ||||
| 	-I$(CUBE_DIR)/Drivers/CMSIS/Include \
 | ||||
| 	-I$(TARGET_DIR)/Src/fatfs | ||||
| 
 | ||||
|  | ||||
| @ -66,3 +66,5 @@ BaseType_t xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicks | ||||
| 
 | ||||
| void* pvTaskGetThreadLocalStoragePointer(TaskHandle_t xTaskToQuery, BaseType_t xIndex); | ||||
| void vTaskSetThreadLocalStoragePointer(TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue); | ||||
| 
 | ||||
| QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength, UBaseType_t uxItemSize); | ||||
|  | ||||
| @ -14,4 +14,6 @@ uint16_t | ||||
| HAL_UART_Transmit(UART_HandleTypeDef* handle, uint8_t* bufer, uint16_t size, uint32_t wait_ms) { | ||||
|     uint16_t res = write(1, (const char*)bufer, size); | ||||
|     return res; | ||||
| } | ||||
| } | ||||
| 
 | ||||
| void BSP_SD_Init() {} | ||||
|  | ||||
| @ -110,6 +110,10 @@ QueueHandle_t xQueueCreateStatic( | ||||
|     return (QueueHandle_t)msgid; | ||||
| } | ||||
| 
 | ||||
| QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength, UBaseType_t uxItemSize) { | ||||
|     return xQueueCreateStatic(uxQueueLength, uxItemSize, 0, NULL); | ||||
| } | ||||
| 
 | ||||
| SemaphoreHandle_t xSemaphoreCreateCountingStatic( | ||||
|     UBaseType_t uxMaxCount, | ||||
|     UBaseType_t uxInitialCount, | ||||
| @ -225,3 +229,4 @@ void vTaskSetThreadLocalStoragePointer(TaskHandle_t xTaskToSet, BaseType_t xInde | ||||
| 
 | ||||
|     pthread_setspecific(tls_keys[xIndex], pvValue); | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										56
									
								
								firmware/targets/local/fatfs/fatfs.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								firmware/targets/local/fatfs/fatfs.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file   fatfs.c | ||||
|   * @brief  Code for fatfs applications | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| #include "fatfs.h" | ||||
| 
 | ||||
| uint8_t retUSER;    /* Return value for USER */ | ||||
| char USERPath[4];   /* USER logical drive path */ | ||||
| FATFS USERFatFS;    /* File system object for USER logical drive */ | ||||
| FIL USERFile;       /* File object for USER */ | ||||
| 
 | ||||
| /* USER CODE BEGIN Variables */ | ||||
| 
 | ||||
| /* USER CODE END Variables */     | ||||
| 
 | ||||
| void MX_FATFS_Init(void)  | ||||
| { | ||||
|   /*## FatFS: Link the USER driver ###########################*/ | ||||
|   retUSER = FATFS_LinkDriver(&USER_Driver, USERPath); | ||||
| 
 | ||||
|   /* USER CODE BEGIN Init */ | ||||
|   /* additional user code for init */      | ||||
|   /* USER CODE END Init */ | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Gets Time from RTC  | ||||
|   * @param  None | ||||
|   * @retval Time in DWORD | ||||
|   */ | ||||
| DWORD get_fattime(void) | ||||
| { | ||||
|   /* USER CODE BEGIN get_fattime */ | ||||
|   return 0; | ||||
|   /* USER CODE END get_fattime */   | ||||
| } | ||||
| 
 | ||||
| /* USER CODE BEGIN Application */ | ||||
|       | ||||
| /* USER CODE END Application */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										49
									
								
								firmware/targets/local/fatfs/fatfs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								firmware/targets/local/fatfs/fatfs.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file   fatfs.h | ||||
|   * @brief  Header for fatfs applications | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __fatfs_H | ||||
| #define __fatfs_H | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #include "fatfs/ff.h" | ||||
| #include "fatfs/ff_gen_drv.h" | ||||
| #include "user_diskio.h" /* defines USER_Driver as external */ | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern uint8_t retUSER; /* Return value for USER */ | ||||
| extern char USERPath[4]; /* USER logical drive path */ | ||||
| extern FATFS USERFatFS; /* File system object for USER logical drive */ | ||||
| extern FIL USERFile; /* File object for USER */ | ||||
| 
 | ||||
| void MX_FATFS_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| #endif /*__fatfs_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										269
									
								
								firmware/targets/local/fatfs/ffconf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										269
									
								
								firmware/targets/local/fatfs/ffconf.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,269 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   *  FatFs - Generic FAT file system module  R0.12c (C)ChaN, 2017 | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| #ifndef _FFCONF | ||||
| #define _FFCONF 68300	/* Revision ID */ | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------------/
 | ||||
| / Additional user header to be used   | ||||
| /-----------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #include "main.h" | ||||
| #include "cmsis_os.h" /* _FS_REENTRANT set to 1 and CMSIS API chosen */ | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------------/
 | ||||
| / Function Configurations | ||||
| /-----------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _FS_READONLY         0      /* 0:Read/Write or 1:Read only */ | ||||
| /* This option switches read-only configuration. (0:Read/Write or 1:Read-only)
 | ||||
| /  Read-only configuration removes writing API functions, f_write(), f_sync(), | ||||
| /  f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() | ||||
| /  and optional writing functions as well. */ | ||||
| 
 | ||||
| #define _FS_MINIMIZE         0      /* 0 to 3 */ | ||||
| /* This option defines minimization level to remove some basic API functions.
 | ||||
| / | ||||
| /   0: All basic functions are enabled. | ||||
| /   1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() | ||||
| /      are removed. | ||||
| /   2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. | ||||
| /   3: f_lseek() function is removed in addition to 2. */ | ||||
| 
 | ||||
| #define _USE_STRFUNC         2      /* 0:Disable or 1-2:Enable */ | ||||
| /* This option switches string functions, f_gets(), f_putc(), f_puts() and
 | ||||
| /  f_printf(). | ||||
| / | ||||
| /  0: Disable string functions. | ||||
| /  1: Enable without LF-CRLF conversion. | ||||
| /  2: Enable with LF-CRLF conversion. */ | ||||
| 
 | ||||
| #define _USE_FIND            0 | ||||
| /* This option switches filtered directory read functions, f_findfirst() and
 | ||||
| /  f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ | ||||
| 
 | ||||
| #define _USE_MKFS            1 | ||||
| /* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| #define _USE_FASTSEEK        1 | ||||
| /* This option switches fast seek feature. (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| #define	_USE_EXPAND		0 | ||||
| /* This option switches f_expand function. (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| #define _USE_CHMOD		0 | ||||
| /* This option switches attribute manipulation functions, f_chmod() and f_utime().
 | ||||
| /  (0:Disable or 1:Enable) Also _FS_READONLY needs to be 0 to enable this option. */ | ||||
| 
 | ||||
| #define _USE_LABEL           0 | ||||
| /* This option switches volume label functions, f_getlabel() and f_setlabel().
 | ||||
| /  (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| #define _USE_FORWARD         0 | ||||
| /* This option switches f_forward() function. (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| /*-----------------------------------------------------------------------------/
 | ||||
| / Locale and Namespace Configurations | ||||
| /-----------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _CODE_PAGE         850 | ||||
| /* This option specifies the OEM code page to be used on the target system.
 | ||||
| /  Incorrect setting of the code page can cause a file open failure. | ||||
| / | ||||
| /   1   - ASCII (No extended character. Non-LFN cfg. only) | ||||
| /   437 - U.S. | ||||
| /   720 - Arabic | ||||
| /   737 - Greek | ||||
| /   771 - KBL | ||||
| /   775 - Baltic | ||||
| /   850 - Latin 1 | ||||
| /   852 - Latin 2 | ||||
| /   855 - Cyrillic | ||||
| /   857 - Turkish | ||||
| /   860 - Portuguese | ||||
| /   861 - Icelandic | ||||
| /   862 - Hebrew | ||||
| /   863 - Canadian French | ||||
| /   864 - Arabic | ||||
| /   865 - Nordic | ||||
| /   866 - Russian | ||||
| /   869 - Greek 2 | ||||
| /   932 - Japanese (DBCS) | ||||
| /   936 - Simplified Chinese (DBCS) | ||||
| /   949 - Korean (DBCS) | ||||
| /   950 - Traditional Chinese (DBCS) | ||||
| */ | ||||
| 
 | ||||
| #define _USE_LFN     2    /* 0 to 3 */ | ||||
| #define _MAX_LFN     255  /* Maximum LFN length to handle (12 to 255) */ | ||||
| /* The _USE_LFN switches the support of long file name (LFN).
 | ||||
| / | ||||
| /   0: Disable support of LFN. _MAX_LFN has no effect. | ||||
| /   1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. | ||||
| /   2: Enable LFN with dynamic working buffer on the STACK. | ||||
| /   3: Enable LFN with dynamic working buffer on the HEAP. | ||||
| / | ||||
| /  To enable the LFN, Unicode handling functions (option/unicode.c) must be added | ||||
| /  to the project. The working buffer occupies (_MAX_LFN + 1) * 2 bytes and | ||||
| /  additional 608 bytes at exFAT enabled. _MAX_LFN can be in range from 12 to 255. | ||||
| /  It should be set 255 to support full featured LFN operations. | ||||
| /  When use stack for the working buffer, take care on stack overflow. When use heap | ||||
| /  memory for the working buffer, memory management functions, ff_memalloc() and | ||||
| /  ff_memfree(), must be added to the project. */ | ||||
| 
 | ||||
| #define _LFN_UNICODE    0 /* 0:ANSI/OEM or 1:Unicode */ | ||||
| /* This option switches character encoding on the API. (0:ANSI/OEM or 1:UTF-16)
 | ||||
| /  To use Unicode string for the path name, enable LFN and set _LFN_UNICODE = 1. | ||||
| /  This option also affects behavior of string I/O functions. */ | ||||
| 
 | ||||
| #define _STRF_ENCODE    3 | ||||
| /* When _LFN_UNICODE == 1, this option selects the character encoding ON THE FILE to
 | ||||
| /  be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf(). | ||||
| / | ||||
| /  0: ANSI/OEM | ||||
| /  1: UTF-16LE | ||||
| /  2: UTF-16BE | ||||
| /  3: UTF-8 | ||||
| / | ||||
| /  This option has no effect when _LFN_UNICODE == 0. */ | ||||
| 
 | ||||
| #define _FS_RPATH       0 /* 0 to 2 */ | ||||
| /* This option configures support of relative path.
 | ||||
| / | ||||
| /   0: Disable relative path and remove related functions. | ||||
| /   1: Enable relative path. f_chdir() and f_chdrive() are available. | ||||
| /   2: f_getcwd() function is available in addition to 1. | ||||
| */ | ||||
| 
 | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| / Drive/Volume Configurations | ||||
| /----------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _VOLUMES    1 | ||||
| /* Number of volumes (logical drives) to be used. */ | ||||
| 
 | ||||
| /* USER CODE BEGIN Volumes */   | ||||
| #define _STR_VOLUME_ID          0	/* 0:Use only 0-9 for drive ID, 1:Use strings for drive ID */ | ||||
| #define _VOLUME_STRS            "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3" | ||||
| /* _STR_VOLUME_ID switches string support of volume ID.
 | ||||
| /  When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive | ||||
| /  number in the path name. _VOLUME_STRS defines the drive ID strings for each | ||||
| /  logical drives. Number of items must be equal to _VOLUMES. Valid characters for | ||||
| /  the drive ID strings are: A-Z and 0-9. */ | ||||
| /* USER CODE END Volumes */   | ||||
| 
 | ||||
| #define _MULTI_PARTITION     0 /* 0:Single partition, 1:Multiple partition */ | ||||
| /* This option switches support of multi-partition on a physical drive.
 | ||||
| /  By default (0), each logical drive number is bound to the same physical drive | ||||
| /  number and only an FAT volume found on the physical drive will be mounted. | ||||
| /  When multi-partition is enabled (1), each logical drive number can be bound to | ||||
| /  arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() | ||||
| /  funciton will be available. */ | ||||
| #define _MIN_SS    512  /* 512, 1024, 2048 or 4096 */ | ||||
| #define _MAX_SS    512  /* 512, 1024, 2048 or 4096 */ | ||||
| /* These options configure the range of sector size to be supported. (512, 1024,
 | ||||
| /  2048 or 4096) Always set both 512 for most systems, all type of memory cards and | ||||
| /  harddisk. But a larger value may be required for on-board flash memory and some | ||||
| /  type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured | ||||
| /  to variable sector size and GET_SECTOR_SIZE command must be implemented to the | ||||
| /  disk_ioctl() function. */ | ||||
| 
 | ||||
| #define	_USE_TRIM      0 | ||||
| /* This option switches support of ATA-TRIM. (0:Disable or 1:Enable)
 | ||||
| /  To enable Trim function, also CTRL_TRIM command should be implemented to the | ||||
| /  disk_ioctl() function. */ | ||||
| 
 | ||||
| #define _FS_NOFSINFO    0 /* 0,1,2 or 3 */ | ||||
| /* If you need to know correct free space on the FAT32 volume, set bit 0 of this
 | ||||
| /  option, and f_getfree() function at first time after volume mount will force | ||||
| /  a full FAT scan. Bit 1 controls the use of last allocated cluster number. | ||||
| / | ||||
| /  bit0=0: Use free cluster count in the FSINFO if available. | ||||
| /  bit0=1: Do not trust free cluster count in the FSINFO. | ||||
| /  bit1=0: Use last allocated cluster number in the FSINFO if available. | ||||
| /  bit1=1: Do not trust last allocated cluster number in the FSINFO. | ||||
| */ | ||||
| 
 | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| / System Configurations | ||||
| /----------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _FS_TINY    0      /* 0:Normal or 1:Tiny */ | ||||
| /* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
 | ||||
| /  At the tiny configuration, size of file object (FIL) is reduced _MAX_SS bytes. | ||||
| /  Instead of private sector buffer eliminated from the file object, common sector | ||||
| /  buffer in the file system object (FATFS) is used for the file data transfer. */ | ||||
| 
 | ||||
| #define _FS_EXFAT	0 | ||||
| /* This option switches support of exFAT file system. (0:Disable or 1:Enable)
 | ||||
| /  When enable exFAT, also LFN needs to be enabled. (_USE_LFN >= 1) | ||||
| /  Note that enabling exFAT discards C89 compatibility. */ | ||||
| 
 | ||||
| #define _FS_NORTC	0 | ||||
| #define _NORTC_MON	6 | ||||
| #define _NORTC_MDAY	4 | ||||
| #define _NORTC_YEAR	2015 | ||||
| /* The option _FS_NORTC switches timestamp functiton. If the system does not have
 | ||||
| /  any RTC function or valid timestamp is not needed, set _FS_NORTC = 1 to disable | ||||
| /  the timestamp function. All objects modified by FatFs will have a fixed timestamp | ||||
| /  defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR in local time. | ||||
| /  To enable timestamp function (_FS_NORTC = 0), get_fattime() function need to be | ||||
| /  added to the project to get current time form real-time clock. _NORTC_MON, | ||||
| /  _NORTC_MDAY and _NORTC_YEAR have no effect.  | ||||
| /  These options have no effect at read-only configuration (_FS_READONLY = 1). */ | ||||
| 
 | ||||
| #define _FS_LOCK    2     /* 0:Disable or >=1:Enable */ | ||||
| /* The option _FS_LOCK switches file lock function to control duplicated file open
 | ||||
| /  and illegal operation to open objects. This option must be 0 when _FS_READONLY | ||||
| /  is 1. | ||||
| / | ||||
| /  0:  Disable file lock function. To avoid volume corruption, application program | ||||
| /      should avoid illegal open, remove and rename to the open objects. | ||||
| /  >0: Enable file lock function. The value defines how many files/sub-directories | ||||
| /      can be opened simultaneously under file lock control. Note that the file | ||||
| /      lock control is independent of re-entrancy. */ | ||||
| 
 | ||||
| #define _FS_REENTRANT    1  /* 0:Disable or 1:Enable */ | ||||
| #define _FS_TIMEOUT      1000 /* Timeout period in unit of time ticks */ | ||||
| #define _SYNC_t          SemaphoreHandle_t | ||||
| /* The option _FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs
 | ||||
| /  module itself. Note that regardless of this option, file access to different | ||||
| /  volume is always re-entrant and volume control functions, f_mount(), f_mkfs() | ||||
| /  and f_fdisk() function, are always not re-entrant. Only file/directory access | ||||
| /  to the same volume is under control of this function. | ||||
| / | ||||
| /   0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect. | ||||
| /   1: Enable re-entrancy. Also user provided synchronization handlers, | ||||
| /      ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() | ||||
| /      function, must be added to the project. Samples are available in | ||||
| /      option/syscall.c. | ||||
| / | ||||
| /  The _FS_TIMEOUT defines timeout period in unit of time tick. | ||||
| /  The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, | ||||
| /  SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be | ||||
| /  included somewhere in the scope of ff.h. */ | ||||
| 
 | ||||
| /* define the ff_malloc ff_free macros as standard malloc free */ | ||||
| #if !defined(ff_malloc) && !defined(ff_free) | ||||
| #include <stdlib.h> | ||||
| #define ff_malloc  malloc | ||||
| #define ff_free  free | ||||
| #endif | ||||
| 
 | ||||
| #endif /* _FFCONF */ | ||||
							
								
								
									
										119
									
								
								firmware/targets/local/fatfs/syscall.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								firmware/targets/local/fatfs/syscall.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,119 @@ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Sample code of OS dependent controls for FatFs                         */ | ||||
| /* (C)ChaN, 2014                                                          */ | ||||
| /*   Portions COPYRIGHT 2017 STMicroelectronics                           */ | ||||
| /*   Portions Copyright (C) 2014, ChaN, all right reserved                */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. All rights reserved. | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                       opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
| **/ | ||||
| 
 | ||||
| #include "fatfs/ff.h" | ||||
| 
 | ||||
| #if _FS_REENTRANT | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Create a Synchronization Object                                        */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* This function is called in f_mount() function to create a new
 | ||||
| /  synchronization object, such as semaphore and mutex. When a 0 is returned, | ||||
| /  the f_mount() function fails with FR_INT_ERR. | ||||
| */ | ||||
| 
 | ||||
| int ff_cre_syncobj (	/* 1:Function succeeded, 0:Could not create the sync object */ | ||||
| 	BYTE vol,			/* Corresponding volume (logical drive number) */ | ||||
| 	_SYNC_t *sobj		/* Pointer to return the created sync object */ | ||||
| ) | ||||
| { | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Delete a Synchronization Object                                        */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* This function is called in f_mount() function to delete a synchronization
 | ||||
| /  object that created with ff_cre_syncobj() function. When a 0 is returned, | ||||
| /  the f_mount() function fails with FR_INT_ERR. | ||||
| */ | ||||
| 
 | ||||
| int ff_del_syncobj (	/* 1:Function succeeded, 0:Could not delete due to any error */ | ||||
| 	_SYNC_t sobj		/* Sync object tied to the logical drive to be deleted */ | ||||
| ) | ||||
| { | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Request Grant to Access the Volume                                     */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* This function is called on entering file functions to lock the volume.
 | ||||
| /  When a 0 is returned, the file function fails with FR_TIMEOUT. | ||||
| */ | ||||
| 
 | ||||
| int ff_req_grant (	/* 1:Got a grant to access the volume, 0:Could not get a grant */ | ||||
| 	_SYNC_t sobj	/* Sync object to wait */ | ||||
| ) | ||||
| { | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Release Grant to Access the Volume                                     */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* This function is called on leaving file functions to unlock the volume.
 | ||||
| */ | ||||
| 
 | ||||
| void ff_rel_grant ( | ||||
| 	_SYNC_t sobj	/* Sync object to be signaled */ | ||||
| ) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #if _USE_LFN == 3	/* LFN with a working buffer on the heap */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Allocate a memory block                                                */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* If a NULL is returned, the file function fails with FR_NOT_ENOUGH_CORE.
 | ||||
| */ | ||||
| 
 | ||||
| void* ff_memalloc (	/* Returns pointer to the allocated memory block */ | ||||
| 	UINT msize		/* Number of bytes to allocate */ | ||||
| ) | ||||
| { | ||||
| 	return ff_malloc(msize);	/* Allocate a new memory block with POSIX API */ | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Free a memory block                                                    */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| void ff_memfree ( | ||||
| 	void* mblock	/* Pointer to the memory block to free */ | ||||
| ) | ||||
| { | ||||
| 	ff_free(mblock);	/* Discard the memory block with POSIX API */ | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										219
									
								
								firmware/targets/local/fatfs/user_diskio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								firmware/targets/local/fatfs/user_diskio.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,219 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|  ****************************************************************************** | ||||
|  * @file    user_diskio.c | ||||
|  * @brief   This file includes a diskio driver skeleton to be completed by the user. | ||||
|  ****************************************************************************** | ||||
|  * @attention | ||||
|  * | ||||
|  * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|  * All rights reserved.</center></h2> | ||||
|  * | ||||
|  * This software component is licensed by ST under Ultimate Liberty license | ||||
|  * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|  * the License. You may obtain a copy of the License at: | ||||
|  *                             www.st.com/SLA0044 | ||||
|  * | ||||
|  ****************************************************************************** | ||||
|  */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| #ifdef USE_OBSOLETE_USER_CODE_SECTION_0 | ||||
| /* 
 | ||||
|  * Warning: the user section 0 is no more in use (starting from CubeMx version 4.16.0) | ||||
|  * To be suppressed in the future.  | ||||
|  * Kept to ensure backward compatibility with previous CubeMx versions when  | ||||
|  * migrating projects.  | ||||
|  * User code previously added there should be copied in the new user sections before  | ||||
|  * the section contents can be deleted. | ||||
|  */ | ||||
| /* USER CODE BEGIN 0 */ | ||||
| /* USER CODE END 0 */ | ||||
| #endif | ||||
| 
 | ||||
| /* USER CODE BEGIN DECL */ | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "user_diskio.h" | ||||
| 
 | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| 
 | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Disk status */ | ||||
| static volatile DSTATUS Stat = STA_NOINIT; | ||||
| 
 | ||||
| static DSTATUS User_CheckStatus(BYTE lun) { | ||||
|     Stat = STA_NOINIT; | ||||
| 
 | ||||
|     if(BSP_SD_GetCardState() == MSD_OK) { | ||||
|         Stat &= ~STA_NOINIT; | ||||
|     } | ||||
| 
 | ||||
|     return Stat; | ||||
| } | ||||
| /* USER CODE END DECL */ | ||||
| 
 | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| DSTATUS USER_initialize(BYTE pdrv); | ||||
| DSTATUS USER_status(BYTE pdrv); | ||||
| DRESULT USER_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count); | ||||
| #if _USE_WRITE == 1 | ||||
| DRESULT USER_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); | ||||
| #endif /* _USE_WRITE == 1 */ | ||||
| #if _USE_IOCTL == 1 | ||||
| DRESULT USER_ioctl(BYTE pdrv, BYTE cmd, void* buff); | ||||
| #endif /* _USE_IOCTL == 1 */ | ||||
| 
 | ||||
| Diskio_drvTypeDef USER_Driver = { | ||||
|     USER_initialize, | ||||
|     USER_status, | ||||
|     USER_read, | ||||
| #if _USE_WRITE | ||||
|     USER_write, | ||||
| #endif /* _USE_WRITE == 1 */ | ||||
| #if _USE_IOCTL == 1 | ||||
|     USER_ioctl, | ||||
| #endif /* _USE_IOCTL == 1 */ | ||||
| }; | ||||
| 
 | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Initializes a Drive | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @retval DSTATUS: Operation status | ||||
|   */ | ||||
| DSTATUS USER_initialize(BYTE pdrv /* Physical drive nmuber to identify the drive */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN INIT */ | ||||
|     return User_CheckStatus(pdrv); | ||||
|     /* USER CODE END INIT */ | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Gets Disk Status  | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @retval DSTATUS: Operation status | ||||
|   */ | ||||
| DSTATUS USER_status(BYTE pdrv /* Physical drive number to identify the drive */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN STATUS */ | ||||
|     return Stat; | ||||
|     /* USER CODE END STATUS */ | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Reads Sector(s)  | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @param  *buff: Data buffer to store read data | ||||
|   * @param  sector: Sector address (LBA) | ||||
|   * @param  count: Number of sectors to read (1..128) | ||||
|   * @retval DRESULT: Operation result | ||||
|   */ | ||||
| DRESULT USER_read( | ||||
|     BYTE pdrv, /* Physical drive nmuber to identify the drive */ | ||||
|     BYTE* buff, /* Data buffer to store read data */ | ||||
|     DWORD sector, /* Sector address in LBA */ | ||||
|     UINT count /* Number of sectors to read */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN READ */ | ||||
|     DRESULT res = RES_ERROR; | ||||
|     if(BSP_SD_ReadBlocks((uint32_t*)buff, (uint32_t)(sector), count, SD_DATATIMEOUT) == MSD_OK) { | ||||
|         /* wait until the read operation is finished */ | ||||
|         while(BSP_SD_GetCardState() != MSD_OK) { | ||||
|         } | ||||
|         res = RES_OK; | ||||
|     } | ||||
| 
 | ||||
|     return res; | ||||
|     /* USER CODE END READ */ | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Writes Sector(s)   | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @param  *buff: Data to be written | ||||
|   * @param  sector: Sector address (LBA) | ||||
|   * @param  count: Number of sectors to write (1..128) | ||||
|   * @retval DRESULT: Operation result | ||||
|   */ | ||||
| #if _USE_WRITE == 1 | ||||
| DRESULT USER_write( | ||||
|     BYTE pdrv, /* Physical drive nmuber to identify the drive */ | ||||
|     const BYTE* buff, /* Data to be written */ | ||||
|     DWORD sector, /* Sector address in LBA */ | ||||
|     UINT count /* Number of sectors to write */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN WRITE */ | ||||
|     /* USER CODE HERE */ | ||||
|     DRESULT res = RES_ERROR; | ||||
| 
 | ||||
|     if(BSP_SD_WriteBlocks((uint32_t*)buff, (uint32_t)(sector), count, SD_DATATIMEOUT) == MSD_OK) { | ||||
|         /* wait until the Write operation is finished */ | ||||
|         while(BSP_SD_GetCardState() != MSD_OK) { | ||||
|         } | ||||
|         res = RES_OK; | ||||
|     } | ||||
| 
 | ||||
|     return res; | ||||
|     /* USER CODE END WRITE */ | ||||
| } | ||||
| #endif /* _USE_WRITE == 1 */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  I/O control operation   | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @param  cmd: Control code | ||||
|   * @param  *buff: Buffer to send/receive control data | ||||
|   * @retval DRESULT: Operation result | ||||
|   */ | ||||
| #if _USE_IOCTL == 1 | ||||
| DRESULT USER_ioctl( | ||||
|     BYTE pdrv, /* Physical drive nmuber (0..) */ | ||||
|     BYTE cmd, /* Control code */ | ||||
|     void* buff /* Buffer to send/receive control data */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN IOCTL */ | ||||
|     DRESULT res = RES_ERROR; | ||||
|     BSP_SD_CardInfo CardInfo; | ||||
| 
 | ||||
|     if(Stat & STA_NOINIT) return RES_NOTRDY; | ||||
| 
 | ||||
|     switch(cmd) { | ||||
|     /* Make sure that no pending write process */ | ||||
|     case CTRL_SYNC: | ||||
|         res = RES_OK; | ||||
|         break; | ||||
| 
 | ||||
|     /* Get number of sectors on the disk (DWORD) */ | ||||
|     case GET_SECTOR_COUNT: | ||||
|         BSP_SD_GetCardInfo(&CardInfo); | ||||
|         *(DWORD*)buff = CardInfo.LogBlockNbr; | ||||
|         res = RES_OK; | ||||
|         break; | ||||
| 
 | ||||
|     /* Get R/W sector size (WORD) */ | ||||
|     case GET_SECTOR_SIZE: | ||||
|         BSP_SD_GetCardInfo(&CardInfo); | ||||
|         *(WORD*)buff = CardInfo.LogBlockSize; | ||||
|         res = RES_OK; | ||||
|         break; | ||||
| 
 | ||||
|     /* Get erase block size in unit of sector (DWORD) */ | ||||
|     case GET_BLOCK_SIZE: | ||||
|         BSP_SD_GetCardInfo(&CardInfo); | ||||
|         *(DWORD*)buff = CardInfo.LogBlockSize; | ||||
|         res = RES_OK; | ||||
|         break; | ||||
| 
 | ||||
|     default: | ||||
|         res = RES_PARERR; | ||||
|     } | ||||
| 
 | ||||
|     return res; | ||||
|     /* USER CODE END IOCTL */ | ||||
| } | ||||
| #endif /* _USE_IOCTL == 1 */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										47
									
								
								firmware/targets/local/fatfs/user_diskio.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								firmware/targets/local/fatfs/user_diskio.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /**
 | ||||
|  ****************************************************************************** | ||||
|   * @file    user_diskio.h | ||||
|   * @brief   This file contains the common defines and functions prototypes for   | ||||
|   *          the user_diskio driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __USER_DISKIO_H | ||||
| #define __USER_DISKIO_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* USER CODE BEGIN 0 */ | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "fatfs/ff_gen_drv.h" | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /* Exported functions ------------------------------------------------------- */ | ||||
| extern Diskio_drvTypeDef USER_Driver; | ||||
| 
 | ||||
| /* USER CODE END 0 */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __USER_DISKIO_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -11,5 +11,9 @@ CFLAGS += -I$(TARGET_DIR)/Inc | ||||
| CFLAGS += -Wall -fdata-sections -ffunction-sections -pthread | ||||
| LDFLAGS += -pthread | ||||
| 
 | ||||
| # FatFs library
 | ||||
| CFLAGS += -I$(TARGET_DIR)/fatfs | ||||
| C_SOURCES += $(TARGET_DIR)/fatfs/syscall.c | ||||
| 
 | ||||
| run: all | ||||
| 	$(OBJ_DIR)/$(PROJECT).elf | ||||
							
								
								
									
										141
									
								
								lib/fatfs/diskio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								lib/fatfs/diskio.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,141 @@ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2017        */ | ||||
| /*                                                                       */ | ||||
| /*   Portions COPYRIGHT 2017 STMicroelectronics                          */ | ||||
| /*   Portions Copyright (C) 2017, ChaN, all right reserved               */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| /* If a working storage control module is available, it should be        */ | ||||
| /* attached to the FatFs via a glue function rather than modifying it.   */ | ||||
| /* This is an example of glue functions to attach various existing      */ | ||||
| /* storage control modules to the FatFs module with a defined API.       */ | ||||
| /*-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "diskio.h" | ||||
| #include "ff_gen_drv.h" | ||||
| 
 | ||||
| #if defined ( __GNUC__ ) | ||||
| #ifndef __weak | ||||
| #define __weak __attribute__((weak)) | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| extern Disk_drvTypeDef  disk; | ||||
| 
 | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Gets Disk Status | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @retval DSTATUS: Operation status | ||||
|   */ | ||||
| DSTATUS disk_status ( | ||||
| 	BYTE pdrv		/* Physical drive number to identify the drive */ | ||||
| ) | ||||
| { | ||||
|   DSTATUS stat; | ||||
| 
 | ||||
|   stat = disk.drv[pdrv]->disk_status(disk.lun[pdrv]); | ||||
|   return stat; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Initializes a Drive | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @retval DSTATUS: Operation status | ||||
|   */ | ||||
| DSTATUS disk_initialize ( | ||||
| 	BYTE pdrv				/* Physical drive nmuber to identify the drive */ | ||||
| ) | ||||
| { | ||||
|   DSTATUS stat = RES_OK; | ||||
| 
 | ||||
|   if(disk.is_initialized[pdrv] == 0) | ||||
|   { | ||||
|     disk.is_initialized[pdrv] = 1; | ||||
|     stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]); | ||||
|   } | ||||
|   return stat; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Reads Sector(s) | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @param  *buff: Data buffer to store read data | ||||
|   * @param  sector: Sector address (LBA) | ||||
|   * @param  count: Number of sectors to read (1..128) | ||||
|   * @retval DRESULT: Operation result | ||||
|   */ | ||||
| DRESULT disk_read ( | ||||
| 	BYTE pdrv,		/* Physical drive nmuber to identify the drive */ | ||||
| 	BYTE *buff,		/* Data buffer to store read data */ | ||||
| 	DWORD sector,	        /* Sector address in LBA */ | ||||
| 	UINT count		/* Number of sectors to read */ | ||||
| ) | ||||
| { | ||||
|   DRESULT res; | ||||
| 
 | ||||
|   res = disk.drv[pdrv]->disk_read(disk.lun[pdrv], buff, sector, count); | ||||
|   return res; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Writes Sector(s) | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @param  *buff: Data to be written | ||||
|   * @param  sector: Sector address (LBA) | ||||
|   * @param  count: Number of sectors to write (1..128) | ||||
|   * @retval DRESULT: Operation result | ||||
|   */ | ||||
| #if _USE_WRITE == 1 | ||||
| DRESULT disk_write ( | ||||
| 	BYTE pdrv,		/* Physical drive nmuber to identify the drive */ | ||||
| 	const BYTE *buff,	/* Data to be written */ | ||||
| 	DWORD sector,		/* Sector address in LBA */ | ||||
| 	UINT count        	/* Number of sectors to write */ | ||||
| ) | ||||
| { | ||||
|   DRESULT res; | ||||
| 
 | ||||
|   res = disk.drv[pdrv]->disk_write(disk.lun[pdrv], buff, sector, count); | ||||
|   return res; | ||||
| } | ||||
| #endif /* _USE_WRITE == 1 */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  I/O control operation | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @param  cmd: Control code | ||||
|   * @param  *buff: Buffer to send/receive control data | ||||
|   * @retval DRESULT: Operation result | ||||
|   */ | ||||
| #if _USE_IOCTL == 1 | ||||
| DRESULT disk_ioctl ( | ||||
| 	BYTE pdrv,		/* Physical drive nmuber (0..) */ | ||||
| 	BYTE cmd,		/* Control code */ | ||||
| 	void *buff		/* Buffer to send/receive control data */ | ||||
| ) | ||||
| { | ||||
|   DRESULT res; | ||||
| 
 | ||||
|   res = disk.drv[pdrv]->disk_ioctl(disk.lun[pdrv], cmd, buff); | ||||
|   return res; | ||||
| } | ||||
| #endif /* _USE_IOCTL == 1 */ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Gets Time from RTC | ||||
|   * @param  None | ||||
|   * @retval Time in DWORD | ||||
|   */ | ||||
| __weak DWORD get_fattime (void) | ||||
| { | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| 
 | ||||
							
								
								
									
										80
									
								
								lib/fatfs/diskio.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								lib/fatfs/diskio.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,80 @@ | ||||
| /*-----------------------------------------------------------------------/
 | ||||
| /  Low level disk interface modlue include file   (C)ChaN, 2014          / | ||||
| /-----------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #ifndef _DISKIO_DEFINED | ||||
| #define _DISKIO_DEFINED | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #define _USE_WRITE	1	/* 1: Enable disk_write function */ | ||||
| #define _USE_IOCTL	1	/* 1: Enable disk_ioctl function */ | ||||
| 
 | ||||
| #include "integer.h" | ||||
| 
 | ||||
| 
 | ||||
| /* Status of Disk Functions */ | ||||
| typedef BYTE	DSTATUS; | ||||
| 
 | ||||
| /* Results of Disk Functions */ | ||||
| typedef enum { | ||||
| 	RES_OK = 0,		/* 0: Successful */ | ||||
| 	RES_ERROR,		/* 1: R/W Error */ | ||||
| 	RES_WRPRT,		/* 2: Write Protected */ | ||||
| 	RES_NOTRDY,		/* 3: Not Ready */ | ||||
| 	RES_PARERR		/* 4: Invalid Parameter */ | ||||
| } DRESULT; | ||||
| 
 | ||||
| 
 | ||||
| /*---------------------------------------*/ | ||||
| /* Prototypes for disk control functions */ | ||||
| 
 | ||||
| 
 | ||||
| DSTATUS disk_initialize (BYTE pdrv); | ||||
| DSTATUS disk_status (BYTE pdrv); | ||||
| DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count); | ||||
| DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); | ||||
| DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); | ||||
| DWORD get_fattime (void); | ||||
| 
 | ||||
| /* Disk Status Bits (DSTATUS) */ | ||||
| 
 | ||||
| #define STA_NOINIT		0x01	/* Drive not initialized */ | ||||
| #define STA_NODISK		0x02	/* No medium in the drive */ | ||||
| #define STA_PROTECT		0x04	/* Write protected */ | ||||
| 
 | ||||
| 
 | ||||
| /* Command code for disk_ioctrl fucntion */ | ||||
| 
 | ||||
| /* Generic command (Used by FatFs) */ | ||||
| #define CTRL_SYNC		0	/* Complete pending write process (needed at _FS_READONLY == 0) */ | ||||
| #define GET_SECTOR_COUNT	1	/* Get media size (needed at _USE_MKFS == 1) */ | ||||
| #define GET_SECTOR_SIZE		2	/* Get sector size (needed at _MAX_SS != _MIN_SS) */ | ||||
| #define GET_BLOCK_SIZE		3	/* Get erase block size (needed at _USE_MKFS == 1) */ | ||||
| #define CTRL_TRIM		4	/* Inform device that the data on the block of sectors is no longer used (needed at _USE_TRIM == 1) */ | ||||
| 
 | ||||
| /* Generic command (Not used by FatFs) */ | ||||
| #define CTRL_POWER			5	/* Get/Set power status */ | ||||
| #define CTRL_LOCK			6	/* Lock/Unlock media removal */ | ||||
| #define CTRL_EJECT			7	/* Eject media */ | ||||
| #define CTRL_FORMAT			8	/* Create physical format on the media */ | ||||
| 
 | ||||
| /* MMC/SDC specific ioctl command */ | ||||
| #define MMC_GET_TYPE		10	/* Get card type */ | ||||
| #define MMC_GET_CSD			11	/* Get CSD */ | ||||
| #define MMC_GET_CID			12	/* Get CID */ | ||||
| #define MMC_GET_OCR			13	/* Get OCR */ | ||||
| #define MMC_GET_SDSTAT		14	/* Get SD status */ | ||||
| 
 | ||||
| /* ATA/CF specific ioctl command */ | ||||
| #define ATA_GET_REV			20	/* Get F/W revision */ | ||||
| #define ATA_GET_MODEL		21	/* Get model name */ | ||||
| #define ATA_GET_SN			22	/* Get serial number */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										6140
									
								
								lib/fatfs/ff.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6140
									
								
								lib/fatfs/ff.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										361
									
								
								lib/fatfs/ff.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										361
									
								
								lib/fatfs/ff.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,361 @@ | ||||
| /*----------------------------------------------------------------------------/
 | ||||
| /  FatFs - Generic FAT file system module  R0.12c                             / | ||||
| /-----------------------------------------------------------------------------/ | ||||
| / | ||||
| / Copyright (C) 2017, ChaN, all right reserved. | ||||
| / | ||||
| / FatFs module is an open source software. Redistribution and use of FatFs in | ||||
| / source and binary forms, with or without modification, are permitted provided | ||||
| / that the following condition is met: | ||||
| 
 | ||||
| / 1. Redistributions of source code must retain the above copyright notice, | ||||
| /    this condition and the following disclaimer. | ||||
| / | ||||
| / This software is provided by the copyright holder and contributors "AS IS" | ||||
| / and any warranties related to this software are DISCLAIMED. | ||||
| / The copyright owner or contributors be NOT LIABLE for any damages caused | ||||
| / by use of this software. | ||||
| /----------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| #ifndef _FATFS | ||||
| #define _FATFS	68300	/* Revision ID */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #include "integer.h"	/* Basic integer types */ | ||||
| #include "ffconf.h"		/* FatFs configuration options */ | ||||
| 
 | ||||
| #if _FATFS != _FFCONF | ||||
| #error Wrong configuration file (ffconf.h). | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* Definitions of volume management */ | ||||
| 
 | ||||
| #if _MULTI_PARTITION		/* Multiple partition configuration */ | ||||
| typedef struct { | ||||
| 	BYTE pd;	/* Physical drive number */ | ||||
| 	BYTE pt;	/* Partition: 0:Auto detect, 1-4:Forced partition) */ | ||||
| } PARTITION; | ||||
| extern PARTITION VolToPart[];	/* Volume - Partition resolution table */ | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* Type of path name strings on FatFs API */ | ||||
| 
 | ||||
| #if _LFN_UNICODE			/* Unicode (UTF-16) string */ | ||||
| #if _USE_LFN == 0 | ||||
| #error _LFN_UNICODE must be 0 at non-LFN cfg. | ||||
| #endif | ||||
| #ifndef _INC_TCHAR | ||||
| typedef WCHAR TCHAR; | ||||
| #define _T(x) L ## x | ||||
| #define _TEXT(x) L ## x | ||||
| #endif | ||||
| #else						/* ANSI/OEM string */ | ||||
| #ifndef _INC_TCHAR | ||||
| typedef char TCHAR; | ||||
| #define _T(x) x | ||||
| #define _TEXT(x) x | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* Type of file size variables */ | ||||
| 
 | ||||
| #if _FS_EXFAT | ||||
| #if _USE_LFN == 0 | ||||
| #error LFN must be enabled when enable exFAT | ||||
| #endif | ||||
| typedef QWORD FSIZE_t; | ||||
| #else | ||||
| typedef DWORD FSIZE_t; | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* File system object structure (FATFS) */ | ||||
| 
 | ||||
| typedef struct { | ||||
| 	BYTE	fs_type;		/* File system type (0:N/A) */ | ||||
| 	BYTE	drv;			/* Physical drive number */ | ||||
| 	BYTE	n_fats;			/* Number of FATs (1 or 2) */ | ||||
| 	BYTE	wflag;			/* win[] flag (b0:dirty) */ | ||||
| 	BYTE	fsi_flag;		/* FSINFO flags (b7:disabled, b0:dirty) */ | ||||
| 	WORD	id;				/* File system mount ID */ | ||||
| 	WORD	n_rootdir;		/* Number of root directory entries (FAT12/16) */ | ||||
| 	WORD	csize;			/* Cluster size [sectors] */ | ||||
| #if _MAX_SS != _MIN_SS | ||||
| 	WORD	ssize;			/* Sector size (512, 1024, 2048 or 4096) */ | ||||
| #endif | ||||
| #if _USE_LFN != 0 | ||||
| 	WCHAR*	lfnbuf;			/* LFN working buffer */ | ||||
| #endif | ||||
| #if _FS_EXFAT | ||||
| 	BYTE*	dirbuf;			/* Directory entry block scratchpad buffer */ | ||||
| #endif | ||||
| #if _FS_REENTRANT | ||||
| 	_SYNC_t	sobj;			/* Identifier of sync object */ | ||||
| #endif | ||||
| #if !_FS_READONLY | ||||
| 	DWORD	last_clst;		/* Last allocated cluster */ | ||||
| 	DWORD	free_clst;		/* Number of free clusters */ | ||||
| #endif | ||||
| #if _FS_RPATH != 0 | ||||
| 	DWORD	cdir;			/* Current directory start cluster (0:root) */ | ||||
| #if _FS_EXFAT | ||||
| 	DWORD	cdc_scl;		/* Containing directory start cluster (invalid when cdir is 0) */ | ||||
| 	DWORD	cdc_size;		/* b31-b8:Size of containing directory, b7-b0: Chain status */ | ||||
| 	DWORD	cdc_ofs;		/* Offset in the containing directory (invalid when cdir is 0) */ | ||||
| #endif | ||||
| #endif | ||||
| 	DWORD	n_fatent;		/* Number of FAT entries (number of clusters + 2) */ | ||||
| 	DWORD	fsize;			/* Size of an FAT [sectors] */ | ||||
| 	DWORD	volbase;		/* Volume base sector */ | ||||
| 	DWORD	fatbase;		/* FAT base sector */ | ||||
| 	DWORD	dirbase;		/* Root directory base sector/cluster */ | ||||
| 	DWORD	database;		/* Data base sector */ | ||||
| 	DWORD	winsect;		/* Current sector appearing in the win[] */ | ||||
| 	BYTE	win[_MAX_SS];	/* Disk access window for Directory, FAT (and file data at tiny cfg) */ | ||||
| } FATFS; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* Object ID and allocation information (_FDID) */ | ||||
| 
 | ||||
| typedef struct { | ||||
| 	FATFS*	fs;			/* Pointer to the owner file system object */ | ||||
| 	WORD	id;			/* Owner file system mount ID */ | ||||
| 	BYTE	attr;		/* Object attribute */ | ||||
| 	BYTE	stat;		/* Object chain status (b1-0: =0:not contiguous, =2:contiguous (no data on FAT), =3:flagmented in this session, b2:sub-directory stretched) */ | ||||
| 	DWORD	sclust;		/* Object start cluster (0:no cluster or root directory) */ | ||||
| 	FSIZE_t	objsize;	/* Object size (valid when sclust != 0) */ | ||||
| #if _FS_EXFAT | ||||
| 	DWORD	n_cont;		/* Size of first fragment, clusters - 1 (valid when stat == 3) */ | ||||
| 	DWORD	n_frag;		/* Size of last fragment needs to be written (valid when not zero) */ | ||||
| 	DWORD	c_scl;		/* Containing directory start cluster (valid when sclust != 0) */ | ||||
| 	DWORD	c_size;		/* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */ | ||||
| 	DWORD	c_ofs;		/* Offset in the containing directory (valid when sclust != 0 and non-directory object) */ | ||||
| #endif | ||||
| #if _FS_LOCK != 0 | ||||
| 	UINT	lockid;		/* File lock ID origin from 1 (index of file semaphore table Files[]) */ | ||||
| #endif | ||||
| } _FDID; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* File object structure (FIL) */ | ||||
| 
 | ||||
| typedef struct { | ||||
| 	_FDID	obj;			/* Object identifier (must be the 1st member to detect invalid object pointer) */ | ||||
| 	BYTE	flag;			/* File status flags */ | ||||
| 	BYTE	err;			/* Abort flag (error code) */ | ||||
| 	FSIZE_t	fptr;			/* File read/write pointer (Zeroed on file open) */ | ||||
| 	DWORD	clust;			/* Current cluster of fpter (invalid when fptr is 0) */ | ||||
| 	DWORD	sect;			/* Sector number appearing in buf[] (0:invalid) */ | ||||
| #if !_FS_READONLY | ||||
| 	DWORD	dir_sect;		/* Sector number containing the directory entry */ | ||||
| 	BYTE*	dir_ptr;		/* Pointer to the directory entry in the win[] */ | ||||
| #endif | ||||
| #if _USE_FASTSEEK | ||||
| 	DWORD*	cltbl;			/* Pointer to the cluster link map table (nulled on open, set by application) */ | ||||
| #endif | ||||
| #if !_FS_TINY | ||||
| 	BYTE	buf[_MAX_SS];	/* File private data read/write window */ | ||||
| #endif | ||||
| } FIL; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* Directory object structure (DIR) */ | ||||
| 
 | ||||
| typedef struct { | ||||
| 	_FDID	obj;			/* Object identifier */ | ||||
| 	DWORD	dptr;			/* Current read/write offset */ | ||||
| 	DWORD	clust;			/* Current cluster */ | ||||
| 	DWORD	sect;			/* Current sector (0:Read operation has terminated) */ | ||||
| 	BYTE*	dir;			/* Pointer to the directory item in the win[] */ | ||||
| 	BYTE	fn[12];			/* SFN (in/out) {body[8],ext[3],status[1]} */ | ||||
| #if _USE_LFN != 0 | ||||
| 	DWORD	blk_ofs;		/* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */ | ||||
| #endif | ||||
| #if _USE_FIND | ||||
| 	const TCHAR* pat;		/* Pointer to the name matching pattern */ | ||||
| #endif | ||||
| } DIR; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* File information structure (FILINFO) */ | ||||
| 
 | ||||
| typedef struct { | ||||
| 	FSIZE_t	fsize;			/* File size */ | ||||
| 	WORD	fdate;			/* Modified date */ | ||||
| 	WORD	ftime;			/* Modified time */ | ||||
| 	BYTE	fattrib;		/* File attribute */ | ||||
| #if _USE_LFN != 0 | ||||
| 	TCHAR	altname[13];			/* Alternative file name */ | ||||
| 	TCHAR	fname[_MAX_LFN + 1];	/* Primary file name */ | ||||
| #else | ||||
| 	TCHAR	fname[13];		/* File name */ | ||||
| #endif | ||||
| } FILINFO; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* File function return code (FRESULT) */ | ||||
| 
 | ||||
| typedef enum { | ||||
| 	FR_OK = 0,				/* (0) Succeeded */ | ||||
| 	FR_DISK_ERR,			/* (1) A hard error occurred in the low level disk I/O layer */ | ||||
| 	FR_INT_ERR,				/* (2) Assertion failed */ | ||||
| 	FR_NOT_READY,			/* (3) The physical drive cannot work */ | ||||
| 	FR_NO_FILE,				/* (4) Could not find the file */ | ||||
| 	FR_NO_PATH,				/* (5) Could not find the path */ | ||||
| 	FR_INVALID_NAME,		/* (6) The path name format is invalid */ | ||||
| 	FR_DENIED,				/* (7) Access denied due to prohibited access or directory full */ | ||||
| 	FR_EXIST,				/* (8) Access denied due to prohibited access */ | ||||
| 	FR_INVALID_OBJECT,		/* (9) The file/directory object is invalid */ | ||||
| 	FR_WRITE_PROTECTED,		/* (10) The physical drive is write protected */ | ||||
| 	FR_INVALID_DRIVE,		/* (11) The logical drive number is invalid */ | ||||
| 	FR_NOT_ENABLED,			/* (12) The volume has no work area */ | ||||
| 	FR_NO_FILESYSTEM,		/* (13) There is no valid FAT volume */ | ||||
| 	FR_MKFS_ABORTED,		/* (14) The f_mkfs() aborted due to any problem */ | ||||
| 	FR_TIMEOUT,				/* (15) Could not get a grant to access the volume within defined period */ | ||||
| 	FR_LOCKED,				/* (16) The operation is rejected according to the file sharing policy */ | ||||
| 	FR_NOT_ENOUGH_CORE,		/* (17) LFN working buffer could not be allocated */ | ||||
| 	FR_TOO_MANY_OPEN_FILES,	/* (18) Number of open files > _FS_LOCK */ | ||||
| 	FR_INVALID_PARAMETER	/* (19) Given parameter is invalid */ | ||||
| } FRESULT; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*--------------------------------------------------------------*/ | ||||
| /* FatFs module application interface                           */ | ||||
| 
 | ||||
| FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode);				/* Open or create a file */ | ||||
| FRESULT f_close (FIL* fp);											/* Close an open file object */ | ||||
| FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br);			/* Read data from the file */ | ||||
| FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw);	/* Write data to the file */ | ||||
| FRESULT f_lseek (FIL* fp, FSIZE_t ofs);								/* Move file pointer of the file object */ | ||||
| FRESULT f_truncate (FIL* fp);										/* Truncate the file */ | ||||
| FRESULT f_sync (FIL* fp);											/* Flush cached data of the writing file */ | ||||
| FRESULT f_opendir (DIR* dp, const TCHAR* path);						/* Open a directory */ | ||||
| FRESULT f_closedir (DIR* dp);										/* Close an open directory */ | ||||
| FRESULT f_readdir (DIR* dp, FILINFO* fno);							/* Read a directory item */ | ||||
| FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern);	/* Find first file */ | ||||
| FRESULT f_findnext (DIR* dp, FILINFO* fno);							/* Find next file */ | ||||
| FRESULT f_mkdir (const TCHAR* path);								/* Create a sub directory */ | ||||
| FRESULT f_unlink (const TCHAR* path);								/* Delete an existing file or directory */ | ||||
| FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new);	/* Rename/Move a file or directory */ | ||||
| FRESULT f_stat (const TCHAR* path, FILINFO* fno);					/* Get file status */ | ||||
| FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask);			/* Change attribute of a file/dir */ | ||||
| FRESULT f_utime (const TCHAR* path, const FILINFO* fno);			/* Change timestamp of a file/dir */ | ||||
| FRESULT f_chdir (const TCHAR* path);								/* Change current directory */ | ||||
| FRESULT f_chdrive (const TCHAR* path);								/* Change current drive */ | ||||
| FRESULT f_getcwd (TCHAR* buff, UINT len);							/* Get current directory */ | ||||
| FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs);	/* Get number of free clusters on the drive */ | ||||
| FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn);	/* Get volume label */ | ||||
| FRESULT f_setlabel (const TCHAR* label);							/* Set volume label */ | ||||
| FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf);	/* Forward data to the stream */ | ||||
| FRESULT f_expand (FIL* fp, FSIZE_t szf, BYTE opt);					/* Allocate a contiguous block to the file */ | ||||
| FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt);			/* Mount/Unmount a logical drive */ | ||||
| FRESULT f_mkfs (const TCHAR* path, BYTE opt, DWORD au, void* work, UINT len);	/* Create a FAT volume */ | ||||
| FRESULT f_fdisk (BYTE pdrv, const DWORD* szt, void* work);			/* Divide a physical drive into some partitions */ | ||||
| int f_putc (TCHAR c, FIL* fp);										/* Put a character to the file */ | ||||
| int f_puts (const TCHAR* str, FIL* cp);								/* Put a string to the file */ | ||||
| int f_printf (FIL* fp, const TCHAR* str, ...);						/* Put a formatted string to the file */ | ||||
| TCHAR* f_gets (TCHAR* buff, int len, FIL* fp);						/* Get a string from the file */ | ||||
| 
 | ||||
| #define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize)) | ||||
| #define f_error(fp) ((fp)->err) | ||||
| #define f_tell(fp) ((fp)->fptr) | ||||
| #define f_size(fp) ((fp)->obj.objsize) | ||||
| #define f_rewind(fp) f_lseek((fp), 0) | ||||
| #define f_rewinddir(dp) f_readdir((dp), 0) | ||||
| #define f_rmdir(path) f_unlink(path) | ||||
| 
 | ||||
| #ifndef EOF | ||||
| #define EOF (-1) | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*--------------------------------------------------------------*/ | ||||
| /* Additional user defined functions                            */ | ||||
| 
 | ||||
| /* RTC function */ | ||||
| #if !_FS_READONLY && !_FS_NORTC | ||||
| DWORD get_fattime (void); | ||||
| #endif | ||||
| 
 | ||||
| /* Unicode support functions */ | ||||
| #if _USE_LFN != 0						/* Unicode - OEM code conversion */ | ||||
| WCHAR ff_convert (WCHAR chr, UINT dir);	/* OEM-Unicode bidirectional conversion */ | ||||
| WCHAR ff_wtoupper (WCHAR chr);			/* Unicode upper-case conversion */ | ||||
| #if _USE_LFN == 3						/* Memory functions */ | ||||
| void* ff_memalloc (UINT msize);			/* Allocate memory block */ | ||||
| void ff_memfree (void* mblock);			/* Free memory block */ | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| /* Sync functions */ | ||||
| #if _FS_REENTRANT | ||||
| int ff_cre_syncobj (BYTE vol, _SYNC_t* sobj);	/* Create a sync object */ | ||||
| int ff_req_grant (_SYNC_t sobj);				/* Lock sync object */ | ||||
| void ff_rel_grant (_SYNC_t sobj);				/* Unlock sync object */ | ||||
| int ff_del_syncobj (_SYNC_t sobj);				/* Delete a sync object */ | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*--------------------------------------------------------------*/ | ||||
| /* Flags and offset address                                     */ | ||||
| 
 | ||||
| 
 | ||||
| /* File access mode and open method flags (3rd argument of f_open) */ | ||||
| #define	FA_READ				0x01 | ||||
| #define	FA_WRITE			0x02 | ||||
| #define	FA_OPEN_EXISTING	0x00 | ||||
| #define	FA_CREATE_NEW		0x04 | ||||
| #define	FA_CREATE_ALWAYS	0x08 | ||||
| #define	FA_OPEN_ALWAYS		0x10 | ||||
| #define	FA_OPEN_APPEND		0x30 | ||||
| 
 | ||||
| /* Fast seek controls (2nd argument of f_lseek) */ | ||||
| #define CREATE_LINKMAP	((FSIZE_t)0 - 1) | ||||
| 
 | ||||
| /* Format options (2nd argument of f_mkfs) */ | ||||
| #define FM_FAT		0x01 | ||||
| #define FM_FAT32	0x02 | ||||
| #define FM_EXFAT	0x04 | ||||
| #define FM_ANY		0x07 | ||||
| #define FM_SFD		0x08 | ||||
| 
 | ||||
| /* Filesystem type (FATFS.fs_type) */ | ||||
| #define FS_FAT12	1 | ||||
| #define FS_FAT16	2 | ||||
| #define FS_FAT32	3 | ||||
| #define FS_EXFAT	4 | ||||
| 
 | ||||
| /* File attribute bits for directory entry (FILINFO.fattrib) */ | ||||
| #define	AM_RDO	0x01	/* Read only */ | ||||
| #define	AM_HID	0x02	/* Hidden */ | ||||
| #define	AM_SYS	0x04	/* System */ | ||||
| #define AM_DIR	0x10	/* Directory */ | ||||
| #define AM_ARC	0x20	/* Archive */ | ||||
| 
 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* _FATFS */ | ||||
							
								
								
									
										122
									
								
								lib/fatfs/ff_gen_drv.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								lib/fatfs/ff_gen_drv.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,122 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    ff_gen_drv.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   FatFs generic low level driver. | ||||
|   ***************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. All rights reserved. | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                       opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
| **/ | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "ff_gen_drv.h" | ||||
| 
 | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| Disk_drvTypeDef disk = {{0},{0},{0},0}; | ||||
| 
 | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Links a compatible diskio driver/lun id and increments the number of active | ||||
|   *         linked drivers. | ||||
|   * @note   The number of linked drivers (volumes) is up to 10 due to FatFs limits. | ||||
|   * @param  drv: pointer to the disk IO Driver structure | ||||
|   * @param  path: pointer to the logical drive path | ||||
|   * @param  lun : only used for USB Key Disk to add multi-lun management | ||||
|             else the parameter must be equal to 0 | ||||
|   * @retval Returns 0 in case of success, otherwise 1. | ||||
|   */ | ||||
| uint8_t FATFS_LinkDriverEx(const Diskio_drvTypeDef *drv, char *path, uint8_t lun) | ||||
| { | ||||
|   uint8_t ret = 1; | ||||
|   uint8_t DiskNum = 0; | ||||
| 
 | ||||
|   if(disk.nbr < _VOLUMES) | ||||
|   { | ||||
|     disk.is_initialized[disk.nbr] = 0; | ||||
|     disk.drv[disk.nbr] = drv; | ||||
|     disk.lun[disk.nbr] = lun; | ||||
|     DiskNum = disk.nbr++; | ||||
|     path[0] = DiskNum + '0'; | ||||
|     path[1] = ':'; | ||||
|     path[2] = '/'; | ||||
|     path[3] = 0; | ||||
|     ret = 0; | ||||
|   } | ||||
| 
 | ||||
|   return ret; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Links a compatible diskio driver and increments the number of active | ||||
|   *         linked drivers. | ||||
|   * @note   The number of linked drivers (volumes) is up to 10 due to FatFs limits | ||||
|   * @param  drv: pointer to the disk IO Driver structure | ||||
|   * @param  path: pointer to the logical drive path | ||||
|   * @retval Returns 0 in case of success, otherwise 1. | ||||
|   */ | ||||
| uint8_t FATFS_LinkDriver(const Diskio_drvTypeDef *drv, char *path) | ||||
| { | ||||
|   return FATFS_LinkDriverEx(drv, path, 0); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Unlinks a diskio driver and decrements the number of active linked | ||||
|   *         drivers. | ||||
|   * @param  path: pointer to the logical drive path | ||||
|   * @param  lun : not used | ||||
|   * @retval Returns 0 in case of success, otherwise 1. | ||||
|   */ | ||||
| uint8_t FATFS_UnLinkDriverEx(char *path, uint8_t lun) | ||||
| { | ||||
|   uint8_t DiskNum = 0; | ||||
|   uint8_t ret = 1; | ||||
| 
 | ||||
|   if(disk.nbr >= 1) | ||||
|   { | ||||
|     DiskNum = path[0] - '0'; | ||||
|     if(disk.drv[DiskNum] != 0) | ||||
|     { | ||||
|       disk.drv[DiskNum] = 0; | ||||
|       disk.lun[DiskNum] = 0; | ||||
|       disk.nbr--; | ||||
|       ret = 0; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return ret; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Unlinks a diskio driver and decrements the number of active linked | ||||
|   *         drivers. | ||||
|   * @param  path: pointer to the logical drive path | ||||
|   * @retval Returns 0 in case of success, otherwise 1. | ||||
|   */ | ||||
| uint8_t FATFS_UnLinkDriver(char *path) | ||||
| { | ||||
|   return FATFS_UnLinkDriverEx(path, 0); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Gets number of linked drivers to the FatFs module. | ||||
|   * @param  None | ||||
|   * @retval Number of attached drivers. | ||||
|   */ | ||||
| uint8_t FATFS_GetAttachedDriversNbr(void) | ||||
| { | ||||
|   return disk.nbr; | ||||
| } | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| 
 | ||||
							
								
								
									
										80
									
								
								lib/fatfs/ff_gen_drv.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								lib/fatfs/ff_gen_drv.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,80 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    ff_gen_drv.h | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   Header for ff_gen_drv.c module. | ||||
|   ***************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. All rights reserved. | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                       opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
| **/ | ||||
| 
 | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __FF_GEN_DRV_H | ||||
| #define __FF_GEN_DRV_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "diskio.h" | ||||
| #include "ff.h" | ||||
| #include "stdint.h" | ||||
| 
 | ||||
| 
 | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Disk IO Driver structure definition | ||||
|   */ | ||||
| typedef struct | ||||
| { | ||||
|   DSTATUS (*disk_initialize) (BYTE);                     /*!< Initialize Disk Drive                     */ | ||||
|   DSTATUS (*disk_status)     (BYTE);                     /*!< Get Disk Status                           */ | ||||
|   DRESULT (*disk_read)       (BYTE, BYTE*, DWORD, UINT);       /*!< Read Sector(s)                            */ | ||||
| #if _USE_WRITE == 1 | ||||
|   DRESULT (*disk_write)      (BYTE, const BYTE*, DWORD, UINT); /*!< Write Sector(s) when _USE_WRITE = 0       */ | ||||
| #endif /* _USE_WRITE == 1 */ | ||||
| #if _USE_IOCTL == 1 | ||||
|   DRESULT (*disk_ioctl)      (BYTE, BYTE, void*);              /*!< I/O control operation when _USE_IOCTL = 1 */ | ||||
| #endif /* _USE_IOCTL == 1 */ | ||||
| 
 | ||||
| }Diskio_drvTypeDef; | ||||
| 
 | ||||
| /**
 | ||||
|   * @brief  Global Disk IO Drivers structure definition | ||||
|   */ | ||||
| typedef struct | ||||
| { | ||||
|   uint8_t                 is_initialized[_VOLUMES]; | ||||
|   const Diskio_drvTypeDef *drv[_VOLUMES]; | ||||
|   uint8_t                 lun[_VOLUMES]; | ||||
|   volatile uint8_t        nbr; | ||||
| 
 | ||||
| }Disk_drvTypeDef; | ||||
| 
 | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /* Exported macro ------------------------------------------------------------*/ | ||||
| /* Exported functions ------------------------------------------------------- */ | ||||
| uint8_t FATFS_LinkDriver(const Diskio_drvTypeDef *drv, char *path); | ||||
| uint8_t FATFS_UnLinkDriver(char *path); | ||||
| uint8_t FATFS_LinkDriverEx(const Diskio_drvTypeDef *drv, char *path, BYTE lun); | ||||
| uint8_t FATFS_UnLinkDriverEx(char *path, BYTE lun); | ||||
| uint8_t FATFS_GetAttachedDriversNbr(void); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __FF_GEN_DRV_H */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| 
 | ||||
							
								
								
									
										303
									
								
								lib/fatfs/ffconf_template.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										303
									
								
								lib/fatfs/ffconf_template.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,303 @@ | ||||
| /*----------------------------------------------------------------------------/
 | ||||
| /  FatFs - Generic FAT file system module  R0.12c                             / | ||||
| /-----------------------------------------------------------------------------/ | ||||
| / | ||||
| / Copyright (C) 2017, ChaN, all right reserved. | ||||
| / Portions Copyright (C) STMicroelectronics, all right reserved. | ||||
| / | ||||
| / FatFs module is an open source software. Redistribution and use of FatFs in | ||||
| / source and binary forms, with or without modification, are permitted provided | ||||
| / that the following condition is met: | ||||
| 
 | ||||
| / 1. Redistributions of source code must retain the above copyright notice, | ||||
| /    this condition and the following disclaimer. | ||||
| / | ||||
| / This software is provided by the copyright holder and contributors "AS IS" | ||||
| / and any warranties related to this software are DISCLAIMED. | ||||
| / The copyright owner or contributors be NOT LIABLE for any damages caused | ||||
| / by use of this software. | ||||
| /----------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| /  FatFs - FAT file system module configuration file | ||||
| /---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _FFCONF 68300	/* Revision ID */ | ||||
| 
 | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| / Function Configurations | ||||
| /---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _FS_READONLY	0 | ||||
| /* This option switches read-only configuration. (0:Read/Write or 1:Read-only)
 | ||||
| /  Read-only configuration removes writing API functions, f_write(), f_sync(), | ||||
| /  f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() | ||||
| /  and optional writing functions as well. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _FS_MINIMIZE	0 | ||||
| /* This option defines minimization level to remove some basic API functions.
 | ||||
| / | ||||
| /   0: All basic functions are enabled. | ||||
| /   1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() | ||||
| /      are removed. | ||||
| /   2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. | ||||
| /   3: f_lseek() function is removed in addition to 2. */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_USE_STRFUNC	0 | ||||
| /* This option switches string functions, f_gets(), f_putc(), f_puts() and
 | ||||
| /  f_printf(). | ||||
| / | ||||
| /  0: Disable string functions. | ||||
| /  1: Enable without LF-CRLF conversion. | ||||
| /  2: Enable with LF-CRLF conversion. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _USE_FIND		0 | ||||
| /* This option switches filtered directory read functions, f_findfirst() and
 | ||||
| /  f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_USE_MKFS		1 | ||||
| /* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_USE_FASTSEEK	1 | ||||
| /* This option switches fast seek function. (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_USE_EXPAND		0 | ||||
| /* This option switches f_expand function. (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| 
 | ||||
| #define _USE_CHMOD		0 | ||||
| /* This option switches attribute manipulation functions, f_chmod() and f_utime().
 | ||||
| /  (0:Disable or 1:Enable) Also _FS_READONLY needs to be 0 to enable this option. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _USE_LABEL		0 | ||||
| /* This option switches volume label functions, f_getlabel() and f_setlabel().
 | ||||
| /  (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_USE_FORWARD	0 | ||||
| /* This option switches f_forward() function. (0:Disable or 1:Enable) */ | ||||
| 
 | ||||
| 
 | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| / Locale and Namespace Configurations | ||||
| /---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _CODE_PAGE	850 | ||||
| /* This option specifies the OEM code page to be used on the target system.
 | ||||
| /  Incorrect setting of the code page can cause a file open failure. | ||||
| / | ||||
| /   1   - ASCII (No extended character. Non-LFN cfg. only) | ||||
| /   437 - U.S. | ||||
| /   720 - Arabic | ||||
| /   737 - Greek | ||||
| /   771 - KBL | ||||
| /   775 - Baltic | ||||
| /   850 - Latin 1 | ||||
| /   852 - Latin 2 | ||||
| /   855 - Cyrillic | ||||
| /   857 - Turkish | ||||
| /   860 - Portuguese | ||||
| /   861 - Icelandic | ||||
| /   862 - Hebrew | ||||
| /   863 - Canadian French | ||||
| /   864 - Arabic | ||||
| /   865 - Nordic | ||||
| /   866 - Russian | ||||
| /   869 - Greek 2 | ||||
| /   932 - Japanese (DBCS) | ||||
| /   936 - Simplified Chinese (DBCS) | ||||
| /   949 - Korean (DBCS) | ||||
| /   950 - Traditional Chinese (DBCS) | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_USE_LFN	3 | ||||
| #define	_MAX_LFN	255 | ||||
| /* The _USE_LFN switches the support of long file name (LFN).
 | ||||
| / | ||||
| /   0: Disable support of LFN. _MAX_LFN has no effect. | ||||
| /   1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. | ||||
| /   2: Enable LFN with dynamic working buffer on the STACK. | ||||
| /   3: Enable LFN with dynamic working buffer on the HEAP. | ||||
| / | ||||
| /  To enable the LFN, Unicode handling functions (option/unicode.c) must be added | ||||
| /  to the project. The working buffer occupies (_MAX_LFN + 1) * 2 bytes and | ||||
| /  additional 608 bytes at exFAT enabled. _MAX_LFN can be in range from 12 to 255. | ||||
| /  It should be set 255 to support full featured LFN operations. | ||||
| /  When use stack for the working buffer, take care on stack overflow. When use heap | ||||
| /  memory for the working buffer, memory management functions, ff_memalloc() and | ||||
| /  ff_memfree(), must be added to the project. */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_LFN_UNICODE	0 | ||||
| /* This option switches character encoding on the API. (0:ANSI/OEM or 1:UTF-16)
 | ||||
| /  To use Unicode string for the path name, enable LFN and set _LFN_UNICODE = 1. | ||||
| /  This option also affects behavior of string I/O functions. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _STRF_ENCODE	3 | ||||
| /* When _LFN_UNICODE == 1, this option selects the character encoding ON THE FILE to
 | ||||
| /  be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf(). | ||||
| / | ||||
| /  0: ANSI/OEM | ||||
| /  1: UTF-16LE | ||||
| /  2: UTF-16BE | ||||
| /  3: UTF-8 | ||||
| / | ||||
| /  This option has no effect when _LFN_UNICODE == 0. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _FS_RPATH	0 | ||||
| /* This option configures support of relative path.
 | ||||
| / | ||||
| /   0: Disable relative path and remove related functions. | ||||
| /   1: Enable relative path. f_chdir() and f_chdrive() are available. | ||||
| /   2: f_getcwd() function is available in addition to 1. | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| / Drive/Volume Configurations | ||||
| /---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define _VOLUMES	2 | ||||
| /* Number of volumes (logical drives) to be used. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _STR_VOLUME_ID	0 | ||||
| #define _VOLUME_STRS	"RAM","NAND","CF","SD","SD2","USB","USB2","USB3" | ||||
| /* _STR_VOLUME_ID switches string support of volume ID.
 | ||||
| /  When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive | ||||
| /  number in the path name. _VOLUME_STRS defines the drive ID strings for each | ||||
| /  logical drives. Number of items must be equal to _VOLUMES. Valid characters for | ||||
| /  the drive ID strings are: A-Z and 0-9. */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_MULTI_PARTITION	0 | ||||
| /* This option switches support of multi-partition on a physical drive.
 | ||||
| /  By default (0), each logical drive number is bound to the same physical drive | ||||
| /  number and only an FAT volume found on the physical drive will be mounted. | ||||
| /  When multi-partition is enabled (1), each logical drive number can be bound to | ||||
| /  arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() | ||||
| /  funciton will be available. */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_MIN_SS		512 | ||||
| #define	_MAX_SS		512 | ||||
| /* These options configure the range of sector size to be supported. (512, 1024,
 | ||||
| /  2048 or 4096) Always set both 512 for most systems, all type of memory cards and | ||||
| /  harddisk. But a larger value may be required for on-board flash memory and some | ||||
| /  type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured | ||||
| /  to variable sector size and GET_SECTOR_SIZE command must be implemented to the | ||||
| /  disk_ioctl() function. */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_USE_TRIM	0 | ||||
| /* This option switches support of ATA-TRIM. (0:Disable or 1:Enable)
 | ||||
| /  To enable Trim function, also CTRL_TRIM command should be implemented to the | ||||
| /  disk_ioctl() function. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _FS_NOFSINFO	0 | ||||
| /* If you need to know correct free space on the FAT32 volume, set bit 0 of this
 | ||||
| /  option, and f_getfree() function at first time after volume mount will force | ||||
| /  a full FAT scan. Bit 1 controls the use of last allocated cluster number. | ||||
| / | ||||
| /  bit0=0: Use free cluster count in the FSINFO if available. | ||||
| /  bit0=1: Do not trust free cluster count in the FSINFO. | ||||
| /  bit1=0: Use last allocated cluster number in the FSINFO if available. | ||||
| /  bit1=1: Do not trust last allocated cluster number in the FSINFO. | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*---------------------------------------------------------------------------/
 | ||||
| / System Configurations | ||||
| /---------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #define	_FS_TINY	0 | ||||
| /* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
 | ||||
| /  At the tiny configuration, size of file object (FIL) is reduced _MAX_SS bytes. | ||||
| /  Instead of private sector buffer eliminated from the file object, common sector | ||||
| /  buffer in the file system object (FATFS) is used for the file data transfer. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _FS_EXFAT	0 | ||||
| /* This option switches support of exFAT file system. (0:Disable or 1:Enable)
 | ||||
| /  When enable exFAT, also LFN needs to be enabled. (_USE_LFN >= 1) | ||||
| /  Note that enabling exFAT discards C89 compatibility. */ | ||||
| 
 | ||||
| 
 | ||||
| #define _FS_NORTC	0 | ||||
| #define _NORTC_MON	1 | ||||
| #define _NORTC_MDAY	1 | ||||
| #define _NORTC_YEAR	2016 | ||||
| /* The option _FS_NORTC switches timestamp functiton. If the system does not have
 | ||||
| /  any RTC function or valid timestamp is not needed, set _FS_NORTC = 1 to disable | ||||
| /  the timestamp function. All objects modified by FatFs will have a fixed timestamp | ||||
| /  defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR in local time. | ||||
| /  To enable timestamp function (_FS_NORTC = 0), get_fattime() function need to be | ||||
| /  added to the project to get current time form real-time clock. _NORTC_MON, | ||||
| /  _NORTC_MDAY and _NORTC_YEAR have no effect. | ||||
| /  These options have no effect at read-only configuration (_FS_READONLY = 1). */ | ||||
| 
 | ||||
| 
 | ||||
| #define	_FS_LOCK	2 | ||||
| /* The option _FS_LOCK switches file lock function to control duplicated file open
 | ||||
| /  and illegal operation to open objects. This option must be 0 when _FS_READONLY | ||||
| /  is 1. | ||||
| / | ||||
| /  0:  Disable file lock function. To avoid volume corruption, application program | ||||
| /      should avoid illegal open, remove and rename to the open objects. | ||||
| /  >0: Enable file lock function. The value defines how many files/sub-directories | ||||
| /      can be opened simultaneously under file lock control. Note that the file | ||||
| /      lock control is independent of re-entrancy. */ | ||||
| 
 | ||||
| #define _FS_REENTRANT	1 | ||||
| 
 | ||||
| #if _FS_REENTRANT | ||||
| #include "cmsis_os.h" | ||||
| #define _FS_TIMEOUT		1000 | ||||
| #define	_SYNC_t         osSemaphoreId | ||||
| #endif | ||||
| /* The option _FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs
 | ||||
| /  module itself. Note that regardless of this option, file access to different | ||||
| /  volume is always re-entrant and volume control functions, f_mount(), f_mkfs() | ||||
| /  and f_fdisk() function, are always not re-entrant. Only file/directory access | ||||
| /  to the same volume is under control of this function. | ||||
| / | ||||
| /   0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect. | ||||
| /   1: Enable re-entrancy. Also user provided synchronization handlers, | ||||
| /      ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() | ||||
| /      function, must be added to the project. Samples are available in | ||||
| /      option/syscall.c. | ||||
| / | ||||
| /  The _FS_TIMEOUT defines timeout period in unit of time tick. | ||||
| /  The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, | ||||
| /  SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be | ||||
| /  included somewhere in the scope of ff.h. */ | ||||
| 
 | ||||
| /* #include <windows.h>	// O/S definitions  */ | ||||
| 
 | ||||
| #if _USE_LFN == 3 | ||||
| #if !defined(ff_malloc) || !defined(ff_free) | ||||
| #include <stdlib.h> | ||||
| #endif | ||||
| 
 | ||||
| #if !defined(ff_malloc) | ||||
| #define ff_malloc malloc | ||||
| #endif | ||||
| 
 | ||||
| #if !defined(ff_free) | ||||
| #define ff_free free | ||||
| #endif | ||||
| #endif | ||||
| /*--- End of configuration options ---*/ | ||||
							
								
								
									
										38
									
								
								lib/fatfs/integer.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								lib/fatfs/integer.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | ||||
| /*-------------------------------------------*/ | ||||
| /* Integer type definitions for FatFs module */ | ||||
| /*-------------------------------------------*/ | ||||
| 
 | ||||
| #ifndef _FF_INTEGER | ||||
| #define _FF_INTEGER | ||||
| 
 | ||||
| #ifdef _WIN32	/* FatFs development platform */ | ||||
| 
 | ||||
| #include <windows.h> | ||||
| #include <tchar.h> | ||||
| typedef unsigned __int64 QWORD; | ||||
| 
 | ||||
| 
 | ||||
| #else			/* Embedded platform */ | ||||
| 
 | ||||
| /* These types MUST be 16-bit or 32-bit */ | ||||
| typedef int				INT; | ||||
| typedef unsigned int	UINT; | ||||
| 
 | ||||
| /* This type MUST be 8-bit */ | ||||
| typedef unsigned char	BYTE; | ||||
| 
 | ||||
| /* These types MUST be 16-bit */ | ||||
| typedef short			SHORT; | ||||
| typedef unsigned short	WORD; | ||||
| typedef unsigned short	WCHAR; | ||||
| 
 | ||||
| /* These types MUST be 32-bit */ | ||||
| typedef long			LONG; | ||||
| typedef unsigned long	DWORD; | ||||
| 
 | ||||
| /* This type MUST be 64-bit (Remove this for ANSI C (C89) compatibility) */ | ||||
| typedef unsigned long long QWORD; | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										3870
									
								
								lib/fatfs/option/cc932.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3870
									
								
								lib/fatfs/option/cc932.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										11045
									
								
								lib/fatfs/option/cc936.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11045
									
								
								lib/fatfs/option/cc936.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										8674
									
								
								lib/fatfs/option/cc949.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8674
									
								
								lib/fatfs/option/cc949.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										6900
									
								
								lib/fatfs/option/cc950.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6900
									
								
								lib/fatfs/option/cc950.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										388
									
								
								lib/fatfs/option/ccsbcs.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										388
									
								
								lib/fatfs/option/ccsbcs.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,388 @@ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Unicode - Local code bidirectional converter  (C)ChaN, 2015            */ | ||||
| /* (SBCS code pages)                                                      */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /*  437   U.S.
 | ||||
| /   720   Arabic | ||||
| /   737   Greek | ||||
| /   771   KBL | ||||
| /   775   Baltic | ||||
| /   850   Latin 1 | ||||
| /   852   Latin 2 | ||||
| /   855   Cyrillic | ||||
| /   857   Turkish | ||||
| /   860   Portuguese | ||||
| /   861   Icelandic | ||||
| /   862   Hebrew | ||||
| /   863   Canadian French | ||||
| /   864   Arabic | ||||
| /   865   Nordic | ||||
| /   866   Russian | ||||
| /   869   Greek 2 | ||||
| */ | ||||
| 
 | ||||
| #include "../ff.h" | ||||
| 
 | ||||
| 
 | ||||
| #if _CODE_PAGE == 437 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP437(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, | ||||
| 	0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, | ||||
| 	0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 720 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP720(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, | ||||
| 	0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, | ||||
| 	0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, | ||||
| 	0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 737 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP737(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, | ||||
| 	0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, | ||||
| 	0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, | ||||
| 	0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 771 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP771(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, | ||||
| 	0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, | ||||
| 	0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x0104, 0x0105, 0x010C, 0x010D, | ||||
| 	0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, | ||||
| 	0x0118, 0x0119, 0x0116, 0x0117, 0x012E, 0x012F, 0x0160, 0x0161, 0x0172, 0x0173, 0x016A, 0x016B, 0x017D, 0x017E, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 775 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP775(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, | ||||
| 	0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, | ||||
| 	0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, | ||||
| 	0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, | ||||
| 	0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 850 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP850(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, | ||||
| 	0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, | ||||
| 	0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, | ||||
| 	0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, | ||||
| 	0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 852 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP852(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, | ||||
| 	0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, | ||||
| 	0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, | ||||
| 	0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, | ||||
| 	0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 855 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP855(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, | ||||
| 	0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, | ||||
| 	0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, | ||||
| 	0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, | ||||
| 	0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, | ||||
| 	0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 857 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP857(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, | ||||
| 	0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, | ||||
| 	0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, | ||||
| 	0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, | ||||
| 	0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 860 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP860(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E3, 0x00E0, 0x00C1, 0x00E7, 0x00EA, 0x00CA, 0x00E8, 0x00CD, 0x00D4, 0x00EC, 0x00C3, 0x00C2, | ||||
| 	0x00C9, 0x00C0, 0x00C8, 0x00F4, 0x00F5, 0x00F2, 0x00DA, 0x00F9, 0x00CC, 0x00D5, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x20A7, 0x00D3, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00D2, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, | ||||
| 	0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 861 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP861(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00D0, 0x00F0, 0x00DE, 0x00C4, 0x00C5, | ||||
| 	0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00FE, 0x00FB, 0x00DD, 0x00FD, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00C1, 0x00CD, 0x00D3, 0x00DA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, | ||||
| 	0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 862 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP862(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, | ||||
| 	0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, | ||||
| 	0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 863 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP863(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00C2, 0x00E0, 0x00B6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x2017, 0x00C0, | ||||
| 	0x00C9, 0x00C8, 0x00CA, 0x00F4, 0x00CB, 0x00CF, 0x00FB, 0x00F9, 0x00A4, 0x00D4, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x00DB, 0x0192, | ||||
| 	0x00A6, 0x00B4, 0x00F3, 0x00FA, 0x00A8, 0x00BB, 0x00B3, 0x00AF, 0x00CE, 0x3210, 0x00AC, 0x00BD, 0x00BC, 0x00BE, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2219, | ||||
| 	0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 864 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP864(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00B0, 0x00B7, 0x2219, 0x221A, 0x2592, 0x2500, 0x2502, 0x253C, 0x2524, 0x252C, 0x251C, 0x2534, 0x2510, 0x250C, 0x2514, 0x2518, | ||||
| 	0x03B2, 0x221E, 0x03C6, 0x00B1, 0x00BD, 0x00BC, 0x2248, 0x00AB, 0x00BB, 0xFEF7, 0xFEF8, 0x0000, 0x0000, 0xFEFB, 0xFEFC, 0x0000, | ||||
| 	0x00A0, 0x00AD, 0xFE82, 0x00A3, 0x00A4, 0xFE84, 0x0000, 0x20AC, 0xFE8E, 0xFE8F, 0xFE95, 0xFE99, 0x060C, 0xFE9D, 0xFEA1, 0xFEA5, | ||||
| 	0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xFED1, 0x061B, 0xFEB1, 0xFEB5, 0xFEB9, 0x061F, | ||||
| 	0x00A2, 0xFE80, 0xFE81, 0xFE83, 0xFE85, 0xFECA, 0xFE8B, 0xFE8D, 0xFE91, 0xFE93, 0xFE97, 0xFE9B, 0xFE9F, 0xFEA3, 0xFEA7, 0xFEA9, | ||||
| 	0xFEAB, 0xFEAD, 0xFEAF, 0xFEB3, 0xFEB7, 0xFEBB, 0xFEBF, 0xFEC1, 0xFEC5, 0xFECB, 0xFECF, 0x00A6, 0x00AC, 0x00F7, 0x00D7, 0xFEC9, | ||||
| 	0x0640, 0xFED3, 0xFED7, 0xFEDB, 0xFEDF, 0xFEE3, 0xFEE7, 0xFEEB, 0xFEED, 0xFEEF, 0xFEF3, 0xFEBD, 0xFECC, 0xFECE, 0xFECD, 0xFEE1, | ||||
| 	0xFE7D, 0x0651, 0xFEE5, 0xFEE9, 0xFEEC, 0xFEF0, 0xFEF2, 0xFED0, 0xFED5, 0xFEF5, 0xFEF6, 0xFEDD, 0xFED9, 0xFEF1, 0x25A0, 0x0000 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 865 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP865(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, | ||||
| 	0x00C5, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, | ||||
| 	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00A4, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, | ||||
| 	0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 866 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP866(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, | ||||
| 	0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, | ||||
| 	0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, | ||||
| 	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, | ||||
| 	0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, | ||||
| 	0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #elif _CODE_PAGE == 869 | ||||
| #define _TBLDEF 1 | ||||
| static | ||||
| const WCHAR Tbl[] = {	/*  CP869(0x80-0xFF) to Unicode conversion table */ | ||||
| 	0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x0386, 0x00B7, 0x00B7, 0x00AC, 0x00A6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389, | ||||
| 	0x038A, 0x03AA, 0x038C, 0x00B7, 0x00B7, 0x038E, 0x03AB, 0x00A9, 0x038F, 0x00B2, 0x00B3, 0x03AC, 0x00A3, 0x03AD, 0x03AE, 0x03AF, | ||||
| 	0x03CA, 0x0390, 0x03CC, 0x03CD, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x00BD, 0x0398, 0x0399, 0x00AB, 0x00BB, | ||||
| 	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039A, 0x039B, 0x039C, 0x039D, 0x2563, 0x2551, 0x2557, 0x255D, 0x039E, 0x039F, 0x2510, | ||||
| 	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0A30, 0x03A1, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x03A3, | ||||
| 	0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x2518, 0x250C, 0x2588, 0x2584, 0x03B4, 0x03B5, 0x2580, | ||||
| 	0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x0384, | ||||
| 	0x00AD, 0x00B1, 0x03C5, 0x03C6, 0x03C7, 0x00A7, 0x03C8, 0x0385, 0x00B0, 0x00A8, 0x03C9, 0x03CB, 0x03B0, 0x03CE, 0x25A0, 0x00A0 | ||||
| }; | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| #if !_TBLDEF || !_USE_LFN | ||||
| #error This file is not needed at current configuration. Remove from the project. | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| WCHAR ff_convert (	/* Converted character, Returns zero on error */ | ||||
| 	WCHAR	chr,	/* Character code to be converted */ | ||||
| 	UINT	dir		/* 0: Unicode to OEM code, 1: OEM code to Unicode */ | ||||
| ) | ||||
| { | ||||
| 	WCHAR c; | ||||
| 
 | ||||
| 
 | ||||
| 	if (chr < 0x80) {	/* ASCII */ | ||||
| 		c = chr; | ||||
| 
 | ||||
| 	} else { | ||||
| 		if (dir) {		/* OEM code to Unicode */ | ||||
| 			c = (chr >= 0x100) ? 0 : Tbl[chr - 0x80]; | ||||
| 
 | ||||
| 		} else {		/* Unicode to OEM code */ | ||||
| 			for (c = 0; c < 0x80; c++) { | ||||
| 				if (chr == Tbl[c]) break; | ||||
| 			} | ||||
| 			c = (c + 0x80) & 0xFF; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return c; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| WCHAR ff_wtoupper (	/* Returns upper converted character */ | ||||
| 	WCHAR chr		/* Unicode character to be upper converted (BMP only) */ | ||||
| ) | ||||
| { | ||||
| 	/* Compressed upper conversion table */ | ||||
| 	static const WCHAR cvt1[] = {	/* U+0000 - U+0FFF */ | ||||
| 		/* Basic Latin */ | ||||
| 		0x0061,0x031A, | ||||
| 		/* Latin-1 Supplement */ | ||||
| 		0x00E0,0x0317,  0x00F8,0x0307,  0x00FF,0x0001,0x0178, | ||||
| 		/* Latin Extended-A */ | ||||
| 		0x0100,0x0130,  0x0132,0x0106,  0x0139,0x0110,  0x014A,0x012E,  0x0179,0x0106, | ||||
| 		/* Latin Extended-B */ | ||||
| 		0x0180,0x004D,0x0243,0x0181,0x0182,0x0182,0x0184,0x0184,0x0186,0x0187,0x0187,0x0189,0x018A,0x018B,0x018B,0x018D,0x018E,0x018F,0x0190,0x0191,0x0191,0x0193,0x0194,0x01F6,0x0196,0x0197,0x0198,0x0198,0x023D,0x019B,0x019C,0x019D,0x0220,0x019F,0x01A0,0x01A0,0x01A2,0x01A2,0x01A4,0x01A4,0x01A6,0x01A7,0x01A7,0x01A9,0x01AA,0x01AB,0x01AC,0x01AC,0x01AE,0x01AF,0x01AF,0x01B1,0x01B2,0x01B3,0x01B3,0x01B5,0x01B5,0x01B7,0x01B8,0x01B8,0x01BA,0x01BB,0x01BC,0x01BC,0x01BE,0x01F7,0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C5,0x01C4,0x01C7,0x01C8,0x01C7,0x01CA,0x01CB,0x01CA, | ||||
| 		0x01CD,0x0110,  0x01DD,0x0001,0x018E,  0x01DE,0x0112,  0x01F3,0x0003,0x01F1,0x01F4,0x01F4,  0x01F8,0x0128, | ||||
| 		0x0222,0x0112,  0x023A,0x0009,0x2C65,0x023B,0x023B,0x023D,0x2C66,0x023F,0x0240,0x0241,0x0241,  0x0246,0x010A, | ||||
| 		/* IPA Extensions */ | ||||
| 		0x0253,0x0040,0x0181,0x0186,0x0255,0x0189,0x018A,0x0258,0x018F,0x025A,0x0190,0x025C,0x025D,0x025E,0x025F,0x0193,0x0261,0x0262,0x0194,0x0264,0x0265,0x0266,0x0267,0x0197,0x0196,0x026A,0x2C62,0x026C,0x026D,0x026E,0x019C,0x0270,0x0271,0x019D,0x0273,0x0274,0x019F,0x0276,0x0277,0x0278,0x0279,0x027A,0x027B,0x027C,0x2C64,0x027E,0x027F,0x01A6,0x0281,0x0282,0x01A9,0x0284,0x0285,0x0286,0x0287,0x01AE,0x0244,0x01B1,0x01B2,0x0245,0x028D,0x028E,0x028F,0x0290,0x0291,0x01B7, | ||||
| 		/* Greek, Coptic */ | ||||
| 		0x037B,0x0003,0x03FD,0x03FE,0x03FF,  0x03AC,0x0004,0x0386,0x0388,0x0389,0x038A,  0x03B1,0x0311, | ||||
| 		0x03C2,0x0002,0x03A3,0x03A3,  0x03C4,0x0308,  0x03CC,0x0003,0x038C,0x038E,0x038F,  0x03D8,0x0118, | ||||
| 		0x03F2,0x000A,0x03F9,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7,0x03F7,0x03F9,0x03FA,0x03FA, | ||||
| 		/* Cyrillic */ | ||||
| 		0x0430,0x0320,  0x0450,0x0710,  0x0460,0x0122,  0x048A,0x0136,  0x04C1,0x010E,  0x04CF,0x0001,0x04C0,  0x04D0,0x0144, | ||||
| 		/* Armenian */ | ||||
| 		0x0561,0x0426, | ||||
| 
 | ||||
| 		0x0000 | ||||
| 	}; | ||||
| 	static const WCHAR cvt2[] = {	/* U+1000 - U+FFFF */ | ||||
| 		/* Phonetic Extensions */ | ||||
| 		0x1D7D,0x0001,0x2C63, | ||||
| 		/* Latin Extended Additional */ | ||||
| 		0x1E00,0x0196,  0x1EA0,0x015A, | ||||
| 		/* Greek Extended */ | ||||
| 		0x1F00,0x0608,  0x1F10,0x0606,  0x1F20,0x0608,  0x1F30,0x0608,  0x1F40,0x0606, | ||||
| 		0x1F51,0x0007,0x1F59,0x1F52,0x1F5B,0x1F54,0x1F5D,0x1F56,0x1F5F,  0x1F60,0x0608, | ||||
| 		0x1F70,0x000E,0x1FBA,0x1FBB,0x1FC8,0x1FC9,0x1FCA,0x1FCB,0x1FDA,0x1FDB,0x1FF8,0x1FF9,0x1FEA,0x1FEB,0x1FFA,0x1FFB, | ||||
| 		0x1F80,0x0608,  0x1F90,0x0608,  0x1FA0,0x0608,  0x1FB0,0x0004,0x1FB8,0x1FB9,0x1FB2,0x1FBC, | ||||
| 		0x1FCC,0x0001,0x1FC3,  0x1FD0,0x0602,  0x1FE0,0x0602,  0x1FE5,0x0001,0x1FEC,  0x1FF2,0x0001,0x1FFC, | ||||
| 		/* Letterlike Symbols */ | ||||
| 		0x214E,0x0001,0x2132, | ||||
| 		/* Number forms */ | ||||
| 		0x2170,0x0210,  0x2184,0x0001,0x2183, | ||||
| 		/* Enclosed Alphanumerics */ | ||||
| 		0x24D0,0x051A,  0x2C30,0x042F, | ||||
| 		/* Latin Extended-C */ | ||||
| 		0x2C60,0x0102,  0x2C67,0x0106, 0x2C75,0x0102, | ||||
| 		/* Coptic */ | ||||
| 		0x2C80,0x0164, | ||||
| 		/* Georgian Supplement */ | ||||
| 		0x2D00,0x0826, | ||||
| 		/* Full-width */ | ||||
| 		0xFF41,0x031A, | ||||
| 
 | ||||
| 		0x0000 | ||||
| 	}; | ||||
| 	const WCHAR *p; | ||||
| 	WCHAR bc, nc, cmd; | ||||
| 
 | ||||
| 
 | ||||
| 	p = chr < 0x1000 ? cvt1 : cvt2; | ||||
| 	for (;;) { | ||||
| 		bc = *p++;								/* Get block base */ | ||||
| 		if (!bc || chr < bc) break; | ||||
| 		nc = *p++; cmd = nc >> 8; nc &= 0xFF;	/* Get processing command and block size */ | ||||
| 		if (chr < bc + nc) {	/* In the block? */ | ||||
| 			switch (cmd) { | ||||
| 			case 0:	chr = p[chr - bc]; break;		/* Table conversion */ | ||||
| 			case 1:	chr -= (chr - bc) & 1; break;	/* Case pairs */ | ||||
| 			case 2: chr -= 16; break;				/* Shift -16 */ | ||||
| 			case 3:	chr -= 32; break;				/* Shift -32 */ | ||||
| 			case 4:	chr -= 48; break;				/* Shift -48 */ | ||||
| 			case 5:	chr -= 26; break;				/* Shift -26 */ | ||||
| 			case 6:	chr += 8; break;				/* Shift +8 */ | ||||
| 			case 7: chr -= 80; break;				/* Shift -80 */ | ||||
| 			case 8:	chr -= 0x1C60; break;			/* Shift -0x1C60 */ | ||||
| 			} | ||||
| 			break; | ||||
| 		} | ||||
| 		if (!cmd) p += nc; | ||||
| 	} | ||||
| 
 | ||||
| 	return chr; | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										17
									
								
								lib/fatfs/option/unicode.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								lib/fatfs/option/unicode.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| #include "../ff.h" | ||||
| 
 | ||||
| #if _USE_LFN != 0 | ||||
| 
 | ||||
| #if   _CODE_PAGE == 932	/* Japanese Shift_JIS */ | ||||
| #include "cc932.c" | ||||
| #elif _CODE_PAGE == 936	/* Simplified Chinese GBK */ | ||||
| #include "cc936.c" | ||||
| #elif _CODE_PAGE == 949	/* Korean */ | ||||
| #include "cc949.c" | ||||
| #elif _CODE_PAGE == 950	/* Traditional Chinese Big5 */ | ||||
| #include "cc950.c" | ||||
| #else					/* Single Byte Character-Set */ | ||||
| #include "ccsbcs.c" | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
| @ -23,3 +23,9 @@ C_SOURCES		+= $(U8G2_DIR)/u8g2_font.c | ||||
| C_SOURCES		+= $(U8G2_DIR)/u8g2_fonts.c | ||||
| C_SOURCES		+= $(U8G2_DIR)/u8x8_8x8.c | ||||
| C_SOURCES		+= $(U8G2_DIR)/u8g2_bitmap.c | ||||
| 
 | ||||
| FATFS_DIR		= $(LIB_DIR)/fatfs | ||||
| C_SOURCES		+= $(FATFS_DIR)/ff.c | ||||
| C_SOURCES		+= $(FATFS_DIR)/ff_gen_drv.c | ||||
| C_SOURCES		+= $(FATFS_DIR)/diskio.c | ||||
| C_SOURCES		+= $(FATFS_DIR)/option/unicode.c | ||||
| @ -86,6 +86,9 @@ Local target: | ||||
| * `docker-compose exec dev make -C firmware TARGET=local APP_EXAMPLE_DISPLAY=1 run` | ||||
| * Some writes to display | ||||
| 
 | ||||
| * `docker-compose exec dev make -C firmware TARGET=local APP_EXAMPLE_FATFS=1 flash` | ||||
| * TODO: FatFs emulation and test not implemented | ||||
| 
 | ||||
| F2 target: | ||||
| 
 | ||||
| * `docker-compose exec dev make -C firmware TARGET=f2 APP_TEST=1 clean` | ||||
| @ -109,3 +112,10 @@ F2 target: | ||||
| 
 | ||||
| * `docker-compose exec dev make -C firmware TARGET=f2 APP_EXAMPLE_DISPLAY=1 flash` | ||||
| * `Hello world` show on the screen | ||||
| 
 | ||||
| * `docker-compose exec dev make -C firmware TARGET=f2 APP_EXAMPLE_FATFS=1 flash` | ||||
| * `Init sd card error` on the screen | ||||
| * Insert SD-card | ||||
| * Reboot | ||||
| * Show file list on the screen | ||||
| * Scroll by pressing up and down | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 DrZlo13
						DrZlo13