[prev in list] [next in list] [prev in thread] [next in thread]
List: bochs-cvs
Subject: [Bochs-cvs] [12817] trunk/bochs/iodev/usb
From: vruppert () users ! sourceforge ! net
Date: 2015-08-31 20:51:54
Message-ID: E1ZWW3a-0007MX-5m () sfs-ml-4 ! v29 ! ch3 ! sourceforge ! com
[Download RAW message or body]
Revision: 12817
Author: vruppert
Date: 2015-08-31 20:51:54 +0000 (Mon, 31 Aug 2015)
Log Message:
-----------
Added media change support for the USB floppy.
Modified Paths:
--------------
trunk/bochs/iodev/usb/usb_cbi.cc
trunk/bochs/iodev/usb/usb_cbi.h
Modified: trunk/bochs/iodev/usb/usb_cbi.cc
===================================================================
--- trunk/bochs/iodev/usb/usb_cbi.cc 2015-08-30 08:37:27 UTC (rev 12816)
+++ trunk/bochs/iodev/usb/usb_cbi.cc 2015-08-31 20:51:54 UTC (rev 12817)
@@ -349,12 +349,9 @@
usb_cbi_device_c::~usb_cbi_device_c(void)
{
bx_gui->unregister_statusitem(s.statusbar_id);
+ set_inserted(0);
if (s.dev_buffer != NULL)
delete [] s.dev_buffer;
- if (s.hdimage != NULL) {
- if (s.inserted) s.hdimage->close();
- delete s.hdimage;
- }
if (SIM->is_wx_selected()) {
bx_list_c *usb = (bx_list_c*)SIM->get_param("ports.usb");
usb->remove(s.config->get_name());
@@ -382,16 +379,7 @@
bx_bool usb_cbi_device_c::init()
{
- if ((strlen(s.fname) > 0) && (strcmp(s.fname, "none"))) {
- s.hdimage = DEV_hdimage_init_image(s.image_mode, 1474560, "");
- if ((s.hdimage->open(s.fname)) < 0) {
- BX_ERROR(("could not open floppy image file '%s'", s.fname));
- } else {
- s.inserted = 1;
- SIM->get_param_enum("status", s.config)->set(BX_INSERTED);
- }
- }
- if (s.inserted) {
+ if (set_inserted(1)) {
sprintf(s.info_txt, "USB CBI: path='%s', mode='%s'", s.fname, \
hdimage_mode_names[s.image_mode]); } else {
sprintf(s.info_txt, "USB CBI: media not present");
@@ -439,6 +427,8 @@
new bx_shadow_num_c(list, "cur_command", &s.cur_command);
new bx_shadow_num_c(list, "fail_count", &s.fail_count);
new bx_shadow_bool_c(list, "did_inquiry_fail", &s.did_inquiry_fail);
+ new bx_shadow_num_c(list, "sense", &s.sense);
+ new bx_shadow_num_c(list, "asc", &s.asc);
// TODO
}
@@ -651,6 +641,11 @@
return 0;
}
+ if (s.cur_command != UFI_REQUEST_SENSE) {
+ s.sense = 0;
+ s.asc = 0;
+ }
+
switch (s.cur_command) {
case UFI_INQUIRY:
BX_DEBUG(("UFI INQUIRY COMMAND"));
@@ -681,12 +676,10 @@
case UFI_REQUEST_SENSE:
BX_DEBUG(("UFI_REQUEST_SENSE COMMAND"));
- if (s.inserted) {
- bx_cbi_dev_req_sense[2] = 0x00;
- bx_cbi_dev_req_sense[12] = 0x00;
- } else {
- bx_cbi_dev_req_sense[2] = 0x02;
- bx_cbi_dev_req_sense[12] = 0x3a;
+ bx_cbi_dev_req_sense[2] = s.sense;
+ bx_cbi_dev_req_sense[12] = s.asc;
+ if (s.sense == 6) {
+ s.sense = 0;
}
memcpy(s.usb_buf, bx_cbi_dev_req_sense, sizeof(bx_cbi_dev_req_sense));
s.usb_len = sizeof(bx_cbi_dev_req_sense);
@@ -703,6 +696,8 @@
case UFI_READ_10:
BX_DEBUG(("UFI_READ%i COMMAND (lba = %i, count = %i)", (s.cur_command == \
UFI_READ_12) ? 12 : 10, lba, count)); if (!s.inserted) {
+ s.sense = 2;
+ s.asc = 0x3a;
break;
}
if (count > CBI_MAX_SECTORS) {
@@ -727,6 +722,8 @@
case UFI_WRITE_10:
BX_DEBUG(("UFI_WRITE%i COMMAND (lba = %i, count = %i)", (s.cur_command == \
UFI_WRITE_12) ? 12 : 10, lba, count)); if (!s.inserted) {
+ s.sense = 2;
+ s.asc = 0x3a;
break;
}
if (s.hdimage->lseek(lba * 512, SEEK_SET) < 0)
@@ -738,6 +735,8 @@
case UFI_READ_CAPACITY:
BX_DEBUG(("UFI_READ_CAPACITY COMMAND"));
if (!s.inserted) {
+ s.sense = 2;
+ s.asc = 0x3a;
break;
}
memcpy(s.usb_buf, bx_cbi_dev_capacity, sizeof(bx_cbi_dev_capacity));
@@ -750,6 +749,8 @@
// the interrupt in part of the CBI
BX_DEBUG(("UFI_TEST_UNIT_READY COMMAND"));
if (!s.inserted) {
+ s.sense = 2;
+ s.asc = 0x3a;
break;
}
s.usb_len = 0;
@@ -932,6 +933,7 @@
// We currently do not support error reporting.
// We currently assume all transfers are successful
memset(data, 0, 2);
+ data[0] = s.asc;
ret = 2;
#endif
} else
@@ -955,10 +957,44 @@
s.packet = NULL;
}
+bx_bool usb_cbi_device_c::set_inserted(bx_bool value)
+{
+ const char *path;
+
+ s.inserted = value;
+ if (value) {
+ path = SIM->get_param_string("path", s.config)->getptr();
+ if ((strlen(path) > 0) && (strcmp(path, "none"))) {
+ s.hdimage = DEV_hdimage_init_image(s.image_mode, 1474560, "");
+ if ((s.hdimage->open(path)) < 0) {
+ BX_ERROR(("could not open floppy image file '%s'", path));
+ set_inserted(0);
+ SIM->get_param_enum("status", s.config)->set(BX_EJECTED);
+ } else {
+ s.sense = 6;
+ s.asc = 0x28;
+ }
+ } else {
+ set_inserted(0);
+ SIM->get_param_enum("status", s.config)->set(BX_EJECTED);
+ }
+ } else {
+ if (s.hdimage != NULL) {
+ s.hdimage->close();
+ delete s.hdimage;
+ s.hdimage = NULL;
+ }
+ }
+ return s.inserted;
+}
+
void usb_cbi_device_c::runtime_config(void)
{
if (s.status_changed) {
- // TODO
+ set_inserted(0);
+ if (SIM->get_param_enum("status", s.config)->get() == BX_INSERTED) {
+ set_inserted(1);
+ }
s.status_changed = 0;
}
}
Modified: trunk/bochs/iodev/usb/usb_cbi.h
===================================================================
--- trunk/bochs/iodev/usb/usb_cbi.h 2015-08-30 08:37:27 UTC (rev 12816)
+++ trunk/bochs/iodev/usb/usb_cbi.h 2015-08-31 20:51:54 UTC (rev 12817)
@@ -64,10 +64,6 @@
virtual void register_state_specific(bx_list_c *parent);
virtual void cancel_packet(USBPacket *p);
-protected:
- void send_status();
- bx_bool handle_command(Bit8u *command);
-
private:
struct {
Bit8u *dev_buffer;
@@ -83,6 +79,8 @@
char info_txt[BX_PATHNAME_LEN];
Bit8u cur_command;
int fail_count;
+ int sense;
+ int asc;
bx_bool did_inquiry_fail;
bx_bool inserted; // 0 = media not present
bx_bool wp; // 0 = not write_protected, 1 = write_protected
@@ -91,6 +89,9 @@
bx_bool status_changed;
} s;
+ bx_bool handle_command(Bit8u *command);
+ bx_bool set_inserted(bx_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);
------------------------------------------------------------------------------
_______________________________________________
Bochs-cvs mailing list
Bochs-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bochs-cvs
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic