Skip to content

Commit 9cb3e13

Browse files
committed
ps2pico-1.1
1 parent 8e2dd9d commit 9cb3e13

File tree

3 files changed

+38
-31
lines changed

3 files changed

+38
-31
lines changed

CMakeLists.txt

+8-2
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,21 @@ pico_sdk_init()
1717

1818
add_executable(ps2pico ps2pico.c)
1919

20+
add_compile_definitions(DEBUG=0)
21+
add_compile_definitions(CLKIN=14)
22+
add_compile_definitions(CLKOUT=15)
23+
add_compile_definitions(DATOUT=16)
24+
add_compile_definitions(DATIN=17)
25+
2026
pico_generate_pio_header(ps2pico ${CMAKE_CURRENT_LIST_DIR}/ps2device.pio)
2127

2228
pico_set_program_name(ps2pico "ps2pico")
23-
pico_set_program_version(ps2pico "1.0")
29+
pico_set_program_version(ps2pico "1.1")
2430

2531
pico_enable_stdio_uart(ps2pico 1)
2632
pico_enable_stdio_usb(ps2pico 0)
2733

2834
target_include_directories(ps2pico PUBLIC ${CMAKE_CURRENT_LIST_DIR})
2935
target_link_libraries(ps2pico pico_stdlib hardware_pio tinyusb_host tinyusb_board)
3036

31-
pico_add_extra_outputs(ps2pico)
37+
pico_add_extra_outputs(ps2pico)

ps2device.pio

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
; SPDX-License-Identifier: MIT
55
;
66

7-
.program ps2dev
7+
.program ps2device
88
.side_set 1 opt
99

1010
start:
@@ -51,8 +51,8 @@ sendloop:
5151

5252
% c-sdk {
5353

54-
void ps2dev_program_init(PIO pio, uint sm, uint offset, uint clkin, uint clkout, uint datin, uint datout) {
55-
pio_sm_config c = ps2dev_program_get_default_config(offset);
54+
void ps2device_program_init(PIO pio, uint sm, uint offset, uint clkin, uint clkout, uint datin, uint datout) {
55+
pio_sm_config c = ps2device_program_get_default_config(offset);
5656

5757
pio_gpio_init(pio, clkout);
5858
pio_gpio_init(pio, datout);

ps2pico.c

+27-26
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,6 @@
2828
#include "bsp/board.h"
2929
#include "tusb.h"
3030

31-
#define CLKIN 14
32-
#define CLKOUT 15
33-
#define DATIN 17
34-
#define DATOUT 16
35-
3631
uint8_t const led2ps2[] = { 0, 4, 1, 5, 2, 6, 3, 7 };
3732
uint8_t const mod2ps2[] = { 0x14, 0x12, 0x11, 0x1f, 0x14, 0x59, 0x11, 0x27 };
3833
uint8_t const hid2ps2[] = {
@@ -62,7 +57,6 @@ uint32_t repeat_us = 35000;
6257
uint16_t delay_ms = 250;
6358
alarm_id_t repeater;
6459

65-
uint8_t comp_rpt[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
6660
uint8_t prev_rpt[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
6761
uint8_t prev_ps2 = 0;
6862
uint8_t resend = 0;
@@ -89,6 +83,7 @@ uint16_t ps2_frame(uint8_t data) {
8983
}
9084

9185
void ps2_send(uint8_t data) {
86+
if(DEBUG) printf("ps2_send: %02x\n", data);
9287
resend = data;
9388
pio_sm_put(pio, sm, ps2_frame(data));
9489
}
@@ -110,14 +105,16 @@ void kbd_set_leds(uint8_t data) {
110105
}
111106

112107
int64_t blink_callback(alarm_id_t id, void *user_data) {
113-
if(kbd_addr) {
114-
if(blinking) {
115-
kbd_set_leds(7);
116-
blinking = false;
117-
return 500000;
118-
} else {
108+
if(blinking) {
109+
if(kbd_addr) kbd_set_leds(7);
110+
blinking = false;
111+
return 500000;
112+
} else {
113+
if(kbd_addr) {
119114
kbd_set_leds(0);
120115
ps2_send(0xaa);
116+
} else {
117+
ps2_send(0xfc);
121118
}
122119
}
123120
return 0;
@@ -137,6 +134,7 @@ void ps2_receive(uint32_t fifo) {
137134
}
138135

139136
uint8_t data = fifo;
137+
if(DEBUG) printf("ps2_receive: %02x\n", data);
140138

141139
switch(prev_ps2) {
142140
case 0xed: // CMD: Set LEDs
@@ -208,7 +206,11 @@ void ps2_receive(uint32_t fifo) {
208206
}
209207

210208
void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_report, uint16_t desc_len) {
209+
if(DEBUG) printf("HID device address = %d, instance = %d is mounted\n", dev_addr, instance);
210+
211211
if(tuh_hid_interface_protocol(dev_addr, instance) == HID_ITF_PROTOCOL_KEYBOARD) {
212+
if(DEBUG) printf("HID Interface Protocol = Keyboard\n");
213+
212214
kbd_addr = dev_addr;
213215
kbd_inst = instance;
214216

@@ -221,6 +223,8 @@ void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_re
221223
}
222224

223225
void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) {
226+
if(DEBUG) printf("HID device address = %d, instance = %d is unmounted\n", dev_addr, instance);
227+
224228
if(dev_addr == kbd_addr && instance == kbd_inst) {
225229
kbd_addr = 0;
226230
kbd_inst = 0;
@@ -236,7 +240,6 @@ void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t cons
236240
}
237241

238242
board_led_write(1);
239-
memcpy(comp_rpt, prev_rpt, sizeof(comp_rpt));
240243

241244
if(report[0] != prev_rpt[0]) {
242245
uint8_t rbits = report[0];
@@ -267,8 +270,6 @@ void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t cons
267270
pbits = pbits >> 1;
268271

269272
}
270-
271-
comp_rpt[0] = report[0];
272273
}
273274

274275
for(uint8_t i = 2; i < 8; i++) {
@@ -325,11 +326,9 @@ void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t cons
325326
ps2_send(hid2ps2[report[i]]);
326327
}
327328
}
328-
329-
comp_rpt[i] = report[i];
330329
}
331330

332-
memcpy(prev_rpt, comp_rpt, sizeof(prev_rpt));
331+
memcpy(prev_rpt, report, sizeof(prev_rpt));
333332
tuh_hid_receive_report(dev_addr, instance);
334333
board_led_write(0);
335334

@@ -339,17 +338,19 @@ void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t cons
339338
void irq_callback(uint gpio, uint32_t events) {
340339
if(!gpio_get(DATIN) && !pio_interrupt_get(pio, 0)) {
341340
board_led_write(1);
341+
if(DEBUG) printf(" IRQ ");
342342
pio_sm_drain_tx_fifo(pio, sm);
343343
pio_sm_exec(pio, sm, pio_encode_jmp(offset + 2));
344344
}
345345
}
346346

347347
void main() {
348348
board_init();
349+
printf("\n%s-%s DEBUG=%s\n", PICO_PROGRAM_NAME, PICO_PROGRAM_VERSION_STRING, DEBUG ? "true" : "false");
349350

350351
sm = pio_claim_unused_sm(pio, true);
351-
offset = pio_add_program(pio, &ps2dev_program);
352-
ps2dev_program_init(pio, sm, offset, CLKIN, CLKOUT, DATIN, DATOUT);
352+
offset = pio_add_program(pio, &ps2device_program);
353+
ps2device_program_init(pio, sm, offset, CLKIN, CLKOUT, DATIN, DATOUT);
353354

354355
gpio_set_irq_enabled_with_callback(CLKIN, GPIO_IRQ_EDGE_RISE, true, &irq_callback);
355356
tusb_init();
@@ -367,12 +368,12 @@ void main() {
367368

368369
if(repeat) {
369370
if(repeatmod) {
370-
if(repeat > 3 && repeat != 6) ps2_send(0xe0);
371-
ps2_send(mod2ps2[repeat - 1]);
372-
} else {
373-
maybe_send_e0(repeat);
374-
ps2_send(hid2ps2[repeat]);
375-
}
371+
if(repeat > 3 && repeat != 6) ps2_send(0xe0);
372+
ps2_send(mod2ps2[repeat - 1]);
373+
} else {
374+
maybe_send_e0(repeat);
375+
ps2_send(hid2ps2[repeat]);
376+
}
376377
}
377378
}
378379
}

0 commit comments

Comments
 (0)