~ruther/qmk_firmware

095b28e006e6a44d734c36f36a6ef4d6744065b5 — Rasmus Schults 7 years ago 8a27703
Loop based vusb_transfer_keyboard
1 files changed, 16 insertions(+), 11 deletions(-)

M tmk_core/protocol/vusb/vusb.c
M tmk_core/protocol/vusb/vusb.c => tmk_core/protocol/vusb/vusb.c +16 -11
@@ 27,6 27,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#include "host_driver.h"
#include "vusb.h"
#include "bootloader.h"
#include <util/delay.h>


static uint8_t vusb_keyboard_leds = 0;


@@ 46,22 47,26 @@ typedef struct {

static keyboard_report_t keyboard_report; // sent to PC

#define VUSB_TRANSFER_KEYBOARD_MAX_TRIES 10

/* transfer keyboard report from buffer */
void vusb_transfer_keyboard(void)
{
    if (usbInterruptIsReady()) {
        if (kbuf_head != kbuf_tail) {
            usbSetInterrupt((void *)&kbuf[kbuf_tail], sizeof(report_keyboard_t));
            kbuf_tail = (kbuf_tail + 1) % KBUF_SIZE;
            if (debug_keyboard) {
                print("V-USB: kbuf["); pdec(kbuf_tail); print("->"); pdec(kbuf_head); print("](");
                phex((kbuf_head < kbuf_tail) ? (KBUF_SIZE - kbuf_tail + kbuf_head) : (kbuf_head - kbuf_tail));
                print(")\n");
    for (int i = 0; i < VUSB_TRANSFER_KEYBOARD_MAX_TRIES; i++) {
        if (usbInterruptIsReady()) {
            if (kbuf_head != kbuf_tail) {
                usbSetInterrupt((void *)&kbuf[kbuf_tail], sizeof(report_keyboard_t));
                kbuf_tail = (kbuf_tail + 1) % KBUF_SIZE;
                if (debug_keyboard) {
                    print("V-USB: kbuf["); pdec(kbuf_tail); print("->"); pdec(kbuf_head); print("](");
                    phex((kbuf_head < kbuf_tail) ? (KBUF_SIZE - kbuf_tail + kbuf_head) : (kbuf_head - kbuf_tail));
                    print(")\n");
                }
            }
            break;
        }
    } else {
      usbPoll();
      vusb_transfer_keyboard();
        usbPoll();
        _delay_ms(1);
    }
}