diff --git a/bochs/config.cc b/bochs/config.cc index 40654d6e9..5e47f2da2 100755 --- a/bochs/config.cc +++ b/bochs/config.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: config.cc,v 1.158 2009-02-22 17:05:40 vruppert Exp $ +// $Id: config.cc,v 1.159 2009-03-04 18:20:32 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2002 MandrakeSoft S.A. @@ -1731,7 +1731,10 @@ void bx_init_options() path->set_ask_format("Enter debugger log filename: [%s] "); path->set_enabled(BX_DEBUGGER); - // runtime options + // USB runtime options + usb = new bx_list_c(special_menus, "usb_runtime", "USB runtime options", 10); + usb->get_options()->set(bx_list_c::SHOW_PARENT); + // misc runtime options bx_param_c *runtime_init_list[] = { SIM->get_param_num(BXPN_VGA_UPDATE_INTERVAL), SIM->get_param_bool(BXPN_MOUSE_ENABLED), @@ -1739,10 +1742,6 @@ void bx_init_options() SIM->get_param_string(BXPN_USER_SHORTCUT), SIM->get_param_num(BXPN_SB16_DMATIMER), SIM->get_param_num(BXPN_SB16_LOGLEVEL), - SIM->get_param_string(BXPN_UHCI_PORT1), - SIM->get_param_string(BXPN_UHCI_PORT2), - SIM->get_param_string(BXPN_OHCI_PORT1), - SIM->get_param_string(BXPN_OHCI_PORT2), NULL }; menu = new bx_list_c(special_menus, "runtime", "Misc runtime options", runtime_init_list); diff --git a/bochs/gui/siminterface.h b/bochs/gui/siminterface.h index 54b12d0d9..81afdf515 100644 --- a/bochs/gui/siminterface.h +++ b/bochs/gui/siminterface.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: siminterface.h,v 1.230 2009-02-21 11:43:18 vruppert Exp $ +// $Id: siminterface.h,v 1.231 2009-03-04 18:20:39 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2009 The Bochs Project @@ -229,9 +229,11 @@ typedef enum { #define BXPN_ATA1_SLAVE "ata.1.slave" #define BXPN_ATA2_SLAVE "ata.2.slave" #define BXPN_ATA3_SLAVE "ata.3.slave" +#define BXPN_USB_UHCI "ports.usb.uhci" #define BXPN_UHCI_ENABLED "ports.usb.uhci.enabled" #define BXPN_UHCI_PORT1 "ports.usb.uhci.port1" #define BXPN_UHCI_PORT2 "ports.usb.uhci.port2" +#define BXPN_USB_OHCI "ports.usb.ohci" #define BXPN_OHCI_ENABLED "ports.usb.ohci.enabled" #define BXPN_OHCI_PORT1 "ports.usb.ohci.port1" #define BXPN_OHCI_PORT2 "ports.usb.ohci.port2" @@ -254,6 +256,7 @@ typedef enum { #define BXPN_MENU_DISK "menu.disk" #define BXPN_MENU_MEMORY "menu.memory" #define BXPN_MENU_RUNTIME "menu.runtime" +#define BXPN_MENU_RUNTIME_USB "menu.usb_runtime" #define BXPN_WX_KBD_STATE "wxdebug.keyboard" #define BXPN_WX_CPU_STATE "wxdebug.cpu" #define BXPN_WX_CPU0_STATE "wxdebug.cpu.0" diff --git a/bochs/gui/textconfig.cc b/bochs/gui/textconfig.cc index cd1f95122..bf15c585b 100644 --- a/bochs/gui/textconfig.cc +++ b/bochs/gui/textconfig.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: textconfig.cc,v 1.73 2009-02-08 09:05:52 vruppert Exp $ +// $Id: textconfig.cc,v 1.74 2009-03-04 18:20:40 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2009 The Bochs Project @@ -320,11 +320,12 @@ static const char *runtime_menu_prompt = "8. Log options for all devices\n" "9. Log options for individual devices\n" "10. Instruction tracing: off (doesn't exist yet)\n" -"11. Misc runtime options\n" -"12. Continue simulation\n" -"13. Quit now\n" +"11. USB runtime options\n" +"12. Misc runtime options\n" +"13. Continue simulation\n" +"14. Quit now\n" "\n" -"Please choose one: [12] "; +"Please choose one: [13] "; #endif #define NOT_IMPLEMENTED(choice) \ @@ -527,6 +528,7 @@ int bx_config_interface(int menu) case BX_CI_RT_LOGOPTS1: bx_log_options(0); break; case BX_CI_RT_LOGOPTS2: bx_log_options(1); break; case BX_CI_RT_INST_TR: NOT_IMPLEMENTED(choice); break; + case BX_CI_RT_USB: do_menu(BXPN_MENU_RUNTIME_USB); break; case BX_CI_RT_MISC: do_menu(BXPN_MENU_RUNTIME); break; case BX_CI_RT_CONT: fprintf(stderr, "Continuing simulation\n"); return 0; case BX_CI_RT_QUIT: diff --git a/bochs/gui/textconfig.h b/bochs/gui/textconfig.h index 2a00a2617..53bc2f7d1 100644 --- a/bochs/gui/textconfig.h +++ b/bochs/gui/textconfig.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: textconfig.h,v 1.9 2009-02-08 09:05:52 vruppert Exp $ +// $Id: textconfig.h,v 1.10 2009-03-04 18:20:44 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2009 The Bochs Project @@ -47,6 +47,7 @@ enum { BX_CI_RT_LOGOPTS1, BX_CI_RT_LOGOPTS2, BX_CI_RT_INST_TR, + BX_CI_RT_USB, BX_CI_RT_MISC, BX_CI_RT_CONT, BX_CI_RT_QUIT diff --git a/bochs/iodev/usb_ohci.cc b/bochs/iodev/usb_ohci.cc index e8858a292..346873e6d 100644 --- a/bochs/iodev/usb_ohci.cc +++ b/bochs/iodev/usb_ohci.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: usb_ohci.cc,v 1.14 2009-03-03 18:29:51 vruppert Exp $ +// $Id: usb_ohci.cc,v 1.15 2009-03-04 18:20:44 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2009 Benjamin D Lunt (fys at frontiernet net) @@ -99,22 +99,25 @@ bx_usb_ohci_c::bx_usb_ohci_c() bx_usb_ohci_c::~bx_usb_ohci_c() { + char pname[6]; + if (BX_OHCI_THIS device_buffer != NULL) delete [] BX_OHCI_THIS device_buffer; - for (int i=0; iget_param_string(pname, SIM->get_param(BXPN_USB_OHCI))->set_handler(NULL); remove_device(i); } - SIM->get_param_string(BXPN_OHCI_PORT1)->set_handler(NULL); - SIM->get_param_string(BXPN_OHCI_PORT2)->set_handler(NULL); - BX_DEBUG(("Exit")); } void bx_usb_ohci_c::init(void) { unsigned i; + char pname[6]; + bx_param_string_c *port; BX_OHCI_THIS device_buffer = new Bit8u[65536]; @@ -143,12 +146,15 @@ void bx_usb_ohci_c::init(void) //FIXME: for now, we want a status bar // hub zero, port zero BX_OHCI_THIS hub.statusbar_id[0] = bx_gui->register_statusitem("OHCI"); - SIM->get_param_string(BXPN_OHCI_PORT1)->set_handler(usb_param_handler); - SIM->get_param_string(BXPN_OHCI_PORT1)->set_runtime_param(1); - SIM->get_param_string(BXPN_OHCI_PORT2)->set_handler(usb_param_handler); - SIM->get_param_string(BXPN_OHCI_PORT2)->set_runtime_param(1); - - for (i=0; iget_param(BXPN_MENU_RUNTIME_USB); + bx_list_c *ohci = new bx_list_c(usb_rt, "ohci", "OHCI Configuration"); + ohci->get_options()->set(bx_list_c::SHOW_PARENT); + for (i=0; iget_param_string(pname, SIM->get_param(BXPN_USB_OHCI)); + ohci->add(port); + port->set_handler(usb_param_handler); + port->set_runtime_param(1); BX_OHCI_THIS hub.usb_port[i].device = NULL; } @@ -208,18 +214,12 @@ void bx_usb_ohci_c::reset(unsigned type) } BX_OHCI_THIS reset_hc(); - - if (BX_OHCI_THIS hub.usb_port[0].device == NULL) { - init_device(0, SIM->get_param_string(BXPN_OHCI_PORT1)->getptr()); - } - if (BX_OHCI_THIS hub.usb_port[1].device == NULL) { - init_device(1, SIM->get_param_string(BXPN_OHCI_PORT2)->getptr()); - } } void bx_usb_ohci_c::reset_hc() { int i; + char pname[6]; // reset locals BX_OHCI_THIS hub.ohci_done_count = 7; @@ -303,10 +303,10 @@ void bx_usb_ohci_c::reset_hc() BX_OHCI_THIS hub.op_regs.HcRhDescriptorA.dt = 0; BX_OHCI_THIS hub.op_regs.HcRhDescriptorA.nps = 0; BX_OHCI_THIS hub.op_regs.HcRhDescriptorA.psm = 1; - BX_OHCI_THIS hub.op_regs.HcRhDescriptorA.ndp = USB_NUM_PORTS; + BX_OHCI_THIS hub.op_regs.HcRhDescriptorA.ndp = USB_OHCI_NUM_PORTS; // HcRhDescriptorB - BX_OHCI_THIS hub.op_regs.HcRhDescriptorB.ppcm = 0x0000 | ((USB_NUM_PORTS == 1) ? 2 : 0) | ((USB_NUM_PORTS == 2) ? 4 : 0); + BX_OHCI_THIS hub.op_regs.HcRhDescriptorB.ppcm = 0x0000 | ((USB_OHCI_NUM_PORTS == 1) ? 2 : 0) | ((USB_OHCI_NUM_PORTS == 2) ? 4 : 0); BX_OHCI_THIS hub.op_regs.HcRhDescriptorB.dr = 0x0000; // HcRhStatus @@ -320,9 +320,12 @@ void bx_usb_ohci_c::reset_hc() BX_OHCI_THIS hub.op_regs.HcRhStatus.lps = 0; // HcRhPortStatus[x] - for (i=0; iget_param_string(pname, SIM->get_param(BXPN_USB_OHCI))->getptr()); + } else { usb_set_connect_status(i, BX_OHCI_THIS hub.usb_port[i].device->get_type(), 1); } } @@ -407,7 +410,7 @@ void bx_usb_ohci_c::register_state(void) new bx_shadow_bool_c(reg, "drwe", &BX_OHCI_THIS hub.op_regs.HcRhStatus.drwe); new bx_shadow_bool_c(reg, "oci", &BX_OHCI_THIS hub.op_regs.HcRhStatus.oci); new bx_shadow_bool_c(reg, "lps", &BX_OHCI_THIS hub.op_regs.HcRhStatus.lps); - for (i=0; iafter_restore_state(); } @@ -650,17 +653,17 @@ bx_bool bx_usb_ohci_c::read_handler(bx_phy_address addr, unsigned len, void *dat break; case 0x60: // HcRhPortStatus[3] -#if (USB_NUM_PORTS < 4) +#if (USB_OHCI_NUM_PORTS < 4) val = 0; break; #endif case 0x5C: // HcRhPortStatus[2] -#if (USB_NUM_PORTS < 3) +#if (USB_OHCI_NUM_PORTS < 3) val = 0; break; #endif case 0x58: // HcRhPortStatus[1] -#if (USB_NUM_PORTS < 2) +#if (USB_OHCI_NUM_PORTS < 2) val = 0; break; #endif @@ -758,7 +761,7 @@ bx_bool bx_usb_ohci_c::write_handler(bx_phy_address addr, unsigned len, void *da BX_OHCI_THIS hub.op_regs.HcCommandStatus.hcr = 1; BX_OHCI_THIS reset_hc(); BX_OHCI_THIS hub.op_regs.HcControl.hcfs = 3; // suspend state - for (unsigned i=0; iusb_send_msg(USB_MSG_RESET); } @@ -896,20 +899,20 @@ bx_bool bx_usb_ohci_c::write_handler(bx_phy_address addr, unsigned len, void *da if (value & (1<<17)) BX_OHCI_THIS hub.op_regs.HcRhStatus.ocic = 1; if (value & (1<<16)) { if (BX_OHCI_THIS hub.op_regs.HcRhDescriptorA.psm == 0) { - for (p=0; pget_connected()) { if (BX_OHCI_THIS hub.usb_port[i].device->get_address() == ED_GET_FA(ed)) { @@ -1494,33 +1497,22 @@ const char *bx_usb_ohci_c::usb_param_handler(bx_param_string_c *param, int set, const char *oldval, const char *val, int maxlen) { usbdev_type type = USB_DEV_TYPE_NONE; + int portnum; - // handler for USB runtime parameters if (set) { - char pname[BX_PATHNAME_LEN]; - param->get_param_path(pname, BX_PATHNAME_LEN); - if (!strcmp(pname, BXPN_OHCI_PORT1)) { - BX_INFO(("USB port #1 experimental device change")); - if (!strcmp(val, "none") && BX_OHCI_THIS hub.usb_port[0].HcRhPortStatus.ccs) { - if (BX_OHCI_THIS hub.usb_port[0].device != NULL) { - type = BX_OHCI_THIS hub.usb_port[0].device->get_type(); + portnum = atoi(param->get_name()+4) - 1; + if ((portnum >= 0) && (portnum < USB_OHCI_NUM_PORTS)) { + BX_INFO(("USB port #%d experimental device change", portnum+1)); + if (!strcmp(val, "none") && BX_OHCI_THIS hub.usb_port[portnum].HcRhPortStatus.ccs) { + if (BX_OHCI_THIS hub.usb_port[portnum].device != NULL) { + type = BX_OHCI_THIS hub.usb_port[portnum].device->get_type(); } - usb_set_connect_status(0, type, 0); - } else if (strcmp(val, "none") && !BX_OHCI_THIS hub.usb_port[0].HcRhPortStatus.ccs) { - init_device(0, val); - } - } else if (!strcmp(pname, BXPN_OHCI_PORT2)) { - BX_INFO(("USB port #2 experimental device change")); - if (!strcmp(val, "none") && BX_OHCI_THIS hub.usb_port[1].HcRhPortStatus.ccs) { - if (BX_OHCI_THIS hub.usb_port[1].device != NULL) { - type = BX_OHCI_THIS hub.usb_port[1].device->get_type(); - } - usb_set_connect_status(1, type, 0); - } else if (strcmp(val, "none") && !BX_OHCI_THIS hub.usb_port[1].HcRhPortStatus.ccs) { - init_device(1, val); + usb_set_connect_status(portnum, type, 0); + } else if (strcmp(val, "none") && !BX_OHCI_THIS hub.usb_port[portnum].HcRhPortStatus.ccs) { + init_device(portnum, val); } } else { - BX_PANIC(("usb_param_handler called with unexpected parameter '%s'", pname)); + BX_PANIC(("usb_param_handler called with unexpected parameter '%s'", param->get_name())); } } return val; diff --git a/bochs/iodev/usb_ohci.h b/bochs/iodev/usb_ohci.h index cc65c2a38..504cc8e38 100644 --- a/bochs/iodev/usb_ohci.h +++ b/bochs/iodev/usb_ohci.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: usb_ohci.h,v 1.10 2009-03-03 18:29:51 vruppert Exp $ +// $Id: usb_ohci.h,v 1.11 2009-03-04 18:20:46 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2009 Benjamin D Lunt (fys at frontiernet net) @@ -30,7 +30,7 @@ # define BX_OHCI_THIS_PTR this #endif -#define USB_NUM_PORTS 2 +#define USB_OHCI_NUM_PORTS 2 #define OHCI_INTR_SO (1<<0) // Scheduling overrun #define OHCI_INTR_WD (1<<1) // HcDoneHead writeback @@ -234,7 +234,7 @@ typedef struct { bx_bool pes; // 1 bit PortEnableStatus = 0b RW RW bx_bool ccs; // 1 bit CurrentConnectStatus = 0b RW RW } HcRhPortStatus; - } usb_port[USB_NUM_PORTS]; + } usb_port[USB_OHCI_NUM_PORTS]; Bit8u pci_conf[256]; Bit8u devfunc; diff --git a/bochs/iodev/usb_uhci.cc b/bochs/iodev/usb_uhci.cc index fd01b888e..f9b9a4dcd 100644 --- a/bochs/iodev/usb_uhci.cc +++ b/bochs/iodev/usb_uhci.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: usb_uhci.cc,v 1.12 2009-03-03 18:29:51 vruppert Exp $ +// $Id: usb_uhci.cc,v 1.13 2009-03-04 18:20:46 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2009 Benjamin D Lunt (fys at frontiernet net) @@ -66,22 +66,25 @@ bx_usb_uhci_c::bx_usb_uhci_c() bx_usb_uhci_c::~bx_usb_uhci_c() { + char pname[6]; + if (BX_UHCI_THIS device_buffer != NULL) delete [] BX_UHCI_THIS device_buffer; - for (int i=0; iget_param_string(pname, SIM->get_param(BXPN_USB_UHCI))->set_handler(NULL); remove_device(i); } - SIM->get_param_string(BXPN_UHCI_PORT1)->set_handler(NULL); - SIM->get_param_string(BXPN_UHCI_PORT2)->set_handler(NULL); - BX_DEBUG(("Exit")); } void bx_usb_uhci_c::init(void) { unsigned i; + char pname[6]; + bx_param_string_c *port; BX_UHCI_THIS device_buffer = new Bit8u[65536]; @@ -107,12 +110,15 @@ void bx_usb_uhci_c::init(void) //FIXME: for now, we want a status bar // hub zero, port zero BX_UHCI_THIS hub.statusbar_id[0] = bx_gui->register_statusitem("UHCI"); - SIM->get_param_string(BXPN_UHCI_PORT1)->set_handler(usb_param_handler); - SIM->get_param_string(BXPN_UHCI_PORT1)->set_runtime_param(1); - SIM->get_param_string(BXPN_UHCI_PORT2)->set_handler(usb_param_handler); - SIM->get_param_string(BXPN_UHCI_PORT2)->set_runtime_param(1); - - for (i=0; iget_param(BXPN_MENU_RUNTIME_USB); + bx_list_c *uhci = new bx_list_c(usb_rt, "uhci", "UHCI Configuration"); + uhci->get_options()->set(bx_list_c::SHOW_PARENT); + for (i=0; iget_param_string(pname, SIM->get_param(BXPN_USB_UHCI)); + uhci->add(port); + port->set_handler(usb_param_handler); + port->set_runtime_param(1); BX_UHCI_THIS hub.usb_port[i].device = NULL; } @@ -125,6 +131,7 @@ void bx_usb_uhci_c::init(void) void bx_usb_uhci_c::reset(unsigned type) { unsigned i, j; + char pname[6]; if (type == BX_RESET_HARDWARE) { static const struct reset_vals_t { @@ -182,7 +189,7 @@ void bx_usb_uhci_c::reset(unsigned type) BX_UHCI_THIS hub.usb_frame_num.frame_num = 0x0000; BX_UHCI_THIS hub.usb_frame_base.frame_base = 0x00000000; BX_UHCI_THIS hub.usb_sof.sof_timing = 0x40; - for (j=0; jget_param_string(pname, SIM->get_param(BXPN_USB_UHCI))->getptr()); + } else { + usb_set_connect_status(j, BX_UHCI_THIS hub.usb_port[j].device->get_type(), 1); + } } - if (BX_UHCI_THIS hub.usb_port[0].device == NULL) { - init_device(0, SIM->get_param_string(BXPN_UHCI_PORT1)->getptr()); - } else { - usb_set_connect_status(0, BX_UHCI_THIS hub.usb_port[0].device->get_type(), 1); - } - if (BX_UHCI_THIS hub.usb_port[1].device == NULL) { - init_device(1, SIM->get_param_string(BXPN_UHCI_PORT2)->getptr()); - } else { - usb_set_connect_status(1, BX_UHCI_THIS hub.usb_port[1].device->get_type(), 1); - } } void bx_usb_uhci_c::register_state(void) @@ -214,7 +217,7 @@ void bx_usb_uhci_c::register_state(void) bx_list_c *hub, *usb_cmd, *usb_st, *usb_en, *port; bx_list_c *list = new bx_list_c(SIM->get_bochs_root(), "usb_uhci", "USB UHCI State"); - hub = new bx_list_c(list, "hub", USB_NUM_PORTS + 7); + hub = new bx_list_c(list, "hub", USB_UHCI_NUM_PORTS + 7); usb_cmd = new bx_list_c(hub, "usb_command", 8); new bx_shadow_bool_c(usb_cmd, "max_packet_size", &BX_UHCI_THIS hub.usb_command.max_packet_size); new bx_shadow_bool_c(usb_cmd, "configured", &BX_UHCI_THIS hub.usb_command.configured); @@ -239,7 +242,7 @@ void bx_usb_uhci_c::register_state(void) new bx_shadow_num_c(hub, "frame_num", &BX_UHCI_THIS hub.usb_frame_num.frame_num, BASE_HEX); new bx_shadow_num_c(hub, "frame_base", &BX_UHCI_THIS hub.usb_frame_base.frame_base, BASE_HEX); new bx_shadow_num_c(hub, "sof_timing", &BX_UHCI_THIS hub.usb_sof.sof_timing, BASE_HEX); - for (j=0; jafter_restore_state(); } @@ -404,7 +407,7 @@ Bit32u bx_usb_uhci_c::read(Bit32u address, unsigned io_len) case 0x12: // port #2 case 0x13: port = (offset & 0x0F) >> 1; - if (port < USB_NUM_PORTS) { + if (port < USB_UHCI_NUM_PORTS) { val = BX_UHCI_THIS hub.usb_port[port].suspend << 12 | 1 << 10 // some Root Hubs have bit 10 set ????? | BX_UHCI_THIS hub.usb_port[port].reset << 9 @@ -469,7 +472,7 @@ void bx_usb_uhci_c::write(Bit32u address, Bit32u value, unsigned io_len) // HCRESET if (BX_UHCI_THIS hub.usb_command.host_reset) { BX_UHCI_THIS reset(0); - for (unsigned i=0; iusb_send_msg(USB_MSG_RESET); @@ -577,7 +580,7 @@ void bx_usb_uhci_c::write(Bit32u address, Bit32u value, unsigned io_len) case 0x10: // port #1 case 0x12: // port #2 port = (offset & 0x0F) >> 1; - if ((port < USB_NUM_PORTS) && (io_len == 2)) { + if ((port < USB_UHCI_NUM_PORTS) && (io_len == 2)) { // If the ports reset bit is set, don't allow any writes unless the new write will clear the reset bit if (BX_UHCI_THIS hub.usb_port[port].reset & (value & (1<<9))) break; @@ -642,7 +645,7 @@ void bx_usb_uhci_c::usb_timer(void) // If the "global reset" bit was set by software if (BX_UHCI_THIS global_reset) { - for (i=0; iget_connected()) { at_least_one = 1; @@ -1113,33 +1116,22 @@ const char *bx_usb_uhci_c::usb_param_handler(bx_param_string_c *param, int set, const char *oldval, const char *val, int maxlen) { usbdev_type type = USB_DEV_TYPE_NONE; + int portnum; - // handler for USB runtime parameters if (set) { - char pname[BX_PATHNAME_LEN]; - param->get_param_path(pname, BX_PATHNAME_LEN); - if (!strcmp(pname, BXPN_UHCI_PORT1)) { - BX_INFO(("USB port #1 experimental device change")); - if (!strcmp(val, "none") && BX_UHCI_THIS hub.usb_port[0].status) { - if (BX_UHCI_THIS hub.usb_port[0].device != NULL) { - type = BX_UHCI_THIS hub.usb_port[0].device->get_type(); + portnum = atoi(param->get_name()+4) - 1; + if ((portnum >= 0) && (portnum < USB_UHCI_NUM_PORTS)) { + BX_INFO(("USB port #%d experimental device change", portnum+1)); + if (!strcmp(val, "none") && BX_UHCI_THIS hub.usb_port[portnum].status) { + if (BX_UHCI_THIS hub.usb_port[portnum].device != NULL) { + type = BX_UHCI_THIS hub.usb_port[portnum].device->get_type(); } - usb_set_connect_status(0, type, 0); - } else if (strcmp(val, "none") && !BX_UHCI_THIS hub.usb_port[0].status) { - init_device(0, val); - } - } else if (!strcmp(pname, BXPN_UHCI_PORT2)) { - BX_INFO(("USB port #2 experimental device change")); - if (!strcmp(val, "none") && BX_UHCI_THIS hub.usb_port[1].status) { - if (BX_UHCI_THIS hub.usb_port[1].device != NULL) { - type = BX_UHCI_THIS hub.usb_port[1].device->get_type(); - } - usb_set_connect_status(1, type, 0); - } else if (strcmp(val, "none") && !BX_UHCI_THIS hub.usb_port[1].status) { - init_device(1, val); + usb_set_connect_status(portnum, type, 0); + } else if (strcmp(val, "none") && !BX_UHCI_THIS hub.usb_port[portnum].status) { + init_device(portnum, val); } } else { - BX_PANIC(("usb_param_handler called with unexpected parameter '%s'", pname)); + BX_PANIC(("usb_param_handler called with unexpected parameter '%s'", param->get_name())); } } return val; diff --git a/bochs/iodev/usb_uhci.h b/bochs/iodev/usb_uhci.h index 853cfd5c9..8cd32e7da 100644 --- a/bochs/iodev/usb_uhci.h +++ b/bochs/iodev/usb_uhci.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: usb_uhci.h,v 1.8 2009-03-03 18:29:51 vruppert Exp $ +// $Id: usb_uhci.h,v 1.9 2009-03-04 18:20:50 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2009 Benjamin D Lunt (fys at frontiernet net) @@ -29,7 +29,7 @@ # define BX_UHCI_THIS_PTR this #endif -#define USB_NUM_PORTS 2 /* UHCI supports 2 ports per root hub */ +#define USB_UHCI_NUM_PORTS 2 /* UHCI supports 2 ports per root hub */ typedef struct { Bit32u base_ioaddr; @@ -153,7 +153,7 @@ typedef struct { bx_bool enabled; bx_bool connect_changed; bx_bool status; - } usb_port[USB_NUM_PORTS]; + } usb_port[USB_UHCI_NUM_PORTS]; Bit8u pci_conf[256]; Bit8u devfunc;