summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author yz70s <yz70s@users.noreply.github.com>2017-03-22 20:52:05 +0100
committer yz70s <yz70s@users.noreply.github.com>2017-03-22 20:58:16 +0100
commit7758a410224dd5470e3345df3bfcae415029441c (patch)
tree2bf68b10b9c2132f09c58c0c809459ac5a9dd6f2
parent2f5d66e0b92f170986db55ecab0a4638dd005754 (diff)
chihiro: some information on usb commands for an2131sc (nw)
an2131sc is used as a usb to serial converter, one of the 2 serial ports can be setup as midi
-rw-r--r--src/mame/drivers/chihiro.cpp62
1 files changed, 48 insertions, 14 deletions
diff --git a/src/mame/drivers/chihiro.cpp b/src/mame/drivers/chihiro.cpp
index e8569978d0d..e80149d7551 100644
--- a/src/mame/drivers/chihiro.cpp
+++ b/src/mame/drivers/chihiro.cpp
@@ -522,6 +522,7 @@ private:
static const uint8_t strdesc1[];
static const uint8_t strdesc2[];
uint8_t *region;
+ uint8_t midi_rs232;
};
const device_type OHCI_HLEAN2131SC = device_creator<ohci_hlean2131sc_device>;
@@ -836,7 +837,7 @@ int ohci_hlean2131qc_device::handle_nonstandard_request(int endpoint, USBSetupPa
// PINSA register, bits 0-2 connected do dip switches 1-3 on filter board, bit 4 to dip switch 4, bit 5 to dip switch 5, bits 6-7 to buttons 1-2 on filter board
// bits 4-1 value must be 10 xor 15, and bit 3 is ignored since its used as the CS pin of the chip
endpoints[endpoint].buffer[1] = 0x4b;
- // PINSB register, bits 5-7 connected to 3 leds not mounted on pcb, bit 4 connected to re/de pins of max485, bits 2-3 used as uart pins, bit 0-1 give the status of the sense pin of the jvs connector
+ // PINSB register, bits 5-7 connected to 3 leds not mounted on pcb, bit 4 connected to re/de pins of max485, bits 2-3 used as uart pins, bits 0-1 give the status of the sense pin of the jvs connector
// if bits 0-1 are 11, the not all the connected jvs devices have been assigned an address yet
endpoints[endpoint].buffer[2] = 0x52 | sense;
// OUTB register
@@ -1094,6 +1095,7 @@ ohci_hlean2131sc_device::ohci_hlean2131sc_device(const machine_config &mconfig,
ohci_function_device()
{
region = nullptr;
+ midi_rs232 = 0;
}
void ohci_hlean2131sc_device::set_region_base(uint8_t *data)
@@ -1121,24 +1123,29 @@ void ohci_hlean2131sc_device::initialize(running_machine &machine, ohci_usb_cont
int ohci_hlean2131sc_device::handle_nonstandard_request(int endpoint, USBSetupPacket *setup)
{
-//#ifdef VERBOSE_MSG
+#ifdef VERBOSE_MSG
printf("Control request to an2131sc: %x %x %x %x %x %x %x\n\r", endpoint, endpoints[endpoint].controldirection, setup->bmRequestType, setup->bRequest, setup->wValue, setup->wIndex, setup->wLength);
-//#endif
+#endif
if (endpoint != 0)
return -1;
+ // default valuse for data stage
for (int n = 0; n < setup->wLength; n++)
endpoints[endpoint].buffer[n] = 0x50 ^ n;
endpoints[endpoint].buffer[1] = 0;
+ // PINSB register, bits 0-1 uset as rts/cts signals for uart0, bits 2-3 used as uart1, bits 5-7 used as leds (not mounted on pcb)
endpoints[endpoint].buffer[2] = 0x52; // PINSB
+ // OUTB register
endpoints[endpoint].buffer[3] = 0x53; // OUTB
endpoints[endpoint].buffer[4] = 0;
endpoints[endpoint].buffer[5] = 0;
- endpoints[endpoint].buffer[6] = 0x56; // PINSC
- endpoints[endpoint].buffer[7] = 0x57; // OUTC
+ // PINSC register, bit 7 selects default value for bit 6 after reset (connected to dip switch 5 on filter board), bits 0-1 used as uart0 pins
+ endpoints[endpoint].buffer[6] = 0x56;
+ // OUTC register, bit 6 specifies if uart1 should be connected to midi or rs232
+ endpoints[endpoint].buffer[7] = 0x57;
// bRequest is a command value
if (setup->bRequest == 0x16)
{
- // this command is used to read data from the first i2c serial eeprom connected to the chip
+ // this command is used to read data from the i2c serial eeprom connected to the chip
// setup->wValue = start address to read from
// setup->wIndex = number of bytes to read
// data will be transferred to the host using endpoint 1 (IN)
@@ -1148,19 +1155,25 @@ int ohci_hlean2131sc_device::handle_nonstandard_request(int endpoint, USBSetupPa
}
else if (setup->bRequest == 0x17)
{
- endpoints[endpoint].buffer[0] = 0x99;
+ endpoints[endpoint].buffer[0] = 0x90;
}
else if (setup->bRequest == 0x1a)
{
+ // used to get data received by uart0 data transferred with endpoint 2 (IN)
endpoints[endpoint].buffer[0] = 0x99;
}
else if (setup->bRequest == 0x1b)
{
+ // used to get data received by uart 1 data transferred with endpoint 3 (IN)
+ // setup->wIndex = number of bytes host would like to retrieve (must be lower than 256, 0 means get all available)
endpoints[endpoint].buffer[0] = 0; //
+ endpoints[endpoint].buffer[1] = 0; // bit 0 in buffer overflow bit 1 in parity error
+ endpoints[endpoint].buffer[4] = 0x40 & 255; // how many bytes to transfer with endpoint 3
+ endpoints[endpoint].buffer[5] = (0x40 >> 8) & 255;
}
else if (setup->bRequest == 0x1d)
{
- // this command is used to write data to the first i2c serial eeprom connected to the chip
+ // this command is used to write data to the i2c serial eeprom connected to the chip
// no more than 32 bytes can be written at a time
// setup->wValue = start address to write to
// setup->wIndex = number of bytes to write
@@ -1169,14 +1182,16 @@ int ohci_hlean2131sc_device::handle_nonstandard_request(int endpoint, USBSetupPa
}
else if (setup->bRequest == 0x1e)
{
- endpoints[endpoint].buffer[0] = 0x99;
+ endpoints[endpoint].buffer[0] = 0x90;
}
else if (setup->bRequest == 0x22)
{
+ // send data to be output from uart0
endpoints[endpoint].buffer[0] = 0x99;
}
else if (setup->bRequest == 0x23)
{
+ // send data to be output from uart1
endpoints[endpoint].buffer[0] = 0x99;
}
else if (setup->bRequest == 0x25) //
@@ -1185,6 +1200,7 @@ int ohci_hlean2131sc_device::handle_nonstandard_request(int endpoint, USBSetupPa
}
else if (setup->bRequest == 0x26) //
{
+ // set uart0 or uart1 mode
endpoints[endpoint].buffer[0] = 0x99;
}
else if (setup->bRequest == 0x27) //
@@ -1213,23 +1229,41 @@ int ohci_hlean2131sc_device::handle_nonstandard_request(int endpoint, USBSetupPa
}
else if (setup->bRequest == 0x2d)
{
+ // set pin 1 of PORTB, used as the RTS signal of the rs232 port implemented with uart0
endpoints[endpoint].buffer[0] = 0x99;
}
- else if (setup->bRequest == 0x2e) //
+ else if (setup->bRequest == 0x2e)
{
- endpoints[endpoint].buffer[0] = 0x99;
+ // switches uart1 between rs232 mode and midi mode
+ // low byte of wValue sets the mode: 0 mode is selected using pin 7 of PORTC (0 midi 1 rs232), 1 rs232, 2 midi, other values no mode change
+ endpoints[endpoint].buffer[0] = 0;
+ midi_rs232 = setup->wValue & 255;
}
else if (setup->bRequest == 0x2f)
{
- endpoints[endpoint].buffer[0] = 0x99;
+ // return low byte of wValue from command 0x2e
+ endpoints[endpoint].buffer[0] = 0;
+ endpoints[endpoint].buffer[4] = midi_rs232;
}
else if (setup->bRequest == 0x30)
{
- endpoints[endpoint].buffer[0] = 0x99;
+ // this command first disables external interrupt 0 if the lower 8 bits of setup->wValue are 0
+ // or enables it if those bits, seen as a signed 8 bit value, represent a number greater than 0
+ // then it will return in byte 4 of the data stage the value 0 if external interrupt 0 has been disabled or value 1 if it has been enabled
+ // and in byte 5 the value of an 8 bit counter that is incremented at every external interrupt 0
+ endpoints[endpoint].buffer[0] = 0;
+ if ((setup->wValue & 255) == 0)
+ endpoints[endpoint].buffer[4] = 0;
+ else if ((setup->wValue & 255) < 128)
+ endpoints[endpoint].buffer[4] = 1;
+ endpoints[endpoint].buffer[5] = 0;
}
else if (setup->bRequest == 0x31)
{
- endpoints[endpoint].buffer[0] = 0x99;
+ // set pins 4-7 of PORTB
+ // bits 4-7 of wValue & 255 set the direction
+ // bits 4-7 of wValue >> 8 set the level
+ endpoints[endpoint].buffer[0] = 0;
} else
endpoints[endpoint].buffer[0] = 0x99; // usnupported command