diff options
| author | Javier <dev.git@javispedro.com> | 2026-08-30 19:01:23 +0200 |
|---|---|---|
| committer | Javier <dev.git@javispedro.com> | 2026-08-30 19:01:23 +0200 |
| commit | 8459567950d6d7dcc8f92753b0c1918f417ab149 (patch) | |
| tree | 8ab3fe3e5c970a4c00b5e222a6c5a13525149287 /mousmain.c | |
| parent | 6c79dffa4fd38a36845f518443668a3aa654728c (diff) | |
| download | vbados-8459567950d6d7dcc8f92753b0c1918f417ab149.tar.gz vbados-8459567950d6d7dcc8f92753b0c1918f417ab149.zip | |
handle wheel serial protocol (untested)
Diffstat (limited to 'mousmain.c')
| -rw-r--r-- | mousmain.c | 46 |
1 files changed, 29 insertions, 17 deletions
@@ -29,6 +29,7 @@ #include "int21dos.h" #include "int15ps2.h" #include "serial.h" +#include "sermouse.h" #include "vbox.h" #include "vmware.h" #include "dostsr.h" @@ -324,7 +325,7 @@ static int configure_driver_serial(LPTSRDATA data, int port, unsigned iobase) { struct serial_config serconfig; unsigned delay; - char sig1 = 0, sig2 = 0; + char sig = 0; if (!iobase) { dprintf("Skip search on COM%u because no IO base found\n", port); @@ -334,6 +335,7 @@ static int configure_driver_serial(LPTSRDATA data, int port, unsigned iobase) #if ENABLE_DLOG && DLOG_TARGET == DLOG_TARGET_SERIAL if (iobase == DLOG_TARGET_PORT) { dprintf("Skip search on COM%u because it would overlap with dlog %x\n", port, iobase); + return -2; } #endif @@ -360,53 +362,63 @@ static int configure_driver_serial(LPTSRDATA data, int port, unsigned iobase) uint8_t car = serial_read_data(iobase); // Is this something we recognize ? - dprintf("received serial data after reset: 0x%hx '%c'\n", car, car); + dprintf("serial data after reset: 0x%hx '%c'\n", car, car); if (car == 'M') { // Ok, got the MS signature, break out of this wait - sig1 = car; + sig = car; break; } } - if (sig1) break; + if (sig) break; bda_wait_tick(); dprintf("remaining ticks %u\n", delay); } - if (sig1 == 'M') { + switch (sig) { + case 'M': // We have a valid MS-style serial mouse data->port = port; - data->device_id = 'M'; + data->device_id = SERMOUSE_DEVICE_ID_MS; data->port_io = iobase; data->port_irq = serial_get_irq(port); data->num_buttons = 2; -#if USE_WHEEL data->num_wheels = 0; -#endif data->packet_size = 3; - // Should we wait for an extended signature? Let's do it + // Wait for an extended signature for about 2 ticks (50-100ms) + sig = 0; for (delay = 2; delay > 0; delay--) { while (serial_data_ready(iobase)) { uint8_t car = serial_read_data(iobase); - dprintf("received serial data after '%c': 0x%hx '%c'\n", sig1, car, car); - if (car == '3') { - // Ok, got the MS signature, break out of this wait - sig2 = car; + dprintf("serial data after 'M': 0x%hx '%c'\n", car, car); + if (car == '3' || car == 'Z') { + sig = car; break; } } - if (sig2) break; + if (sig) break; bda_wait_tick(); dprintf("2nd loop remaining ticks %u\n", delay); } - if (sig2 == '3') { - data->device_id = '3'; + // Update the mouse details based on the extended signature + // We don't change the device ID since we treat all the same. + switch (sig) { + case '3': + data->packet_size = 4; + data->num_buttons = 3; + break; + case 'Z': + data->packet_size = 4; data->num_buttons = 3; +#if USE_WHEEL + data->num_wheels = 1; +#endif + break; } // In any case, we got ourselves a mouse. @@ -415,7 +427,7 @@ static int configure_driver_serial(LPTSRDATA data, int port, unsigned iobase) // No mouse found on this port. serial_restore_config(iobase, &serconfig); - return -2; + return -3; } #endif |
