Skip to content

Commit

Permalink
update usb_keyboard_hid
Browse files Browse the repository at this point in the history
  • Loading branch information
bradjc committed Feb 19, 2024
1 parent dbfa53a commit ce4c35c
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 26 deletions.
20 changes: 20 additions & 0 deletions libtock/interface/syscalls/usb_keyboard_hid_syscalls.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#include "usb_keyboard_hid_syscalls.h"

bool libtock_usb_keyboard_hid_exists(void) {
return driver_exists(DRIVER_NUM_USBKEYBOARDHID);
}

returncode_t libtock_usb_keyboard_hid_set_upcall(subscribe_upcall callback, void* opaque) {
subscribe_return_t sval = subscribe(DRIVER_NUM_USBKEYBOARDHID, 0, callback, opaque);
return tock_subscribe_return_to_returncode(sval);
}

returncode_t libtock_usb_keyboard_hid_set_readwrite_allow_send_buffer(uint8_t* buffer, uint32_t len) {
allow_rw_return_t aval = allow_readwrite(DRIVER_NUM_USBKEYBOARDHID, 1, (void*) buffer, len);
return tock_allow_rw_return_to_returncode(aval);
}

returncode_t libtock_usb_keyboard_hid_command_send(void) {
syscall_return_t cval = command(DRIVER_NUM_USBKEYBOARDHID, 1, 0, 0);
return tock_command_return_novalue_to_returncode(cval);
}
25 changes: 25 additions & 0 deletions libtock/interface/syscalls/usb_keyboard_hid_syscalls.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#pragma once

#include "tock.h"

#ifdef __cplusplus
extern "C" {
#endif

#define DRIVER_NUM_USBKEYBOARDHID 0x90005

// Check if this driver exists.
bool libtock_usb_keyboard_hid_exists(void);

// Configure the upcall for send/receive events.
returncode_t libtock_usb_keyboard_hid_set_upcall(subscribe_upcall callback, void* opaque);

// Set the buffer for sending data.
returncode_t libtock_usb_keyboard_hid_set_readwrite_allow_send_buffer(uint8_t* buffer, uint32_t len);

// Command to send the keyboard press to the host.
returncode_t libtock_usb_keyboard_hid_command_send(void);

#ifdef __cplusplus
}
#endif
42 changes: 16 additions & 26 deletions libtock/interface/usb_keyboard_hid.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,44 +4,34 @@
#include "tock.h"
#include "usb_keyboard_hid.h"

struct usb_keyboard_hid_data {
bool fired;
int callback_type;
};

static struct usb_keyboard_hid_data result = { .fired = false };

// Internal callback for faking synchronous reads
static void usb_keyboard_hid_upcall(int callback_type,
__attribute__ ((unused)) int unused1,
__attribute__ ((unused)) int unused2,
void* ud) {
struct usb_keyboard_hid_data* data = (struct usb_keyboard_hid_data*) ud;
data->callback_type = callback_type;
data->fired = true;
void* opaque) {
usb_keyboard_hid_callback cb = (usb_keyboard_hid_callback) opaque;
cb();
}


int usb_keyboard_hid_set_callback(subscribe_upcall callback, void* callback_args) {
subscribe_return_t sval = subscribe(DRIVER_NUM_USBKEYBOARDHID, 0, callback, callback_args);
return tock_subscribe_return_to_returncode(sval);
}

int usb_keyboard_hid_set_receive_buffer(uint8_t* buffer, uint32_t len) {
allow_rw_return_t aval = allow_readwrite(DRIVER_NUM_USBKEYBOARDHID, 1, (void*) buffer, len);
return tock_allow_rw_return_to_returncode(aval);
}

int usb_keyboard_hid_set_send_buffer(uint8_t* buffer, uint32_t len) {
allow_rw_return_t aval = allow_readwrite(DRIVER_NUM_USBKEYBOARDHID, 1, (void*) buffer, len);
return tock_allow_rw_return_to_returncode(aval);
}
returncode_t libtock_usb_keyboard_hid_send(uint8_t* buffer, uint32_t len, usb_keyboard_hid_callback cb) {
returncode_t err;
result.fired = false;

int usb_keyboard_hid_send(void) {
syscall_return_t cval = command(DRIVER_NUM_USBKEYBOARDHID, 1, 0, 0);
return tock_command_return_novalue_to_returncode(cval);
err = libtock_usb_keyboard_hid_set_upcall(usb_keyboard_hid_upcall, (void*) cb);
if (err < 0) return err;

err = libtock_usb_keyboard_hid_set_readwrite_allow_send_buffer(buffer, len);
if (err < 0) return err;

err = libtock_usb_keyboard_hid_command_send(); // Sometimes returns ERESERVE (but everything keeps working??)
return err;
}


int usb_keyboard_hid_send_sync(uint8_t* buffer, uint32_t len) {
int err;
result.fired = false;
Expand All @@ -66,7 +56,7 @@ int usb_keyboard_hid_send_sync(uint8_t* buffer, uint32_t len) {



static int to_hid_keycode(char c, uint8_t* modifier, uint8_t* key)
static int libtock_to_hid_keycode(char c, uint8_t* modifier, uint8_t* key)
{
uint8_t shift = 2; // KB_MODIFIER_LEFT_SHIFT = 2

Expand Down
5 changes: 5 additions & 0 deletions libtock/interface/usb_keyboard_hid.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ extern "C" {

#define DRIVER_NUM_USBKEYBOARDHID 0x90005


// Function signature for send done callbacks.
typedef void (*usb_keyboard_hid_callback)(void);


int usb_keyboard_hid_set_callback(subscribe_upcall callback, void* callback_args);
int usb_keyboard_hid_set_receive_buffer(uint8_t* buffer, uint32_t len);
int usb_keyboard_hid_set_send_buffer(uint8_t* buffer, uint32_t len);
Expand Down

0 comments on commit ce4c35c

Please sign in to comment.