73 lines
2.4 KiB
C++
73 lines
2.4 KiB
C++
#ifndef ADAFRUIT_FLOPPY_H
|
|
#define ADAFRUIT_FLOPPY_H
|
|
|
|
#include "Arduino.h"
|
|
#include <Adafruit_SPIDevice.h>
|
|
|
|
#define MAX_TRACKS 80
|
|
#define STEP_OUT HIGH
|
|
#define STEP_IN LOW
|
|
#define MAX_FLUX_PULSE_PER_TRACK \
|
|
(uint32_t)(500000UL / 5 * \
|
|
1.5) // 500khz / 5 hz per track rotation, 1.5 rotations
|
|
|
|
#define BUSTYPE_IBMPC 1
|
|
#define BUSTYPE_SHUGART 2
|
|
|
|
/**************************************************************************/
|
|
/*!
|
|
@brief A helper class for chattin with floppy drives
|
|
*/
|
|
/**************************************************************************/
|
|
class Adafruit_Floppy {
|
|
public:
|
|
Adafruit_Floppy(int8_t densitypin, int8_t indexpin, int8_t selectpin,
|
|
int8_t motorpin, int8_t directionpin, int8_t steppin,
|
|
int8_t wrdatapin, int8_t wrgatepin, int8_t track0pin,
|
|
int8_t protectpin, int8_t rddatapin, int8_t sidepin,
|
|
int8_t readypin);
|
|
void begin(void);
|
|
void soft_reset(void);
|
|
|
|
void select(bool selected);
|
|
bool spin_motor(bool motor_on);
|
|
bool goto_track(uint8_t track);
|
|
void side(uint8_t head);
|
|
int8_t track(void);
|
|
void step(bool dir, uint8_t times);
|
|
|
|
uint32_t capture_track(uint8_t *pulses, uint32_t max_pulses)
|
|
__attribute__((optimize("O3")));
|
|
void print_pulse_bins(uint8_t *pulses, uint32_t num_pulses,
|
|
uint8_t max_bins = 64);
|
|
void print_pulses(uint8_t *pulses, uint32_t num_pulses);
|
|
|
|
int8_t led_pin = LED_BUILTIN; ///< Debug LED output for tracing
|
|
|
|
uint16_t select_delay_us = 10; ///< delay after drive select (usecs)
|
|
uint16_t step_delay_us = 10000; ///< delay between head steps (usecs)
|
|
uint16_t settle_delay_ms = 15; ///< settle delay after seek (msecs)
|
|
uint16_t motor_delay_ms = 1000; ///< delay after motor on (msecs)
|
|
uint16_t watchdog_delay_ms =
|
|
1000; ///< quiescent time until drives reset (msecs)
|
|
uint8_t bus_type = BUSTYPE_IBMPC; ///< what kind of floppy drive we're using
|
|
|
|
Stream *debug_serial = NULL; ///< optional debug stream for serial output
|
|
|
|
private:
|
|
void wait_for_index_pulse_low(void);
|
|
|
|
// theres a lot of GPIO!
|
|
int8_t _densitypin, _indexpin, _selectpin, _motorpin, _directionpin, _steppin,
|
|
_wrdatapin, _wrgatepin, _track0pin, _protectpin, _rddatapin, _sidepin,
|
|
_readypin;
|
|
|
|
int8_t _track = -1;
|
|
|
|
#ifdef BUSIO_USE_FAST_PINIO
|
|
BusIO_PortReg *indexPort;
|
|
BusIO_PortMask indexMask;
|
|
#endif
|
|
};
|
|
|
|
#endif
|