Compare commits
6 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7fff3e451e | ||
|
|
888970a9d7 | ||
|
|
3e459c9d54 | ||
|
|
8d42b1b8de | ||
|
|
34beef28a9 | ||
|
|
cd73a4873d |
14 changed files with 55 additions and 50 deletions
4
Makefile
4
Makefile
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
export FW_VER := 2.13
|
export FW_VER := 2.14
|
||||||
|
|
||||||
PROJ := FlashFloppy
|
PROJ := FlashFloppy
|
||||||
VER := v$(FW_VER)
|
VER := v$(FW_VER)
|
||||||
|
|
@ -29,7 +29,7 @@ gotek: all
|
||||||
|
|
||||||
HXC_FF_URL := https://www.github.com/keirf/HxC_FF_File_Selector
|
HXC_FF_URL := https://www.github.com/keirf/HxC_FF_File_Selector
|
||||||
HXC_FF_URL := $(HXC_FF_URL)/releases/download
|
HXC_FF_URL := $(HXC_FF_URL)/releases/download
|
||||||
HXC_FF_VER := v6-FF
|
HXC_FF_VER := v8-FF
|
||||||
|
|
||||||
dist:
|
dist:
|
||||||
rm -rf flashfloppy-*
|
rm -rf flashfloppy-*
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,15 @@
|
||||||
** Keir Fraser <keir.xen@gmail.com>
|
** Keir Fraser <keir.xen@gmail.com>
|
||||||
************************************
|
************************************
|
||||||
|
|
||||||
|
** v2.14 - 27 December 2019
|
||||||
|
- IMG: Fix density-select pin output for HD images
|
||||||
|
- Fixes 'pin02=dens' and 'interface=ibmpc-hdout'
|
||||||
|
- Bug has existed since v2.2a
|
||||||
|
- HxC Compat, v8-FF: Fixes startup crash on Atari ST
|
||||||
|
- USB: Fix buffer overflow when parsing string descriptors
|
||||||
|
- Fixes crash with recent SanDisk Ultra Fit drives
|
||||||
|
- GCC9 build fixes
|
||||||
|
|
||||||
** v2.13 - 7 June 2019
|
** v2.13 - 7 June 2019
|
||||||
- HFE: Fix read buffering error
|
- HFE: Fix read buffering error
|
||||||
- Update HxC Compat to v6-FF
|
- Update HxC Compat to v6-FF
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ int get_next_opt(struct opts *opts);
|
||||||
#define OPT_section -2
|
#define OPT_section -2
|
||||||
|
|
||||||
/* FF.CFG options structure. */
|
/* FF.CFG options structure. */
|
||||||
struct __packed ff_cfg {
|
struct packed ff_cfg {
|
||||||
/* Bump version for every incompatible change to structure layout.
|
/* Bump version for every incompatible change to structure layout.
|
||||||
* No need to bump for new fields appended to this structure. */
|
* No need to bump for new fields appended to this structure. */
|
||||||
#define FFCFG_VERSION 2
|
#define FFCFG_VERSION 2
|
||||||
|
|
|
||||||
4
inc/da.h
4
inc/da.h
|
|
@ -14,7 +14,7 @@
|
||||||
#define DA_DD_MFM_CYL (DA_FIRST_CYL + 1)
|
#define DA_DD_MFM_CYL (DA_FIRST_CYL + 1)
|
||||||
|
|
||||||
/* Direct-Access Mode: Returned in sector 0 of direct-access track. */
|
/* Direct-Access Mode: Returned in sector 0 of direct-access track. */
|
||||||
struct __packed da_status_sector {
|
struct packed da_status_sector {
|
||||||
char sig[8];
|
char sig[8];
|
||||||
char fw_ver[12];
|
char fw_ver[12];
|
||||||
uint32_t lba_base;
|
uint32_t lba_base;
|
||||||
|
|
@ -32,7 +32,7 @@ struct __packed da_status_sector {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Direct-Access Mode: Sent to us in sector 0 of direct-access track. */
|
/* Direct-Access Mode: Sent to us in sector 0 of direct-access track. */
|
||||||
struct __packed da_cmd_sector {
|
struct packed da_cmd_sector {
|
||||||
char sig[8];
|
char sig[8];
|
||||||
uint8_t cmd;
|
uint8_t cmd;
|
||||||
uint8_t param[8];
|
uint8_t param[8];
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
#include "stm32f10x_regs.h"
|
#include "stm32f10x_regs.h"
|
||||||
#include "stm32f10x.h"
|
#include "stm32f10x.h"
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* HXCSDFE.CFG file header. */
|
/* HXCSDFE.CFG file header. */
|
||||||
struct __packed hxcsdfe_cfg {
|
struct packed hxcsdfe_cfg {
|
||||||
char signature[16]; /* "HXCFECFGVx.y" */
|
char signature[16]; /* "HXCFECFGVx.y" */
|
||||||
uint8_t step_sound;
|
uint8_t step_sound;
|
||||||
uint8_t ihm_sound;
|
uint8_t ihm_sound;
|
||||||
|
|
@ -27,7 +27,7 @@ struct __packed hxcsdfe_cfg {
|
||||||
uint8_t startup_mode;
|
uint8_t startup_mode;
|
||||||
uint8_t enable_drive_b;
|
uint8_t enable_drive_b;
|
||||||
uint8_t index_mode;
|
uint8_t index_mode;
|
||||||
struct __packed {
|
struct packed {
|
||||||
uint8_t cfg_from_cfg;
|
uint8_t cfg_from_cfg;
|
||||||
uint8_t interfacemode;
|
uint8_t interfacemode;
|
||||||
uint8_t pin02_cfg;
|
uint8_t pin02_cfg;
|
||||||
|
|
@ -47,7 +47,7 @@ struct __packed hxcsdfe_cfg {
|
||||||
#define HXCSTARTUP_ejected 0x10
|
#define HXCSTARTUP_ejected 0x10
|
||||||
|
|
||||||
/* HXCFECFGV1.x slots start at offset 0x400: */
|
/* HXCFECFGV1.x slots start at offset 0x400: */
|
||||||
struct __packed v1_slot {
|
struct packed v1_slot {
|
||||||
char name[12];
|
char name[12];
|
||||||
uint8_t attributes;
|
uint8_t attributes;
|
||||||
uint32_t firstCluster;
|
uint32_t firstCluster;
|
||||||
|
|
@ -56,7 +56,7 @@ struct __packed v1_slot {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* HXCFECFGV2.x slots start at sector offset 'slots_position': */
|
/* HXCFECFGV2.x slots start at sector offset 'slots_position': */
|
||||||
struct __packed v2_slot {
|
struct packed v2_slot {
|
||||||
char type[3];
|
char type[3];
|
||||||
uint8_t attributes;
|
uint8_t attributes;
|
||||||
uint32_t firstCluster;
|
uint32_t firstCluster;
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ struct exception_frame {
|
||||||
/* Force a compilation error if condition is true */
|
/* Force a compilation error if condition is true */
|
||||||
#define BUILD_BUG_ON(cond) ({ _Static_assert(!(cond), "!(" #cond ")"); })
|
#define BUILD_BUG_ON(cond) ({ _Static_assert(!(cond), "!(" #cond ")"); })
|
||||||
|
|
||||||
#define __aligned(x) __attribute__((aligned(x)))
|
#define aligned(x) __attribute__((aligned(x)))
|
||||||
#define __packed __attribute((packed))
|
#define packed __attribute((packed))
|
||||||
#define always_inline __inline__ __attribute__((always_inline))
|
#define always_inline __inline__ __attribute__((always_inline))
|
||||||
|
|
||||||
#define likely(x) __builtin_expect(!!(x),1)
|
#define likely(x) __builtin_expect(!!(x),1)
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,6 @@ typedef char bool_t;
|
||||||
#define TRUE 1
|
#define TRUE 1
|
||||||
#define FALSE 0
|
#define FALSE 0
|
||||||
|
|
||||||
#define LONG_MAX ((long int)((~0UL)>>1))
|
|
||||||
#define LONG_MIN ((long int)~LONG_MAX)
|
|
||||||
|
|
||||||
#ifndef offsetof
|
#ifndef offsetof
|
||||||
#define offsetof(a,b) __builtin_offsetof(a,b)
|
#define offsetof(a,b) __builtin_offsetof(a,b)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ def main(argv):
|
||||||
gap = 16 - height
|
gap = 16 - height
|
||||||
tgap = gap // 2
|
tgap = gap // 2
|
||||||
bgap = gap - tgap
|
bgap = gap - tgap
|
||||||
out_f.write("const uint8_t %s[] __aligned(4) = {\n" % argv[2])
|
out_f.write("const uint8_t %s[] aligned(4) = {\n" % argv[2])
|
||||||
for line in in_f:
|
for line in in_f:
|
||||||
# Look for a new character encoding
|
# Look for a new character encoding
|
||||||
match = re.match("^ENCODING ([0-9]+)", line)
|
match = re.match("^ENCODING ([0-9]+)", line)
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@ static unsigned int oled_prep_buffer(void);
|
||||||
static volatile uint8_t refresh_count;
|
static volatile uint8_t refresh_count;
|
||||||
|
|
||||||
/* I2C data buffer. Data is DMAed to the I2C peripheral. */
|
/* I2C data buffer. Data is DMAed to the I2C peripheral. */
|
||||||
static uint8_t buffer[256] __aligned(4);
|
static uint8_t buffer[256] aligned(4);
|
||||||
|
|
||||||
/* Text buffer, rendered into I2C data and placed into buffer[]. */
|
/* Text buffer, rendered into I2C data and placed into buffer[]. */
|
||||||
static char text[2][40];
|
static char text[2][40];
|
||||||
|
|
|
||||||
|
|
@ -1465,15 +1465,6 @@ const struct image_handler xdf_image_handler = {
|
||||||
* Generic Handlers
|
* Generic Handlers
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static bool_t raw_open(struct image *im)
|
|
||||||
{
|
|
||||||
im->img.rpm = im->img.rpm ?: 300;
|
|
||||||
im->stk_per_rev = (stk_ms(200) * 300) / im->img.rpm;
|
|
||||||
volume_cache_init(im->bufs.write_data.p + 1024,
|
|
||||||
im->img.heap_bottom);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FSIZE_t raw_extend(struct image *im)
|
static FSIZE_t raw_extend(struct image *im)
|
||||||
{
|
{
|
||||||
unsigned int i, j, sz = im->img.base_off;
|
unsigned int i, j, sz = im->img.base_off;
|
||||||
|
|
@ -1661,6 +1652,20 @@ static void raw_setup_track(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool_t raw_open(struct image *im)
|
||||||
|
{
|
||||||
|
im->img.rpm = im->img.rpm ?: 300;
|
||||||
|
im->stk_per_rev = (stk_ms(200) * 300) / im->img.rpm;
|
||||||
|
|
||||||
|
volume_cache_init(im->bufs.write_data.p + 1024,
|
||||||
|
im->img.heap_bottom);
|
||||||
|
|
||||||
|
/* Initialise write_bc_ticks (used by floppy_insert to set outp_hden). */
|
||||||
|
raw_seek_track(im, 0, 0, 0);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
void process_data(struct image *im, void *p, unsigned int len)
|
void process_data(struct image *im, void *p, unsigned int len)
|
||||||
{
|
{
|
||||||
/* Pointer and size should be 4-byte aligned. */
|
/* Pointer and size should be 4-byte aligned. */
|
||||||
|
|
|
||||||
|
|
@ -531,7 +531,7 @@ static USBH_Status USBH_HandleEnum(USB_OTG_CORE_HANDLE *pdev, USBH_HOST *phost)
|
||||||
phost,
|
phost,
|
||||||
phost->device_prop.Dev_Desc.iManufacturer,
|
phost->device_prop.Dev_Desc.iManufacturer,
|
||||||
Local_Buffer ,
|
Local_Buffer ,
|
||||||
0xff) == USBH_OK)
|
sizeof(Local_Buffer)) == USBH_OK)
|
||||||
{
|
{
|
||||||
/* User callback for Manufacturing string */
|
/* User callback for Manufacturing string */
|
||||||
phost->usr_cb->ManufacturerString(Local_Buffer);
|
phost->usr_cb->ManufacturerString(Local_Buffer);
|
||||||
|
|
@ -552,7 +552,7 @@ static USBH_Status USBH_HandleEnum(USB_OTG_CORE_HANDLE *pdev, USBH_HOST *phost)
|
||||||
phost,
|
phost,
|
||||||
phost->device_prop.Dev_Desc.iProduct,
|
phost->device_prop.Dev_Desc.iProduct,
|
||||||
Local_Buffer,
|
Local_Buffer,
|
||||||
0xff) == USBH_OK)
|
sizeof(Local_Buffer)) == USBH_OK)
|
||||||
{
|
{
|
||||||
/* User callback for Product string */
|
/* User callback for Product string */
|
||||||
phost->usr_cb->ProductString(Local_Buffer);
|
phost->usr_cb->ProductString(Local_Buffer);
|
||||||
|
|
@ -573,7 +573,7 @@ static USBH_Status USBH_HandleEnum(USB_OTG_CORE_HANDLE *pdev, USBH_HOST *phost)
|
||||||
phost,
|
phost,
|
||||||
phost->device_prop.Dev_Desc.iSerialNumber,
|
phost->device_prop.Dev_Desc.iSerialNumber,
|
||||||
Local_Buffer,
|
Local_Buffer,
|
||||||
0xff) == USBH_OK)
|
sizeof(Local_Buffer)) == USBH_OK)
|
||||||
{
|
{
|
||||||
/* User callback for Serial number string */
|
/* User callback for Serial number string */
|
||||||
phost->usr_cb->SerialNumString(Local_Buffer);
|
phost->usr_cb->SerialNumString(Local_Buffer);
|
||||||
|
|
|
||||||
|
|
@ -135,7 +135,7 @@ USBH_Status USBH_Get_StringDesc(USB_OTG_CORE_HANDLE *pdev,
|
||||||
USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD,
|
USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD,
|
||||||
USB_DESC_STRING | string_index,
|
USB_DESC_STRING | string_index,
|
||||||
Cfg_Rx_Buffer,
|
Cfg_Rx_Buffer,
|
||||||
length)) == USBH_OK)
|
512)) == USBH_OK)
|
||||||
{
|
{
|
||||||
/* Commands successfully sent and Response Received */
|
/* Commands successfully sent and Response Received */
|
||||||
USBH_ParseStringDesc(Cfg_Rx_Buffer, buff, length);
|
USBH_ParseStringDesc(Cfg_Rx_Buffer, buff, length);
|
||||||
|
|
@ -522,30 +522,23 @@ static void USBH_ParseStringDesc (uint8_t* psrc,
|
||||||
uint8_t* pdest,
|
uint8_t* pdest,
|
||||||
uint16_t length)
|
uint16_t length)
|
||||||
{
|
{
|
||||||
uint16_t strlength;
|
/* Make sure the Descriptor is String Type */
|
||||||
uint16_t idx;
|
if (psrc[1] == USB_DESC_TYPE_STRING) {
|
||||||
|
|
||||||
/* The UNICODE string descriptor is not NULL-terminated. The string length is
|
/* The UNICODE string descriptor is not NUL-terminated. The string
|
||||||
computed by subtracting two from the value of the first byte of the descriptor.
|
* length is computed from the descriptor length. Divide by two
|
||||||
*/
|
* to account for UTF-16 encoding. */
|
||||||
|
length = min_t(uint16_t, psrc[0]/2 - 1, length - 1);
|
||||||
|
|
||||||
/* Check which is lower size, the Size of string or the length of bytes read
|
while (length--) {
|
||||||
from the device */
|
psrc += 2;
|
||||||
|
*pdest++ = *psrc;
|
||||||
if ( psrc[1] == USB_DESC_TYPE_STRING)
|
|
||||||
{ /* Make sure the Descriptor is String Type */
|
|
||||||
|
|
||||||
/* psrc[0] contains Size of Descriptor, subtract 2 to get the length of string */
|
|
||||||
strlength = ( ( (psrc[0]-2) <= length) ? (psrc[0]-2) :length);
|
|
||||||
psrc += 2; /* Adjust the offset ignoring the String Len and Descriptor type */
|
|
||||||
|
|
||||||
for (idx = 0; idx < strlength; idx+=2 )
|
|
||||||
{/* Copy Only the string and ignore the UNICODE ID, hence add the src */
|
|
||||||
*pdest = psrc[idx];
|
|
||||||
pdest++;
|
|
||||||
}
|
}
|
||||||
*pdest = 0; /* mark end of string */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Mark end of string. */
|
||||||
|
*pdest = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -134,7 +134,7 @@ size_t strnlen(const char *s, size_t maxlen)
|
||||||
|
|
||||||
int strcmp(const char *s1, const char *s2)
|
int strcmp(const char *s1, const char *s2)
|
||||||
{
|
{
|
||||||
return strncmp(s1, s2, ~0);
|
return strncmp(s1, s2, INT_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
int strncmp(const char *s1, const char *s2, size_t n)
|
int strncmp(const char *s1, const char *s2, size_t n)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue