mirror of
https://github.com/raphnet/gc_n64_usb-v3
synced 2024-12-21 23:08:53 -05:00
Implement RQ_GCN64_BLOCK_IO
This commit is contained in:
parent
6d8d2d27bf
commit
083c915c34
52
hiddata.c
52
hiddata.c
@ -25,8 +25,8 @@
|
|||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
// dataHidReport is 40 bytes.
|
// dataHidReport is 63 bytes. Endpoint is 64 bytes.
|
||||||
#define CMDBUF_SIZE 41
|
#define CMDBUF_SIZE 64
|
||||||
|
|
||||||
#define STATE_IDLE 0
|
#define STATE_IDLE 0
|
||||||
#define STATE_NEW_COMMAND 1 // New command in buffer
|
#define STATE_NEW_COMMAND 1 // New command in buffer
|
||||||
@ -74,6 +74,51 @@ uint8_t hiddata_set_report(void *ctx, const struct usb_request *rq, const uint8_
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8_t processBlockIO(void)
|
||||||
|
{
|
||||||
|
uint8_t requestCopy[CMDBUF_SIZE];
|
||||||
|
int i, rx_offset = 0, rx;
|
||||||
|
uint8_t chn, n_tx, n_rx;
|
||||||
|
|
||||||
|
memcpy(requestCopy, cmdbuf, CMDBUF_SIZE);
|
||||||
|
memset(cmdbuf + 1, 0xff, CMDBUF_SIZE-1);
|
||||||
|
|
||||||
|
for (rx_offset = 1, i=1; i<CMDBUF_SIZE; ) {
|
||||||
|
if (i + 3 >= CMDBUF_SIZE)
|
||||||
|
break;
|
||||||
|
|
||||||
|
chn = requestCopy[i];
|
||||||
|
if (chn == 0xff)
|
||||||
|
break;
|
||||||
|
i++;
|
||||||
|
n_tx = requestCopy[i];
|
||||||
|
i++;
|
||||||
|
n_rx = requestCopy[i];
|
||||||
|
i++;
|
||||||
|
if (n_tx == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (rx_offset + 1 + n_rx >= CMDBUF_SIZE) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
rx = gcn64_transaction(chn, requestCopy + i, n_tx, cmdbuf + rx_offset + 1, n_rx);
|
||||||
|
cmdbuf[rx_offset] = n_rx;
|
||||||
|
if (rx <= 0) {
|
||||||
|
// timeout
|
||||||
|
cmdbuf[rx_offset] |= 0x80;
|
||||||
|
} else if (rx < n_rx) {
|
||||||
|
// less than expected
|
||||||
|
cmdbuf[rx_offset] |= 0x40;
|
||||||
|
}
|
||||||
|
rx_offset += n_rx + 1;
|
||||||
|
|
||||||
|
i += n_tx;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 63;
|
||||||
|
}
|
||||||
|
|
||||||
static void hiddata_processCommandBuffer(struct hiddata_ops *ops)
|
static void hiddata_processCommandBuffer(struct hiddata_ops *ops)
|
||||||
{
|
{
|
||||||
unsigned char channel;
|
unsigned char channel;
|
||||||
@ -147,6 +192,9 @@ static void hiddata_processCommandBuffer(struct hiddata_ops *ops)
|
|||||||
}
|
}
|
||||||
cmdbuf_len = 3;
|
cmdbuf_len = 3;
|
||||||
break;
|
break;
|
||||||
|
case RQ_GCN64_BLOCK_IO:
|
||||||
|
cmdbuf_len = processBlockIO();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
Loading…
Reference in New Issue
Block a user