|
|
|
@ -80,7 +80,19 @@ static bool qmkusb_start_receive(QMKUSBDriver *qmkusbp) { |
|
|
|
|
* Interface implementation. |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
static size_t _write(void *ip, const uint8_t *bp, size_t n) { return obqWriteTimeout(&((QMKUSBDriver *)ip)->obqueue, bp, n, TIME_INFINITE); } |
|
|
|
|
static size_t _write(void *ip, const uint8_t *bp, size_t n) { |
|
|
|
|
output_buffers_queue_t *obqueue = &((QMKUSBDriver *)ip)->obqueue; |
|
|
|
|
chSysLock(); |
|
|
|
|
const bool full = obqIsFullI(obqueue); |
|
|
|
|
chSysUnlock(); |
|
|
|
|
if (full || bqIsSuspendedX(obqueue)) { |
|
|
|
|
/* Discard any writes while the queue is suspended or full, i.e. the hidraw
|
|
|
|
|
interface is not open. If we tried to send with an infinite timeout, we |
|
|
|
|
would deadlock the keyboard otherwise. */ |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
return obqWriteTimeout(obqueue, bp, n, TIME_INFINITE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static size_t _read(void *ip, uint8_t *bp, size_t n) { return ibqReadTimeout(&((QMKUSBDriver *)ip)->ibqueue, bp, n, TIME_INFINITE); } |
|
|
|
|
|
|
|
|
|