Skip to content

Commit 92dcf2d

Browse files
hid keyboard driver now functioning via polling
1 parent 922fa70 commit 92dcf2d

File tree

3 files changed

+279
-110
lines changed

3 files changed

+279
-110
lines changed

src/keyboard.c

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -302,14 +302,24 @@ static void push_to_buffer(char x) {
302302
kfree_null(&log);
303303
return;
304304
}
305-
if (buffer_read_ptr > buffer_write_ptr) {
306-
beep(1000); // buffer overflow signal
307-
} else {
308-
keyboard_buffer[buffer_write_ptr++] = x;
309-
if (buffer_write_ptr >= sizeof(keyboard_buffer)) {
310-
buffer_write_ptr = 0;
305+
306+
size_t next = buffer_write_ptr + 1;
307+
if (next >= sizeof(keyboard_buffer)) {
308+
next = 0;
309+
}
310+
311+
/* buffer full if next write would collide with read */
312+
if (next == buffer_read_ptr) {
313+
beep(1000); /* buffer overflow signal */
314+
/* drop oldest to make room (advance read pointer) */
315+
buffer_read_ptr++;
316+
if (buffer_read_ptr >= sizeof(keyboard_buffer)) {
317+
buffer_read_ptr = 0;
311318
}
312319
}
320+
321+
keyboard_buffer[buffer_write_ptr] = x;
322+
buffer_write_ptr = next;
313323
}
314324

315325
void keyboard_process_scancode_input(uint8_t sc) {
@@ -384,23 +394,27 @@ void keyboard_handler(uint8_t isr, uint64_t errorcode, uint64_t irq, void *opaqu
384394
}
385395

386396
bool key_waiting() {
387-
return (buffer_read_ptr < buffer_write_ptr);
397+
return (buffer_read_ptr != buffer_write_ptr);
388398
}
389399

390400
unsigned char kpeek() {
391-
if (buffer_read_ptr >= buffer_write_ptr) {
401+
if (buffer_read_ptr == buffer_write_ptr) {
392402
return 255;
393403
}
394-
395404
return keyboard_buffer[buffer_read_ptr];
396405
}
397406

398407
unsigned char kgetc() {
399-
if (buffer_read_ptr >= buffer_write_ptr) {
408+
if (buffer_read_ptr == buffer_write_ptr) {
400409
return 255;
401410
}
402411

403-
return keyboard_buffer[buffer_read_ptr++];
412+
unsigned char c = keyboard_buffer[buffer_read_ptr];
413+
buffer_read_ptr++;
414+
if (buffer_read_ptr >= sizeof(keyboard_buffer)) {
415+
buffer_read_ptr = 0;
416+
}
417+
return c;
404418
}
405419

406420
_Noreturn void reboot(void) {

src/usb/hid.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ static int usage_present(const uint8_t *rep, uint8_t usage)
136136
return 0;
137137
}
138138

139+
static uint64_t up = 0;
140+
139141
static void process_mod_changes(uint8_t prev_mod, uint8_t cur_mod)
140142
{
141143
uint8_t changed = (uint8_t)(prev_mod ^ cur_mod);
@@ -144,7 +146,11 @@ static void process_mod_changes(uint8_t prev_mod, uint8_t cur_mod)
144146
int idx = __builtin_ctz(changed); /* 0..7 */
145147
uint8_t usage = (uint8_t)(0xE0u + idx);
146148
uint8_t make = hid_usage_to_set1(usage);
147-
if (cur_mod & bit) emit_make(make); else emit_break(make);
149+
if (cur_mod & bit) {
150+
emit_make(make);
151+
} else {
152+
emit_break(make);
153+
}
148154
changed = (uint8_t)(changed & (changed - 1));
149155
}
150156
}
@@ -155,26 +161,26 @@ static void hid_keyboard_report_cb(struct usb_dev *ud, const uint8_t *pkt, uint1
155161
{
156162
if (len < 8u) return;
157163

158-
dprintf("enter %lu\n", ints++);
164+
//dprintf("enter %lu\n", ints++);
159165

160166
/* disable HID’s built-in key repeat */
161167
if (memcmp(pkt, last_report, 8) == 0) {
162-
dprintf("leave rep\n");
168+
//dprintf("leave rep\n");
163169
return;
164170
}
165171

166172
/* 1) modifiers (byte 0) */
167173
process_mod_changes(last_report[0], pkt[0]);
168174

169-
/* 2) key array (bytes 2..7): releases first */
175+
/* 2) key array (bytes 2..7): releases first */
170176
for (int i = 2; i < 8; ++i) {
171177
uint8_t u = last_report[i];
172178
if (u && !usage_present(pkt, u)) {
173179
uint8_t mk = hid_usage_to_set1(u);
174180
emit_break(mk);
175181
}
176182
}
177-
/* then presses */
183+
/* then presses */
178184
for (int i = 2; i < 8; ++i) {
179185
uint8_t u = pkt[i];
180186
if (u && !usage_present(last_report, u)) {
@@ -185,7 +191,7 @@ static void hid_keyboard_report_cb(struct usb_dev *ud, const uint8_t *pkt, uint1
185191

186192
memcpy(last_report, pkt, 8);
187193

188-
dprintf("leave\n");
194+
//dprintf("leave\n");
189195
}
190196

191197
static void hid_on_device_added(const struct usb_dev *ud_c)

0 commit comments

Comments
 (0)