e00a5d0761
- Moved main option from the portX parameter to the optionsX parameter. Added new option "path" for the disk, cdrom and floppy devices, "ports" for the USB hub and "file" for the USB printer. The legacy syntax is still supported. - Register USB device state after init() to ensure all options that may have effect on the save/restore list are applied. - Report available devices on top of log file similar to hdimage, network and sound modules. - Changed USB device type variable typein host controllers to int. - Prepared improved usbdev_ctl init / exit implementation. - TODO: Create list of USB devices dynamicly from available plugins.
119 lines
4.1 KiB
C++
119 lines
4.1 KiB
C++
/////////////////////////////////////////////////////////////////////////
|
|
// $Id$
|
|
/////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// UFI/CBI floppy disk storage device support
|
|
//
|
|
// Copyright (c) 2015 Benjamin David Lunt
|
|
// Copyright (C) 2015-2021 The Bochs Project
|
|
//
|
|
// This library is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
// License as published by the Free Software Foundation; either
|
|
// version 2 of the License, or (at your option) any later version.
|
|
//
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
// License along with this library; if not, write to the Free Software
|
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef BX_IODEV_USB_CBI_H
|
|
#define BX_IODEV_USB_CBI_H
|
|
|
|
#define UFI_TEST_UNIT_READY 0x00
|
|
#define UFI_REZERO 0x01
|
|
#define UFI_REQUEST_SENSE 0x03
|
|
#define UFI_FORMAT_UNIT 0x04
|
|
#define UFI_INQUIRY 0x12
|
|
#define UFI_START_STOP_UNIT 0x1B
|
|
#define UFI_SEND_DIAGNOSTIC 0x1D
|
|
#define UFI_PREVENT_ALLOW_REMOVAL 0x1E
|
|
#define UFI_READ_FORMAT_CAPACITIES 0x23
|
|
#define UFI_READ_CAPACITY 0x25
|
|
#define UFI_READ_10 0x28
|
|
#define UFI_WRITE_10 0x2A
|
|
#define UFI_SEEK_10 0x2B
|
|
#define UFI_WRITE_VERIFY 0x2E
|
|
#define UFI_VERIFY 0x2F
|
|
#define UFI_MODE_SELECT 0x55
|
|
#define UFI_MODE_SENSE 0x5A
|
|
#define UFI_READ_12 0xA8
|
|
#define UFI_WRITE_12 0xAA
|
|
|
|
class device_image_t;
|
|
|
|
class usb_cbi_device_c : public usb_device_c {
|
|
public:
|
|
usb_cbi_device_c(void);
|
|
virtual ~usb_cbi_device_c(void);
|
|
|
|
virtual bool init();
|
|
virtual bool set_option(const char *option);
|
|
virtual const char* get_info();
|
|
virtual void runtime_config(void);
|
|
void restore_handler(bx_list_c *conf);
|
|
|
|
virtual void handle_reset();
|
|
virtual int handle_control(int request, int value, int index, int length, Bit8u *data);
|
|
virtual int handle_data(USBPacket *p);
|
|
virtual void register_state_specific(bx_list_c *parent);
|
|
virtual void cancel_packet(USBPacket *p);
|
|
|
|
static void floppy_timer_handler(void *);
|
|
|
|
private:
|
|
struct {
|
|
// members set in constructor / init
|
|
bx_list_c *config;
|
|
char info_txt[BX_PATHNAME_LEN];
|
|
bool model; // 0 = bochs, 1 = teac
|
|
int statusbar_id;
|
|
int floppy_timer_index;
|
|
// members handled by runtime config
|
|
device_image_t *hdimage;
|
|
const char *fname;
|
|
char *image_mode;
|
|
bool inserted; // 0 = media not present
|
|
bool wp; // 0 = not write_protected, 1 = write_protected
|
|
bool status_changed;
|
|
// members handled by save/restore
|
|
Bit32u usb_len;
|
|
Bit32u data_len;
|
|
Bit32u sector;
|
|
Bit32u sector_count;
|
|
Bit8u cur_command;
|
|
Bit8u cur_track;
|
|
int sense;
|
|
int asc;
|
|
int fail_count;
|
|
bool did_inquiry_fail;
|
|
bool seek_pending;
|
|
Bit8u *usb_buf;
|
|
Bit8u *dev_buffer;
|
|
// members not handled by save/restore
|
|
USBPacket *packet;
|
|
} s;
|
|
|
|
bool handle_command(Bit8u *command);
|
|
void start_timer(Bit8u mode);
|
|
void floppy_timer(void);
|
|
int floppy_read_sector(void);
|
|
int floppy_write_sector(void);
|
|
void copy_data(USBPacket *p);
|
|
bool set_inserted(bool value);
|
|
|
|
static const char *floppy_path_handler(bx_param_string_c *param, int set,
|
|
const char *oldval, const char *val, int maxlen);
|
|
static Bit64s floppy_param_handler(bx_param_c *param, int set, Bit64s val);
|
|
|
|
static Bit64s param_save_handler(void *devptr, bx_param_c *param);
|
|
static void param_restore_handler(void *devptr, bx_param_c *param, Bit64s val);
|
|
};
|
|
|
|
#endif
|