- added runtime configuration parameters for USB cdrom drive
- scsi_device: changed some variable types - usb_hub: removed unused method
This commit is contained in:
parent
0a37bcfbdc
commit
11fa3b2c4a
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: scsi_device.cc,v 1.16 2009-04-05 16:28:35 vruppert Exp $
|
||||
// $Id: scsi_device.cc,v 1.17 2009-04-06 15:36:53 vruppert Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2007 Volker Ruppert
|
||||
@ -213,7 +213,7 @@ void scsi_device_t::scsi_read_data(Bit32u tag)
|
||||
scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
|
||||
return;
|
||||
}
|
||||
if (r->sector_count == -1) {
|
||||
if (r->sector_count == (Bit32u)-1) {
|
||||
BX_DEBUG(("read buf_len=%d", r->buf_len));
|
||||
r->sector_count = 0;
|
||||
completion(dev, SCSI_REASON_DATA, r->tag, r->buf_len);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: scsi_device.h,v 1.11 2009-04-05 16:28:35 vruppert Exp $
|
||||
// $Id: scsi_device.h,v 1.12 2009-04-06 15:36:54 vruppert Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2007 Volker Ruppert
|
||||
@ -52,8 +52,8 @@ enum scsi_reason {
|
||||
typedef struct SCSIRequest {
|
||||
scsi_device_t *dev;
|
||||
Bit32u tag;
|
||||
int sector;
|
||||
int sector_count;
|
||||
Bit64u sector;
|
||||
Bit32u sector_count;
|
||||
int buf_len;
|
||||
Bit8u dma_buf[SCSI_DMA_BUF_SIZE];
|
||||
Bit32u status;
|
||||
@ -80,6 +80,8 @@ public:
|
||||
Bit8u* scsi_get_buf(Bit32u tag);
|
||||
const char *get_serial_number() {return drive_serial_str;}
|
||||
void set_inserted(bx_bool value) {inserted = value;}
|
||||
bx_bool get_inserted() {return inserted;}
|
||||
|
||||
protected:
|
||||
SCSIRequest* scsi_new_request(Bit32u tag);
|
||||
void scsi_remove_request(SCSIRequest *r);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: usb_hub.h,v 1.3 2009-03-15 12:54:59 vruppert Exp $
|
||||
// $Id: usb_hub.h,v 1.4 2009-04-06 15:36:54 vruppert Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2009 Volker Ruppert
|
||||
@ -38,7 +38,6 @@ public:
|
||||
virtual int handle_data(USBPacket *p);
|
||||
virtual void register_state_specific(bx_list_c *parent);
|
||||
virtual void after_restore_state();
|
||||
const char *get_name() {return hub.config->get_name();}
|
||||
|
||||
private:
|
||||
struct {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: usb_msd.cc,v 1.21 2009-04-03 16:42:56 vruppert Exp $
|
||||
// $Id: usb_msd.cc,v 1.22 2009-04-06 15:36:54 vruppert Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2009 Volker Ruppert
|
||||
@ -131,17 +131,45 @@ static const Bit8u bx_msd_config_descriptor[] = {
|
||||
0x00 /* u8 ep_bInterval; */
|
||||
};
|
||||
|
||||
static int cdrom_count = 0;
|
||||
|
||||
|
||||
usb_msd_device_c::usb_msd_device_c(usbdev_type type, const char *filename)
|
||||
{
|
||||
char pname[10];
|
||||
char label[32];
|
||||
bx_param_string_c *path;
|
||||
bx_param_bool_c *status;
|
||||
|
||||
d.type = type;
|
||||
d.speed = USB_SPEED_FULL;
|
||||
memset((void*)&s, 0, sizeof(s));
|
||||
s.fname = filename;
|
||||
if (d.type == USB_DEV_TYPE_DISK) {
|
||||
strcpy(d.devname, "BOCHS USB HARDDRIVE");
|
||||
} else if (d.type == USB_DEV_TYPE_CDROM) {
|
||||
strcpy(d.devname, "BOCHS USB CDROM");
|
||||
// config options
|
||||
bx_list_c *usb_rt = (bx_list_c*)SIM->get_param(BXPN_MENU_RUNTIME_USB);
|
||||
sprintf(pname, "cdrom%d", ++cdrom_count);
|
||||
sprintf(label, "USB CD-ROM #%d Configuration", cdrom_count);
|
||||
s.config = new bx_list_c(usb_rt, pname, label, 2);
|
||||
s.config->set_options(bx_list_c::SERIES_ASK | bx_list_c::USE_BOX_TITLE);
|
||||
s.config->set_runtime_param(1);
|
||||
s.config->set_device_param(this);
|
||||
path = new bx_param_string_c(s.config, "path", "Path", "", "", BX_PATHNAME_LEN);
|
||||
path->set(s.fname);
|
||||
path->set_handler(cd_param_string_handler);
|
||||
path->set_runtime_param(1);
|
||||
status = new bx_param_bool_c(s.config, "status", "Inserted", "", 1);
|
||||
status->set_handler(cd_param_handler);
|
||||
status->set_runtime_param(1);
|
||||
// TODO: status
|
||||
#if BX_WITH_WX
|
||||
bx_list_c *usb = (bx_list_c*)SIM->get_param("ports.usb");
|
||||
usb->add(s.config);
|
||||
#endif
|
||||
}
|
||||
memset((void*)&s, 0, sizeof(s));
|
||||
s.fname = filename;
|
||||
|
||||
put("USBMS");
|
||||
}
|
||||
@ -154,6 +182,12 @@ usb_msd_device_c::~usb_msd_device_c(void)
|
||||
delete s.hdimage;
|
||||
} else if (s.cdrom != NULL) {
|
||||
delete s.cdrom;
|
||||
#if BX_WITH_WX
|
||||
bx_list_c *usb = (bx_list_c*)SIM->get_param("ports.usb");
|
||||
usb->remove(s.config->get_name());
|
||||
#endif
|
||||
bx_list_c *usb_rt = (bx_list_c*)SIM->get_param(BXPN_MENU_RUNTIME_USB);
|
||||
usb_rt->remove(s.config->get_name());
|
||||
}
|
||||
}
|
||||
|
||||
@ -568,4 +602,73 @@ void usb_msd_device_c::cancel_packet(USBPacket *p)
|
||||
s.scsi_len = 0;
|
||||
}
|
||||
|
||||
void usb_msd_device_c::set_inserted(bx_bool value)
|
||||
{
|
||||
const char *path;
|
||||
|
||||
if (value) {
|
||||
path = SIM->get_param_string("path", s.config)->getptr();
|
||||
if (!s.cdrom->insert_cdrom(path)) {
|
||||
SIM->get_param_bool("status", s.config)->set(0);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
s.cdrom->eject_cdrom();
|
||||
}
|
||||
s.scsi_dev->set_inserted(value);
|
||||
}
|
||||
|
||||
bx_bool usb_msd_device_c::get_inserted()
|
||||
{
|
||||
return s.scsi_dev->get_inserted();
|
||||
}
|
||||
|
||||
#undef LOG_THIS
|
||||
#define LOG_THIS cdrom->
|
||||
|
||||
// USB hub runtime parameter handlers
|
||||
const char *usb_msd_device_c::cd_param_string_handler(bx_param_string_c *param, int set,
|
||||
const char *oldval, const char *val, int maxlen)
|
||||
{
|
||||
usb_msd_device_c *cdrom;
|
||||
|
||||
if (set) {
|
||||
cdrom = (usb_msd_device_c*) param->get_parent()->get_device_param();
|
||||
if (cdrom != NULL) {
|
||||
bx_bool empty = ((strlen(val) == 0) || (!strcmp(val, "none")));
|
||||
if (!empty) {
|
||||
if (cdrom->get_inserted()) {
|
||||
BX_ERROR(("direct path change not supported (setting to 'none')"));
|
||||
param->set("none");
|
||||
}
|
||||
} else {
|
||||
SIM->get_param_bool("status", param->get_parent())->set(0);
|
||||
}
|
||||
} else {
|
||||
BX_PANIC(("cd_param_string_handler: cdrom not found"));
|
||||
}
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
Bit64s usb_msd_device_c::cd_param_handler(bx_param_c *param, int set, Bit64s val)
|
||||
{
|
||||
usb_msd_device_c *cdrom;
|
||||
const char *path;
|
||||
|
||||
if (set) {
|
||||
cdrom = (usb_msd_device_c*) param->get_parent()->get_device_param();
|
||||
if (cdrom != NULL) {
|
||||
path = SIM->get_param_string("path", param->get_parent())->getptr();
|
||||
val &= ((strlen(path) > 0) && (strcmp(path, "none")));
|
||||
if (val != cdrom->get_inserted()) {
|
||||
cdrom->set_inserted(val);
|
||||
}
|
||||
} else {
|
||||
BX_PANIC(("cd_param_string_handler: cdrom not found"));
|
||||
}
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
#endif // BX_SUPPORT_PCI && BX_SUPPORT_PCIUSB
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: usb_msd.h,v 1.12 2009-03-09 12:18:40 vruppert Exp $
|
||||
// $Id: usb_msd.h,v 1.13 2009-04-06 15:36:55 vruppert Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2009 Volker Ruppert
|
||||
@ -40,6 +40,8 @@ public:
|
||||
virtual int handle_data(USBPacket *p);
|
||||
virtual void register_state_specific(bx_list_c *parent);
|
||||
virtual void cancel_packet(USBPacket *p);
|
||||
void set_inserted(bx_bool value);
|
||||
bx_bool get_inserted();
|
||||
|
||||
protected:
|
||||
void copy_data();
|
||||
@ -64,7 +66,12 @@ private:
|
||||
USBPacket *packet;
|
||||
bx_list_c *sr_list;
|
||||
const char *fname;
|
||||
bx_list_c *config;
|
||||
} s;
|
||||
|
||||
static const char *cd_param_string_handler(bx_param_string_c *param, int set,
|
||||
const char *oldval, const char *val, int maxlen);
|
||||
static Bit64s cd_param_handler(bx_param_c *param, int set, Bit64s val);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user