code.py
 1  # SPDX-FileCopyrightText: 2022 Jeff Epler for Adafruit Industries
 2  #
 3  # SPDX-License-Identifier: MIT
 4  # IBM Keyboard to USB Adapter
 5  import array
 6  import board
 7  import rp2pio
 8  import usb_hid
 9  from adafruit_hid.keyboard import Keyboard
10  from adafruit_hid.keycode import Keycode as K
11  import adafruit_pioasm
12  
13  # from https://www.scs.stanford.edu/10wi-cs140/pintos/specs/kbd/scancodes-9.html
14  # translating from "Set 1" to USB using the adafruit_hid keycode names
15  # fmt: off
16  xt_keycodes = [
17      None, K.ESCAPE, K.ONE, K.TWO, K.THREE, K.FOUR, K.FIVE, K.SIX,
18      K.SEVEN, K.EIGHT, K.NINE, K.ZERO, K.MINUS, K.EQUALS, K.BACKSPACE, K.TAB, K.Q,
19      K.W, K.E, K.R, K.T, K.Y, K.U, K.I, K.O, K.P, K.LEFT_BRACKET, K.RIGHT_BRACKET,
20      K.RETURN, K.LEFT_CONTROL, K.A, K.S, K.D, K.F, K.G, K.H, K.J, K.K, K.L,
21      K.SEMICOLON, K.QUOTE, K.GRAVE_ACCENT, K.SHIFT, K.BACKSLASH, K.Z, K.X, K.C, K.V,
22      K.B, K.N, K.M, K.COMMA, K.PERIOD, K.FORWARD_SLASH, K.RIGHT_SHIFT,
23      K.KEYPAD_ASTERISK, K.OPTION, K.SPACEBAR, K.CAPS_LOCK, K.F1, K.F2, K.F3, K.F4,
24      K.F5, K.F6, K.F7, K.F8, K.F9, K.F10, K.KEYPAD_NUMLOCK, K.SCROLL_LOCK,
25      K.KEYPAD_SEVEN, K.KEYPAD_EIGHT, K.KEYPAD_NINE, K.KEYPAD_MINUS, K.KEYPAD_FOUR,
26      K.KEYPAD_FIVE, K.KEYPAD_SIX, K.KEYPAD_PLUS, K.KEYPAD_ONE, K.KEYPAD_TWO,
27      K.KEYPAD_THREE, K.KEYPAD_ZERO, K.KEYPAD_PERIOD, None, None, None, K.F11, K.F12
28  ]
29  # fmt: on
30  
31  program = adafruit_pioasm.Program("""
32      wait 0 pin 2
33      in pins, 1
34      wait 1 pin 2
35  """,
36  build_debuginfo=True)
37  
38  sm = rp2pio.StateMachine(program.assembled,
39      first_in_pin = board.MISO,
40      in_pin_count = 3,
41      pull_in_pin_up = 0b111,
42      auto_push=True,
43      push_threshold=10,
44      in_shift_right=True,
45      frequency=8_000_000,
46      **program.pio_kwargs)
47  
48  buf = array.array('H', [0])
49  
50  print("Ready to type")
51  kbd = Keyboard(usb_hid.devices)
52  while True:
53      sm.readinto(buf, swap=False)
54      val = buf[0]
55      pressed = not val & 0x8000
56      key_number = (val >> 8) & 0x7f
57      if key_number > len(xt_keycodes):
58          print(f"invalid key number {key_number} pressed")
59          continue
60      keycode = xt_keycodes[key_number]
61      print(f"{keycode} {'PRESSED' if pressed else 'released'}")
62      if keycode is None:
63          continue
64      if pressed:
65          kbd.press(keycode)
66      else:
67          kbd.release(keycode)