Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/famicom-dumper-writer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2022-09-27 11:10:55 +0300
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2022-09-27 11:10:55 +0300
commit5a58ff5ad2f7c6f5898abbc4c6f570ed70d481c6 (patch)
treeac43b155a930b147a7b6e04e04d79ab21c370107
parent5c8b9c01f59d79ecbf2669fc5556003567483d53 (diff)
Misc
-rw-r--r--CPLD/FamicomDumper.v5
-rw-r--r--STM32/Core/Inc/dumper.h10
-rw-r--r--STM32/Core/Src/led.c1
-rw-r--r--STM32/Core/Src/main.c153
-rw-r--r--STM32/FamicomDumper.ioc3
-rw-r--r--STM32/STM32F103ZETX_FLASH.ld29
-rw-r--r--STM32/STM32F103ZETX_FLASH_debug.ld28
-rw-r--r--STM32_bootloader/Core/Inc/main.h9
-rw-r--r--STM32_bootloader/Core/Src/led.c112
-rw-r--r--STM32_bootloader/Core/Src/main.c211
-rw-r--r--STM32_bootloader/FATFS/Target/ffconf.h2
-rw-r--r--STM32_bootloader/FATFS/Target/user_diskio.c13
-rw-r--r--STM32_bootloader/FamicomDumperBootloader.ioc4
-rw-r--r--STM32_bootloader/Middlewares/Third_Party/FatFs/src/option/ccsbcs.c540
-rw-r--r--STM32_bootloader/USB_DEVICE/App/usbd_storage_if.c14
-rw-r--r--STM32_bootloader/USB_DEVICE/Target/usbd_conf.c4
16 files changed, 291 insertions, 847 deletions
diff --git a/CPLD/FamicomDumper.v b/CPLD/FamicomDumper.v
index 168ac06..8ef5fb8 100644
--- a/CPLD/FamicomDumper.v
+++ b/CPLD/FamicomDumper.v
@@ -1,5 +1,6 @@
module FamicomDumper # (
- parameter LEDS_TIMER_SIZE = 12
+ parameter LEDS_TIMER_SIZE = 12,
+ parameter VERSION_3 = 1
)
(
input m2,
@@ -33,7 +34,7 @@ module FamicomDumper # (
);
assign romsel = !(m2 && a15 && ne1_active);
-assign cpu_rw = reg_cpu_rw || coolboy_mode;
+assign cpu_rw = reg_cpu_rw /*|| (coolboy_mode && VERSION_3)*/;
assign cpu_oe = !cpu_shifter_enabled;
assign cpu_dir = !reg_cpu_rw;
assign ppu_rd = !(!ne2 && !noe);
diff --git a/STM32/Core/Inc/dumper.h b/STM32/Core/Inc/dumper.h
index e24c09b..36eb96b 100644
--- a/STM32/Core/Inc/dumper.h
+++ b/STM32/Core/Inc/dumper.h
@@ -1,9 +1,12 @@
#ifndef _DUMPER_H_
#define _DUMPER_H_
-#define PROTOCOL_VERSION 3
-#define FIRMWARE_VERSION_MAJOR 2
+#define PROTOCOL_VERSION 4
+#define FIRMWARE_VERSION_MAJOR 3
#define FIRMWARE_VERSION_MINOR 0
+#define FIRMWARE_VERSION_SUFFIX 0
+#define HARDWARE_VERSION_ADDRESS 0x08070000 - 2048
+#define HARDWARE_VERSION ((volatile uint8_t*)(HARDWARE_VERSION_ADDRESS))
#define FDS_IRQ_CONTROL 0x4022
#define FDS_MASTER_IO 0x4023
@@ -49,8 +52,7 @@ void read_chr_crc_send(uint16_t address, uint16_t len);
void write_chr(uint16_t address, uint16_t len, uint8_t *data);
void erase_flash_sector();
void write_flash(uint16_t address, uint16_t len, uint8_t *data);
-void fds_transfer(uint8_t block_read_start, uint8_t block_read_count, uint8_t block_write_count, uint8_t* block_write_ids, uint16_t *write_lengths,
- uint8_t *write_data);
+void fds_transfer(uint8_t block_read_start, uint8_t block_read_count, uint8_t block_write_count, uint8_t *block_write_ids, uint16_t *write_lengths, uint8_t *write_data);
void get_mirroring();
void set_coolboy_gpio_mode(uint8_t coolboy_gpio_mode);
diff --git a/STM32/Core/Src/led.c b/STM32/Core/Src/led.c
index b7902ba..719b5a0 100644
--- a/STM32/Core/Src/led.c
+++ b/STM32/Core/Src/led.c
@@ -62,7 +62,6 @@ static rgb hsv2rgb(hsv in)
out.g = in.v;
out.b = t;
break;
-
case 3:
out.r = p;
out.g = q;
diff --git a/STM32/Core/Src/main.c b/STM32/Core/Src/main.c
index b1ed729..263803f 100644
--- a/STM32/Core/Src/main.c
+++ b/STM32/Core/Src/main.c
@@ -44,7 +44,7 @@
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
- TIM_HandleTypeDef htim1;
+TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim4;
@@ -85,9 +85,9 @@ int _write(int file, char *ptr, int len)
/* USER CODE END 0 */
/**
- * @brief The application entry point.
- * @retval int
- */
+ * @brief The application entry point.
+ * @retval int
+ */
int main(void)
{
/* USER CODE BEGIN 1 */
@@ -149,7 +149,7 @@ int main(void)
switch (comm_recv_command)
{
case COMMAND_PRG_INIT:
- comm_start(COMMAND_PRG_STARTED, 9);
+ comm_start(COMMAND_PRG_STARTED, 13);
comm_send_byte(PROTOCOL_VERSION);
comm_send_byte(0xFF);
comm_send_byte(0xFF); // unlimited send buffer
@@ -157,12 +157,19 @@ int main(void)
comm_send_byte(((RECV_BUFFER_SIZE - 5) >> 8) & 0xFF);
comm_send_byte(FIRMWARE_VERSION_MAJOR & 0xFF);
comm_send_byte((FIRMWARE_VERSION_MAJOR >> 8) & 0xFF);
- comm_send_byte(FIRMWARE_VERSION_MINOR & 0xFF);
- comm_send_byte((FIRMWARE_VERSION_MINOR >> 8) & 0xFF);
- comm_send_byte(FIRMWARE_VERSION_MAJOR & 0xFF);
- comm_send_byte((FIRMWARE_VERSION_MAJOR >> 8) & 0xFF);
- comm_send_byte(FIRMWARE_VERSION_MINOR & 0xFF);
- comm_send_byte((FIRMWARE_VERSION_MINOR >> 8) & 0xFF);
+ comm_send_byte(FIRMWARE_VERSION_MINOR);
+ comm_send_byte(FIRMWARE_VERSION_SUFFIX);
+#ifndef DEBUG
+ comm_send_byte(HARDWARE_VERSION[0]);
+ comm_send_byte(HARDWARE_VERSION[1]);
+ comm_send_byte(HARDWARE_VERSION[2]);
+ comm_send_byte(HARDWARE_VERSION[3]);
+#else
+ comm_send_byte(0);
+ comm_send_byte(0);
+ comm_send_byte(0);
+ comm_send_byte(0);
+#endif
set_coolboy_gpio_mode(0);
break;
@@ -231,8 +238,7 @@ int main(void)
break;
case COMMAND_FDS_WRITE_REQUEST:
- fds_transfer(0, 0, recv_buffer[0], (uint8_t*) &recv_buffer[1], (uint16_t*) &recv_buffer[1 + recv_buffer[0]],
- (uint8_t*) &recv_buffer[1 + recv_buffer[0] + recv_buffer[0] * 2]);
+ fds_transfer(0, 0, recv_buffer[0], (uint8_t*) &recv_buffer[1], (uint16_t*) &recv_buffer[1 + recv_buffer[0]], (uint8_t*) &recv_buffer[1 + recv_buffer[0] + recv_buffer[0] * 2]);
break;
case COMMAND_MIRRORING_REQUEST:
@@ -245,7 +251,7 @@ int main(void)
break;
case COMMAND_SET_COOLBOY_GPIO_MODE:
- set_coolboy_gpio_mode(recv_buffer[0]);
+ set_coolboy_gpio_mode(recv_buffer[0]);
comm_start(COMMAND_SET_VALUE_DONE, 0);
break;
}
@@ -259,18 +265,18 @@ int main(void)
}
/**
- * @brief System Clock Configuration
- * @retval None
- */
+ * @brief System Clock Configuration
+ * @retval None
+ */
void SystemClock_Config(void)
{
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
- RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
+ RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };
+ RCC_PeriphCLKInitTypeDef PeriphClkInit = { 0 };
/** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
- */
+ * in the RCC_OscInitTypeDef structure.
+ */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV2;
@@ -284,9 +290,8 @@ void SystemClock_Config(void)
}
/** Initializes the CPU, AHB and APB buses clocks
- */
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
@@ -306,10 +311,10 @@ void SystemClock_Config(void)
}
/**
- * @brief TIM1 Initialization Function
- * @param None
- * @retval None
- */
+ * @brief TIM1 Initialization Function
+ * @param None
+ * @retval None
+ */
static void MX_TIM1_Init(void)
{
@@ -317,8 +322,8 @@ static void MX_TIM1_Init(void)
/* USER CODE END TIM1_Init 0 */
- TIM_ClockConfigTypeDef sClockSourceConfig = {0};
- TIM_MasterConfigTypeDef sMasterConfig = {0};
+ TIM_ClockConfigTypeDef sClockSourceConfig = { 0 };
+ TIM_MasterConfigTypeDef sMasterConfig = { 0 };
/* USER CODE BEGIN TIM1_Init 1 */
@@ -352,10 +357,10 @@ static void MX_TIM1_Init(void)
}
/**
- * @brief TIM2 Initialization Function
- * @param None
- * @retval None
- */
+ * @brief TIM2 Initialization Function
+ * @param None
+ * @retval None
+ */
static void MX_TIM2_Init(void)
{
@@ -363,9 +368,9 @@ static void MX_TIM2_Init(void)
/* USER CODE END TIM2_Init 0 */
- TIM_ClockConfigTypeDef sClockSourceConfig = {0};
- TIM_MasterConfigTypeDef sMasterConfig = {0};
- TIM_OC_InitTypeDef sConfigOC = {0};
+ TIM_ClockConfigTypeDef sClockSourceConfig = { 0 };
+ TIM_MasterConfigTypeDef sMasterConfig = { 0 };
+ TIM_OC_InitTypeDef sConfigOC = { 0 };
/* USER CODE BEGIN TIM2_Init 1 */
@@ -411,10 +416,10 @@ static void MX_TIM2_Init(void)
}
/**
- * @brief TIM3 Initialization Function
- * @param None
- * @retval None
- */
+ * @brief TIM3 Initialization Function
+ * @param None
+ * @retval None
+ */
static void MX_TIM3_Init(void)
{
@@ -422,8 +427,8 @@ static void MX_TIM3_Init(void)
/* USER CODE END TIM3_Init 0 */
- TIM_SlaveConfigTypeDef sSlaveConfig = {0};
- TIM_MasterConfigTypeDef sMasterConfig = {0};
+ TIM_SlaveConfigTypeDef sSlaveConfig = { 0 };
+ TIM_MasterConfigTypeDef sMasterConfig = { 0 };
/* USER CODE BEGIN TIM3_Init 1 */
@@ -457,10 +462,10 @@ static void MX_TIM3_Init(void)
}
/**
- * @brief TIM4 Initialization Function
- * @param None
- * @retval None
- */
+ * @brief TIM4 Initialization Function
+ * @param None
+ * @retval None
+ */
static void MX_TIM4_Init(void)
{
@@ -468,8 +473,8 @@ static void MX_TIM4_Init(void)
/* USER CODE END TIM4_Init 0 */
- TIM_SlaveConfigTypeDef sSlaveConfig = {0};
- TIM_MasterConfigTypeDef sMasterConfig = {0};
+ TIM_SlaveConfigTypeDef sSlaveConfig = { 0 };
+ TIM_MasterConfigTypeDef sMasterConfig = { 0 };
/* USER CODE BEGIN TIM4_Init 1 */
@@ -503,10 +508,10 @@ static void MX_TIM4_Init(void)
}
/**
- * @brief TIM5 Initialization Function
- * @param None
- * @retval None
- */
+ * @brief TIM5 Initialization Function
+ * @param None
+ * @retval None
+ */
static void MX_TIM5_Init(void)
{
@@ -514,9 +519,9 @@ static void MX_TIM5_Init(void)
/* USER CODE END TIM5_Init 0 */
- TIM_ClockConfigTypeDef sClockSourceConfig = {0};
- TIM_MasterConfigTypeDef sMasterConfig = {0};
- TIM_OC_InitTypeDef sConfigOC = {0};
+ TIM_ClockConfigTypeDef sClockSourceConfig = { 0 };
+ TIM_MasterConfigTypeDef sMasterConfig = { 0 };
+ TIM_OC_InitTypeDef sConfigOC = { 0 };
/* USER CODE BEGIN TIM5_Init 1 */
@@ -562,8 +567,8 @@ static void MX_TIM5_Init(void)
}
/**
- * Enable DMA controller clock
- */
+ * Enable DMA controller clock
+ */
static void MX_DMA_Init(void)
{
@@ -578,13 +583,13 @@ static void MX_DMA_Init(void)
}
/**
- * @brief GPIO Initialization Function
- * @param None
- * @retval None
- */
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
static void MX_GPIO_Init(void)
{
- GPIO_InitTypeDef GPIO_InitStruct = {0};
+ GPIO_InitTypeDef GPIO_InitStruct = { 0 };
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOF_CLK_ENABLE();
@@ -614,7 +619,7 @@ static void MX_GPIO_Init(void)
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : CIRAM_CE_Pin CIRAM_A10_Pin */
- GPIO_InitStruct.Pin = CIRAM_CE_Pin|CIRAM_A10_Pin;
+ GPIO_InitStruct.Pin = CIRAM_CE_Pin | CIRAM_A10_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
@@ -642,14 +647,14 @@ static void MX_FSMC_Init(void)
/* USER CODE END FSMC_Init 0 */
- FSMC_NORSRAM_TimingTypeDef Timing = {0};
+ FSMC_NORSRAM_TimingTypeDef Timing = { 0 };
/* USER CODE BEGIN FSMC_Init 1 */
/* USER CODE END FSMC_Init 1 */
/** Perform the SRAM1 memory initialization sequence
- */
+ */
hsram1.Instance = FSMC_NORSRAM_DEVICE;
hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
/* hsram1.Init */
@@ -678,11 +683,11 @@ static void MX_FSMC_Init(void)
if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)
{
- Error_Handler( );
+ Error_Handler();
}
/** Perform the SRAM2 memory initialization sequence
- */
+ */
hsram2.Instance = FSMC_NORSRAM_DEVICE;
hsram2.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
/* hsram2.Init */
@@ -711,11 +716,11 @@ static void MX_FSMC_Init(void)
if (HAL_SRAM_Init(&hsram2, &Timing, NULL) != HAL_OK)
{
- Error_Handler( );
+ Error_Handler();
}
/** Disconnect NADV
- */
+ */
__HAL_AFIO_FSMCNADV_DISCONNECTED();
@@ -729,9 +734,9 @@ static void MX_FSMC_Init(void)
/* USER CODE END 4 */
/**
- * @brief This function is executed in case of error occurrence.
- * @retval None
- */
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
diff --git a/STM32/FamicomDumper.ioc b/STM32/FamicomDumper.ioc
index 8553333..434ac14 100644
--- a/STM32/FamicomDumper.ioc
+++ b/STM32/FamicomDumper.ioc
@@ -343,6 +343,9 @@ TIM5.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM5.IPParameters=Channel-PWM Generation3 CH3,Period,Pulse-PWM Generation3 CH3
TIM5.Period=107
TIM5.Pulse-PWM\ Generation3\ CH3=0
+USB.IPParameters=low_power_enable,lpm_enable
+USB.low_power_enable=DISABLE
+USB.lpm_enable=DISABLE
USB_DEVICE.CLASS_NAME_FS=CDC
USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS,VID,MANUFACTURER_STRING,PID_CDC_FS,PRODUCT_STRING_CDC_FS
USB_DEVICE.MANUFACTURER_STRING=Cluster
diff --git a/STM32/STM32F103ZETX_FLASH.ld b/STM32/STM32F103ZETX_FLASH.ld
index 7c824b1..ba58a03 100644
--- a/STM32/STM32F103ZETX_FLASH.ld
+++ b/STM32/STM32F103ZETX_FLASH.ld
@@ -3,7 +3,7 @@
* @file LinkerScript.ld
* @author Auto-generated by STM32CubeIDE
* @brief Linker script for STM32F103ZETx Device from STM32F1 series
- * 512Kbytes FLASH
+ * 512Kbytes APP
* 64Kbytes RAM
*
* Set heap size, stack size and stack location according
@@ -37,21 +37,22 @@ _Min_Stack_Size = 0x400 ; /* required amount of stack */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
- FLASH (rx) : ORIGIN = 0x08040000, LENGTH = 192K
+ BOOT (rx) : ORIGIN = 0x08000000, LENGTH = 64K
+ APP (rx) : ORIGIN = 0x08040000, LENGTH = 192K
}
/* Sections */
SECTIONS
{
- /* The startup code into "FLASH" Rom type memory */
+ /* The startup code into "APP" Rom type memory */
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
- } >FLASH
+ } >APP
- /* The program code and other data into "FLASH" Rom type memory */
+ /* The program code and other data into "APP" Rom type memory */
.text :
{
. = ALIGN(4);
@@ -66,22 +67,22 @@ SECTIONS
. = ALIGN(4);
_etext = .; /* define a global symbols at end of code */
- } >FLASH
+ } >APP
- /* Constant data into "FLASH" Rom type memory */
+ /* Constant data into "APP" Rom type memory */
.rodata :
{
. = ALIGN(4);
*(.rodata) /* .rodata sections (constants, strings, etc.) */
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
. = ALIGN(4);
- } >FLASH
+ } >APP
.ARM.extab : {
. = ALIGN(4);
*(.ARM.extab* .gnu.linkonce.armextab.*)
. = ALIGN(4);
- } >FLASH
+ } >APP
.ARM : {
. = ALIGN(4);
@@ -89,7 +90,7 @@ SECTIONS
*(.ARM.exidx*)
__exidx_end = .;
. = ALIGN(4);
- } >FLASH
+ } >APP
.preinit_array :
{
@@ -98,7 +99,7 @@ SECTIONS
KEEP (*(.preinit_array*))
PROVIDE_HIDDEN (__preinit_array_end = .);
. = ALIGN(4);
- } >FLASH
+ } >APP
.init_array :
{
@@ -108,7 +109,7 @@ SECTIONS
KEEP (*(.init_array*))
PROVIDE_HIDDEN (__init_array_end = .);
. = ALIGN(4);
- } >FLASH
+ } >APP
.fini_array :
{
@@ -118,7 +119,7 @@ SECTIONS
KEEP (*(.fini_array*))
PROVIDE_HIDDEN (__fini_array_end = .);
. = ALIGN(4);
- } >FLASH
+ } >APP
/* Used by the startup to initialize data */
_sidata = LOADADDR(.data);
@@ -136,7 +137,7 @@ SECTIONS
. = ALIGN(4);
_edata = .; /* define a global symbol at data end */
- } >RAM AT> FLASH
+ } >RAM AT> APP
/* Uninitialized data section into "RAM" Ram type memory */
. = ALIGN(4);
diff --git a/STM32/STM32F103ZETX_FLASH_debug.ld b/STM32/STM32F103ZETX_FLASH_debug.ld
index 92497f4..0baefba 100644
--- a/STM32/STM32F103ZETX_FLASH_debug.ld
+++ b/STM32/STM32F103ZETX_FLASH_debug.ld
@@ -3,7 +3,7 @@
* @file LinkerScript.ld
* @author Auto-generated by STM32CubeIDE
* @brief Linker script for STM32F103ZETx Device from STM32F1 series
- * 512Kbytes FLASH
+ * 512Kbytes APP
* 64Kbytes RAM
*
* Set heap size, stack size and stack location according
@@ -37,21 +37,21 @@ _Min_Stack_Size = 0x400 ; /* required amount of stack */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
- FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 192K
+ APP (rx) : ORIGIN = 0x08000000, LENGTH = 192K
}
/* Sections */
SECTIONS
{
- /* The startup code into "FLASH" Rom type memory */
+ /* The startup code into "APP" Rom type memory */
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
- } >FLASH
+ } >APP
- /* The program code and other data into "FLASH" Rom type memory */
+ /* The program code and other data into "APP" Rom type memory */
.text :
{
. = ALIGN(4);
@@ -66,22 +66,22 @@ SECTIONS
. = ALIGN(4);
_etext = .; /* define a global symbols at end of code */
- } >FLASH
+ } >APP
- /* Constant data into "FLASH" Rom type memory */
+ /* Constant data into "APP" Rom type memory */
.rodata :
{
. = ALIGN(4);
*(.rodata) /* .rodata sections (constants, strings, etc.) */
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
. = ALIGN(4);
- } >FLASH
+ } >APP
.ARM.extab : {
. = ALIGN(4);
*(.ARM.extab* .gnu.linkonce.armextab.*)
. = ALIGN(4);
- } >FLASH
+ } >APP
.ARM : {
. = ALIGN(4);
@@ -89,7 +89,7 @@ SECTIONS
*(.ARM.exidx*)
__exidx_end = .;
. = ALIGN(4);
- } >FLASH
+ } >APP
.preinit_array :
{
@@ -98,7 +98,7 @@ SECTIONS
KEEP (*(.preinit_array*))
PROVIDE_HIDDEN (__preinit_array_end = .);
. = ALIGN(4);
- } >FLASH
+ } >APP
.init_array :
{
@@ -108,7 +108,7 @@ SECTIONS
KEEP (*(.init_array*))
PROVIDE_HIDDEN (__init_array_end = .);
. = ALIGN(4);
- } >FLASH
+ } >APP
.fini_array :
{
@@ -118,7 +118,7 @@ SECTIONS
KEEP (*(.fini_array*))
PROVIDE_HIDDEN (__fini_array_end = .);
. = ALIGN(4);
- } >FLASH
+ } >APP
/* Used by the startup to initialize data */
_sidata = LOADADDR(.data);
@@ -136,7 +136,7 @@ SECTIONS
. = ALIGN(4);
_edata = .; /* define a global symbol at data end */
- } >RAM AT> FLASH
+ } >RAM AT> APP
/* Uninitialized data section into "RAM" Ram type memory */
. = ALIGN(4);
diff --git a/STM32_bootloader/Core/Inc/main.h b/STM32_bootloader/Core/Inc/main.h
index 56163fa..babaf96 100644
--- a/STM32_bootloader/Core/Inc/main.h
+++ b/STM32_bootloader/Core/Inc/main.h
@@ -32,17 +32,14 @@ extern "C" {
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
-
/* USER CODE END Includes */
/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */
-
/* USER CODE END ET */
/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */
-
/* USER CODE END EC */
/* Exported macro ------------------------------------------------------------*/
@@ -60,9 +57,6 @@ void Error_Handler(void);
/* USER CODE END EFP */
/* Private defines -----------------------------------------------------------*/
-#define MSD_ADDRESS 0x8010000
-#define MSD_BLOCK_SIZE 2048
-#define MSD_BLOCK_COUNT 192 * 1024 / MSD_BLOCK_SIZE
#define M2_Pin GPIO_PIN_0
#define M2_GPIO_Port GPIOA
#define WS2812_Pin GPIO_PIN_2
@@ -78,9 +72,6 @@ void Error_Handler(void);
#define IRQ_Pin GPIO_PIN_7
#define IRQ_GPIO_Port GPIOB
/* USER CODE BEGIN Private defines */
-#define APP_ADDRESS 0x08040000
-#define WRITE_TO_FLASH_TIME 1500
-#define FIRMWARE_FILE "FamicomDumper.bin"
/* USER CODE END Private defines */
#ifdef __cplusplus
diff --git a/STM32_bootloader/Core/Src/led.c b/STM32_bootloader/Core/Src/led.c
index b39153b..a753cd5 100644
--- a/STM32_bootloader/Core/Src/led.c
+++ b/STM32_bootloader/Core/Src/led.c
@@ -3,85 +3,7 @@
extern TIM_HandleTypeDef htim5;
static uint8_t pwm_values[8 * 3 + 1];
-static uint32_t idle_timer_start = 0;
static uint32_t last_led_update_time = 0;
-static double idle_hue = 240;
-static double idle_hue_speed = 0.05;
-static double idle_value = 0.25;
-
-typedef struct
-{
- double r; // a fraction between 0 and 1
- double g; // a fraction between 0 and 1
- double b; // a fraction between 0 and 1
-} rgb;
-
-typedef struct
-{
- double h; // angle in degrees
- double s; // a fraction between 0 and 1
- double v; // a fraction between 0 and 1
-} hsv;
-
-static rgb hsv2rgb(hsv in)
-{
- double hh, p, q, t, ff;
- long i;
- rgb out;
- if (in.s <= 0.0)
- { // < is bogus, just shuts up warnings
- out.r = in.v;
- out.g = in.v;
- out.b = in.v;
- return out;
- }
- hh = in.h;
- while (hh > 360)
- hh -= 360;
- hh /= 60.0;
- i = (long) hh;
- ff = hh - i;
- p = in.v * (1.0 - in.s);
- q = in.v * (1.0 - (in.s * ff));
- t = in.v * (1.0 - (in.s * (1.0 - ff)));
-
- switch (i)
- {
- case 0:
- out.r = in.v;
- out.g = t;
- out.b = p;
- break;
- case 1:
- out.r = q;
- out.g = in.v;
- out.b = p;
- break;
- case 2:
- out.r = p;
- out.g = in.v;
- out.b = t;
- break;
-
- case 3:
- out.r = p;
- out.g = q;
- out.b = in.v;
- break;
- case 4:
- out.r = t;
- out.g = p;
- out.b = in.v;
- break;
- case 5:
- default:
- out.r = in.v;
- out.g = p;
- out.b = q;
- break;
- }
- return out;
-}
static void update_led()
{
@@ -112,59 +34,39 @@ void set_led_color(uint8_t r, uint8_t g, uint8_t b)
void led_off()
{
set_led_color(0x00, 0x00, 0x00);
- idle_timer_start = HAL_GetTick();
- idle_value = 0;
}
void led_white()
{
- set_led_color(0x40, 0x40, 0x40);
+ set_led_color(0xFF, 0xFF, 0xFF);
}
void led_green()
{
- set_led_color(0x00, 0x80, 0x00);
+ set_led_color(0x00, 0xFF, 0x00);
}
void led_red()
{
- set_led_color(0x80, 0x00, 0x00);
+ set_led_color(0xFF, 0x00, 0x00);
}
void led_yellow()
{
- set_led_color(0x80, 0x80, 0x00);
+ set_led_color(0xFF, 0xFF, 0x00);
}
void led_blue()
{
- set_led_color(0x00, 0x00, 0x40);
+ set_led_color(0x00, 0x00, 0xFF);
}
void led_magenta()
{
- set_led_color(0x80, 0x00, 0x80);
+ set_led_color(0xFF, 0x00, 0xFF);
}
void led_cyan()
{
- set_led_color(0x00, 0x80, 0x80);
-}
-
-void led_idle()
-{
- if (idle_timer_start + 5000 < HAL_GetTick())
- {
- hsv h;
- h.h = idle_hue;
- h.s = 1;
- h.v = idle_value;
- rgb r = hsv2rgb(h);
- set_led_color(r.r * 0xFF, r.g * 0xFF, r.b * 0xFF);
- idle_hue += idle_hue_speed;
- if (idle_hue > 270 || idle_hue < 190)
- idle_hue_speed *= -1;
- if (idle_value < 0.25)
- idle_value += 0.0001;
- }
+ set_led_color(0x00, 0xFF, 0xFF);
}
diff --git a/STM32_bootloader/Core/Src/main.c b/STM32_bootloader/Core/Src/main.c
index f2e6d56..ba8b821 100644
--- a/STM32_bootloader/Core/Src/main.c
+++ b/STM32_bootloader/Core/Src/main.c
@@ -1,21 +1,21 @@
/* USER CODE BEGIN Header */
/**
- ******************************************************************************
- * @file : main.c
- * @brief : Main program body
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2022 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * 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
- *
- ******************************************************************************
- */
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2022 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * 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
+ *
+ ******************************************************************************
+ */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -24,6 +24,7 @@
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
+#include "bootloader.h"
#include "usbd_core.h"
#include "led.h"
/* USER CODE END Includes */
@@ -65,7 +66,8 @@ static void MX_TIM2_Init(void);
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
-static void start_app(void) {
+static void start_app(void)
+{
// App start address
void (*jmp_to_app)(void) = (void (*)(void))(*((volatile uint32_t*)(APP_ADDRESS + 4)));
// Vector table
@@ -75,22 +77,59 @@ static void start_app(void) {
jmp_to_app();
// Should not execute
- while (1) {}
+ while (1)
+ {}
}
-
static void error(void)
{
// Dispose resources, show red LED and stop
f_mount(NULL, "", 1);
HAL_FLASH_Lock();
- set_led_color(0xFF, 0x00, 0x00);
+ led_red();
HAL_Delay(50);
__disable_irq();
- while (1) {}
+ while (1)
+ {
+ }
+}
+
+static void write_hardware_version(void)
+{
+ uint32_t value;
+ uint32_t current_value;
+ HAL_StatusTypeDef hres;
+ FLASH_EraseInitTypeDef erase_init_struct;
+ uint32_t sector_error = 0;
+ uint8_t HARDWARE_VERSION[] = { HARDWARE_VERSION_MAJOR & 0xFF, (HARDWARE_VERSION_MAJOR >> 8) && 0xFF, HARDWARE_VERSION_MINOR, HARDWARE_VERSION_SUFFIX };
+
+ // Write hardware version
+ value = *(uint32_t*)HARDWARE_VERSION;
+ current_value = *(volatile uint32_t*)(HARDWARE_VERSION_ADDRESS);
+ if (value != current_value)
+ {
+ // Flash can be locked by FATFS
+ hres = HAL_FLASH_Unlock();
+ if (hres != HAL_OK)
+ error();
+ erase_init_struct.TypeErase = FLASH_TYPEERASE_PAGES;
+ erase_init_struct.PageAddress = HARDWARE_VERSION_ADDRESS;
+ erase_init_struct.NbPages = 1;
+ hres = HAL_FLASHEx_Erase(&erase_init_struct, &sector_error);
+ if (hres != HAL_OK)
+ error();
+ current_value = *(volatile uint32_t*)(HARDWARE_VERSION_ADDRESS);
+ hres = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, HARDWARE_VERSION_ADDRESS, value);
+ if (hres != HAL_OK)
+ error();
+ current_value = *(volatile uint32_t*)(HARDWARE_VERSION_ADDRESS);
+ if (value != current_value)
+ error();
+ HAL_FLASH_Lock();
+ }
}
-static void write_firmware(void)
+static void write_firmware(FILINFO *bin_file)
{
int i;
uint8_t buff[MSD_BLOCK_SIZE];
@@ -99,48 +138,50 @@ static void write_firmware(void)
FRESULT fr;
UINT br = 0;
uint32_t address = APP_ADDRESS;
- FLASH_EraseInitTypeDef EraseInitStruct;
- uint32_t SECTORError = 0;
+ FLASH_EraseInitTypeDef erase_init_struct;
+ uint32_t sector_error = 0;
HAL_StatusTypeDef hres;
- uint16_t value;
- HAL_StatusTypeDef hr;
+ uint32_t value;
// Unlock flash
- hr = HAL_FLASH_Unlock();
- if (hr != HAL_OK)
+ hres = HAL_FLASH_Unlock();
+ if (hres != HAL_OK)
error();
+
// Mount FAT file system
fr = f_mount(&FatFs, "", 1);
if (fr)
error();
// Open firmware file
- fr = f_open(&fil, FIRMWARE_FILE, FA_READ);
+ fr = f_open(&fil, bin_file->fname, FA_READ);
if (fr)
error();
- while (1) {
- // Read data
+ while (1)
+ {
+ // Read data
fr = f_read(&fil, buff, MSD_BLOCK_SIZE, &br);
if (fr)
error();
// Break if end of file
if (!br)
- break;
+ break;
if ((address % MSD_BLOCK_SIZE) != 0)
error();
// Erase flash page
- EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
- EraseInitStruct.PageAddress = address;
- EraseInitStruct.NbPages = 1;
- hres = HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError);
+ erase_init_struct.TypeErase = FLASH_TYPEERASE_PAGES;
+ erase_init_struct.PageAddress = address;
+ erase_init_struct.NbPages = 1;
+ hres = HAL_FLASHEx_Erase(&erase_init_struct, &sector_error);
if (hres != HAL_OK)
error();
// Write data
- for (i = 0; i < br; i += 2) {
- value = *(volatile uint16_t*) &buff[i];
- hres = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address, value);
+ for (i = 0; i < br; i += 4)
+ {
+ value = *(volatile uint32_t*) &buff[i];
+ hres = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, value);
if (hres != HAL_OK)
error();
- address += 2;
+ address += 4;
}
}
// Close file
@@ -148,15 +189,52 @@ static void write_firmware(void)
if (fr)
error();
// Delete file
- fr = f_unlink(FIRMWARE_FILE);
+ fr = f_unlink(bin_file->fname);
// Unmount
fr = f_mount(NULL, "", 1);
if (fr)
error();
+
// Lock flash
HAL_FLASH_Lock();
}
+int find_bin_file(FILINFO *bin_file)
+{
+ // Find first .bin file if any
+ int len, r = 0;
+ FATFS fs;
+ FRESULT res;
+ DIR dir;
+ FILINFO fno;
+
+ f_mount(&fs, "", 1);
+ res = f_opendir(&dir, "/");
+ if (res == FR_OK)
+ {
+ while (1)
+ {
+ res = f_readdir(&dir, &fno);
+ if (res != FR_OK || fno.fname[0] == 0)
+ break;
+ if (!(fno.fattrib & AM_DIR) && (fno.fsize != 0))
+ {
+ len = strlen(fno.fname);
+ if ((len > 4) && (fno.fname[len - 4] == '.') && (fno.fname[len - 3] == 'B') && (fno.fname[len - 2] == 'I') && (fno.fname[len - 1] == 'N'))
+ {
+ memcpy(bin_file, &fno, sizeof(FILINFO));
+ r = 1;
+ break;
+ }
+ }
+ }
+ }
+ f_closedir(&dir);
+ f_mount(NULL, "", 1);
+
+ return r;
+}
+
/* USER CODE END 0 */
/**
@@ -187,6 +265,7 @@ int main(void)
MX_DMA_Init();
MX_TIM5_Init();
MX_TIM2_Init();
+ write_hardware_version();
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_Delay(10);
// If IRQ pin not grounded - start app
@@ -194,16 +273,17 @@ int main(void)
if (HAL_GPIO_ReadPin(IRQ_GPIO_Port, IRQ_Pin)) start_app();
#endif
// Green LED
- set_led_color(0x00, 0xFF, 0x00);
+ led_green();
// Need to release pin during one second
HAL_Delay(1000);
// If IRQ pin not released...
- if (!HAL_GPIO_ReadPin(IRQ_GPIO_Port, IRQ_Pin)) {
- // Turn off LED
- set_led_color(0x00, 0x00, 0x00);
- HAL_Delay(50);
- // Start app
- start_app();
+ if (!HAL_GPIO_ReadPin(IRQ_GPIO_Port, IRQ_Pin))
+ {
+ // Turn off the LED
+ led_off();
+ HAL_Delay(50);
+ // Start app
+ start_app();
}
/* USER CODE END SysInit */
@@ -216,38 +296,35 @@ int main(void)
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
// Yellow LED
- set_led_color(0xFF, 0xFF, 0x00);
- /*
- */
-
+ led_yellow();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
- // Check if last write operation was long time ago
- if (last_write_ts && (HAL_GetTick() - last_write_ts >= WRITE_TO_FLASH_TIME)) {
- FATFS FatFs;
- FRESULT fr;
- // Mount FAT file system and check if firmware file exists
- f_mount(&FatFs, "", 1);
- fr = f_stat(FIRMWARE_FILE, NULL);
- f_mount(NULL, "", 1);
- if (fr == FR_OK) {
- // White LED
- set_led_color(0xFF, 0xFF, 0xFF);
+ // Check if last write operation was long time ago
+ if (last_write_ts && (HAL_GetTick() - last_write_ts >= WRITE_TO_FLASH_TIME))
+ {
+ FILINFO fno;
+ if (find_bin_file(&fno))
+ {
+ // White LED
+ led_white();
// Disable USB MSD
USBD_DeInit(&hUsbDeviceFS);
// Write firmware
- write_firmware();
+ write_firmware(&fno);
// Turn off the LED
- set_led_color(0x00, 0x00, 0x00);
+ led_off();
HAL_Delay(50);
// Stop
__disable_irq();
- while (1) { }
- } else {
+ while (1)
+ {
+ }
+ } else
+ {
last_write_ts = 0;
}
}
diff --git a/STM32_bootloader/FATFS/Target/ffconf.h b/STM32_bootloader/FATFS/Target/ffconf.h
index 39c6e29..3614c80 100644
--- a/STM32_bootloader/FATFS/Target/ffconf.h
+++ b/STM32_bootloader/FATFS/Target/ffconf.h
@@ -113,7 +113,7 @@
/ 874 - Thai (OEM, Windows)
/ 1 - ASCII (No extended character. Valid for only non-LFN configuration.) */
-#define _USE_LFN 3 /* 0 to 3 */
+#define _USE_LFN 0 /* 0 to 3 */
#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */
/* The _USE_LFN option switches the LFN feature.
/
diff --git a/STM32_bootloader/FATFS/Target/user_diskio.c b/STM32_bootloader/FATFS/Target/user_diskio.c
index a30393f..25b4a68 100644
--- a/STM32_bootloader/FATFS/Target/user_diskio.c
+++ b/STM32_bootloader/FATFS/Target/user_diskio.c
@@ -36,6 +36,7 @@
/* Includes ------------------------------------------------------------------*/
#include <string.h>
#include "ff_gen_drv.h"
+#include "bootloader.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
@@ -156,12 +157,12 @@ DRESULT USER_write (
if (res != HAL_OK)
return RES_ERROR;
- FLASH_EraseInitTypeDef EraseInitStruct;
- uint32_t SECTORError = 0;
- EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
- EraseInitStruct.PageAddress = address;
- EraseInitStruct.NbPages = count;
- res = HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError);
+ FLASH_EraseInitTypeDef erase_init_struct;
+ uint32_t sector_error = 0;
+ erase_init_struct.TypeErase = FLASH_TYPEERASE_PAGES;
+ erase_init_struct.PageAddress = address;
+ erase_init_struct.NbPages = count;
+ res = HAL_FLASHEx_Erase(&erase_init_struct, &sector_error);
if (res != HAL_OK) {
HAL_FLASH_Lock();
return RES_ERROR;
diff --git a/STM32_bootloader/FamicomDumperBootloader.ioc b/STM32_bootloader/FamicomDumperBootloader.ioc
index 71a22a4..9d65b0c 100644
--- a/STM32_bootloader/FamicomDumperBootloader.ioc
+++ b/STM32_bootloader/FamicomDumperBootloader.ioc
@@ -15,7 +15,7 @@ FATFS._MAX_SS=2048
FATFS._MIN_SS=2048
FATFS._STRF_ENCODE=0
FATFS._USE_FASTSEEK=0
-FATFS._USE_LFN=3
+FATFS._USE_LFN=0
FATFS._USE_MKFS=0
FATFS._WORD_ACCESS=1
File.Version=6
@@ -56,7 +56,7 @@ Mcu.Pin8=PA14
Mcu.Pin9=PD4
Mcu.PinsNb=19
Mcu.ThirdPartyNb=0
-Mcu.UserConstants=MSD_ADDRESS,0x8010000;MSD_BLOCK_SIZE,2048;MSD_BLOCK_COUNT,192 * 1024 / MSD_BLOCK_SIZE
+Mcu.UserConstants=
Mcu.UserName=STM32F103ZETx
MxCube.Version=6.5.0
MxDb.Version=DB.6.0.50
diff --git a/STM32_bootloader/Middlewares/Third_Party/FatFs/src/option/ccsbcs.c b/STM32_bootloader/Middlewares/Third_Party/FatFs/src/option/ccsbcs.c
deleted file mode 100644
index 49a5bea..0000000
--- a/STM32_bootloader/Middlewares/Third_Party/FatFs/src/option/ccsbcs.c
+++ /dev/null
@@ -1,540 +0,0 @@
-/*------------------------------------------------------------------------*/
-/* Unicode - Local code bidirectional converter (C)ChaN, 2012 */
-/* (SBCS code pages) */
-/*------------------------------------------------------------------------*/
-/* 437 U.S. (OEM)
-/ 720 Arabic (OEM)
-/ 1256 Arabic (Windows)
-/ 737 Greek (OEM)
-/ 1253 Greek (Windows)
-/ 1250 Central Europe (Windows)
-/ 775 Baltic (OEM)
-/ 1257 Baltic (Windows)
-/ 850 Multilingual Latin 1 (OEM)
-/ 852 Latin 2 (OEM)
-/ 1252 Latin 1 (Windows)
-/ 855 Cyrillic (OEM)
-/ 1251 Cyrillic (Windows)
-/ 866 Russian (OEM)
-/ 857 Turkish (OEM)
-/ 1254 Turkish (Windows)
-/ 858 Multilingual Latin 1 + Euro (OEM)
-/ 862 Hebrew (OEM)
-/ 1255 Hebrew (Windows)
-/ 874 Thai (OEM, Windows)
-/ 1258 Vietnam (OEM, Windows)
-*/
-
-#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 == 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 == 858
-#define _TBLDEF 1
-static
-const WCHAR Tbl[] = { /* CP858(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, 0x2550, 0x00A2, 0x00A5, 0x2510,
- 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3,
- 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4,
- 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x20AC, 0x00CD, 0x00CE,
- 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00C6, 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 == 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 == 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 == 874
-#define _TBLDEF 1
-static
-const WCHAR Tbl[] = { /* CP874(0x80-0xFF) to Unicode conversion table */
- 0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07,
- 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
- 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17,
- 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
- 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,
- 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,
- 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37,
- 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F,
- 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47,
- 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
- 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57,
- 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000
-};
-
-#elif _CODE_PAGE == 1250
-#define _TBLDEF 1
-static
-const WCHAR Tbl[] = { /* CP1250(0x80-0xFF) to Unicode conversion table */
- 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A,
- 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,
- 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C,
- 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
- 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
- 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
- 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
- 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
- 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
- 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
- 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9
-};
-
-#elif _CODE_PAGE == 1251
-#define _TBLDEF 1
-static
-const WCHAR Tbl[] = { /* CP1251(0x80-0xFF) to Unicode conversion table */
- 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
- 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x0000, 0x2111, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
- 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,
- 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
- 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,
- 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
- 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,
- 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
- 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F
-};
-
-#elif _CODE_PAGE == 1252
-#define _TBLDEF 1
-static
-const WCHAR Tbl[] = { /* CP1252(0x80-0xFF) to Unicode conversion table */
- 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
- 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
- 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
- 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
- 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
- 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
-};
-
-#elif _CODE_PAGE == 1253
-#define _TBLDEF 1
-static
-const WCHAR Tbl[] = { /* CP1253(0x80-0xFF) to Unicode conversion table */
- 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x0000, 0x2030, 0x0000, 0x2039, 0x000C, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7,
- 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
- 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
- 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
- 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
- 0x03A8, 0x03A9, 0x03AA, 0x03AD, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
- 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
- 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
- 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
- 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000
-};
-
-#elif _CODE_PAGE == 1254
-#define _TBLDEF 1
-static
-const WCHAR Tbl[] = { /* CP1254(0x80-0xFF) to Unicode conversion table */
- 0x20AC, 0x0000, 0x210A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
- 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
- 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
- 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
- 0x00D8, 0x00D9, 0x00DA, 0x00BD, 0x00DC, 0x0130, 0x015E, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
- 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF
-};
-
-#elif _CODE_PAGE == 1255
-#define _TBLDEF 1
-static
-const WCHAR Tbl[] = { /* CP1255(0x80-0xFF) to Unicode conversion table */
- 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
- 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7,
- 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF,
- 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3,
- 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 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, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000
-};
-
-#elif _CODE_PAGE == 1256
-#define _TBLDEF 1
-static
-const WCHAR Tbl[] = { /* CP1256(0x80-0xFF) to Unicode conversion table */
- 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
- 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,
- 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,
- 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
- 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
- 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7,
- 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0640, 0x0642, 0x0643,
- 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,
- 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7,
- 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2
-};
-
-#elif _CODE_PAGE == 1257
-#define _TBLDEF 1
-static
-const WCHAR Tbl[] = { /* CP1257(0x80-0xFF) to Unicode conversion table */
- 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000,
- 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7,
- 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
- 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,
- 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
- 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,
- 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
- 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113,
- 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
- 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
- 0x0173, 0x014E, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9
-};
-
-#elif _CODE_PAGE == 1258
-#define _TBLDEF 1
-static
-const WCHAR Tbl[] = { /* CP1258(0x80-0xFF) to Unicode conversion table */
- 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
- 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
- 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF,
- 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7,
- 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF,
- 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7,
- 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF
-};
-
-#endif
-
-
-#if !_TBLDEF || !_USE_LFN
-#error This file is not needed in 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 OEMCP, 1: OEMCP to Unicode */
-)
-{
- WCHAR c;
-
-
- if (chr < 0x80) { /* ASCII */
- c = chr;
-
- } else {
- if (dir) { /* OEMCP to Unicode */
- c = (chr >= 0x100) ? 0 : Tbl[chr - 0x80];
-
- } else { /* Unicode to OEMCP */
- for (c = 0; c < 0x80; c++) {
- if (chr == Tbl[c]) break;
- }
- c = (c + 0x80) & 0xFF;
- }
- }
-
- return c;
-}
-
-
-WCHAR ff_wtoupper ( /* Upper converted character */
- WCHAR chr /* Input character */
-)
-{
- static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 };
- static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 };
- int i;
-
-
- for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ;
-
- return tbl_lower[i] ? tbl_upper[i] : chr;
-}
diff --git a/STM32_bootloader/USB_DEVICE/App/usbd_storage_if.c b/STM32_bootloader/USB_DEVICE/App/usbd_storage_if.c
index 7552959..d2a8fe4 100644
--- a/STM32_bootloader/USB_DEVICE/App/usbd_storage_if.c
+++ b/STM32_bootloader/USB_DEVICE/App/usbd_storage_if.c
@@ -23,7 +23,7 @@
#include "usbd_storage_if.h"
/* USER CODE BEGIN INCLUDE */
-
+#include "bootloader.h"
/* USER CODE END INCLUDE */
/* Private typedef -----------------------------------------------------------*/
@@ -259,12 +259,12 @@ int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t b
res = HAL_FLASH_Unlock();
if (res != HAL_OK) return USBD_FAIL;
- FLASH_EraseInitTypeDef EraseInitStruct;
- uint32_t SECTORError = 0;
- EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
- EraseInitStruct.PageAddress = address;
- EraseInitStruct.NbPages = blk_len;
- res = HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError);
+ FLASH_EraseInitTypeDef erase_init_struct;
+ uint32_t sector_error = 0;
+ erase_init_struct.TypeErase = FLASH_TYPEERASE_PAGES;
+ erase_init_struct.PageAddress = address;
+ erase_init_struct.NbPages = blk_len;
+ res = HAL_FLASHEx_Erase(&erase_init_struct, &sector_error);
if (res != HAL_OK) {
HAL_FLASH_Lock();
return USBD_FAIL;
diff --git a/STM32_bootloader/USB_DEVICE/Target/usbd_conf.c b/STM32_bootloader/USB_DEVICE/Target/usbd_conf.c
index 05b2a33..d16e5b5 100644
--- a/STM32_bootloader/USB_DEVICE/Target/usbd_conf.c
+++ b/STM32_bootloader/USB_DEVICE/Target/usbd_conf.c
@@ -72,7 +72,9 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle)
if(pcdHandle->Instance==USB)
{
/* USER CODE BEGIN USB_MspInit 0 */
-
+ // Tweak to set max current to 500ma
+ uint16_t length;
+ *(USBD_MSC.GetFSConfigDescriptor(&length) + 8) = (500 / 2);
/* USER CODE END USB_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_USB_CLK_ENABLE();