{"id":21380811,"url":"https://github.com/frameworkcomputer/inputmodules","last_synced_at":"2026-02-16T18:35:57.053Z","repository":{"id":148607843,"uuid":"565703470","full_name":"FrameworkComputer/InputModules","owner":"FrameworkComputer","description":"Reference designs and documentation for the Input Module system in the Framework Laptop 16","archived":false,"fork":false,"pushed_at":"2026-02-01T06:04:26.000Z","size":19578,"stargazers_count":216,"open_issues_count":5,"forks_count":16,"subscribers_count":8,"default_branch":"main","last_synced_at":"2026-02-01T16:54:47.243Z","etag":null,"topics":["framework","frameworklaptop"],"latest_commit_sha":null,"homepage":"https://frame.work/laptop-16","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FrameworkComputer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-11-14T06:25:07.000Z","updated_at":"2026-02-01T06:04:30.000Z","dependencies_parsed_at":"2024-11-30T02:47:26.350Z","dependency_job_id":null,"html_url":"https://github.com/FrameworkComputer/InputModules","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/FrameworkComputer/InputModules","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FrameworkComputer%2FInputModules","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FrameworkComputer%2FInputModules/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FrameworkComputer%2FInputModules/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FrameworkComputer%2FInputModules/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FrameworkComputer","download_url":"https://codeload.github.com/FrameworkComputer/InputModules/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FrameworkComputer%2FInputModules/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29514739,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-16T17:46:34.542Z","status":"ssl_error","status_checked_at":"2026-02-16T17:46:30.907Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["framework","frameworklaptop"],"created_at":"2024-11-22T10:42:50.636Z","updated_at":"2026-02-16T18:35:57.044Z","avatar_url":"https://github.com/FrameworkComputer.png","language":null,"readme":"# Framework Laptop 16 Input Modules\n![InputModules](https://user-images.githubusercontent.com/28994301/226249081-ab193cfe-4da4-4c47-93ec-c6024edf4fbc.png)\n\nThis repository includes mechanical and electrical documentation for the Input Module system in the\nFramework Laptop 16.  Input Modules are hot-swappable USB 2.0-interfaced devices that enable deep\ncustomization of the input system on the Framework Laptop 16.  It's also possible to use these as\nstandalone USB 2.0 devices with a simple adapter for development purposes.\n\nInput Modules come in three sizes, each of which has the same electrical interface:\n 1. Keyboard-sized modules (283.16mm wide)\n 2. Numpad-sized modules (67.85mm wide)\n 3. Half-sized modules (33.825mm wide)\n\nFor reference firmware for different types of modules, check out these additional repositories:\n * [QMK firmware](https://github.com/frameworkcomputer/qmk_firmware) for the keyboard and numpad modules\n * [inputmodule-rs](https://github.com/FrameworkComputer/inputmodule-rs) firmware and application for other input modules\n\n## License\nInput Modules © 2023-2026 by Framework Computer Inc is licensed under CC BY 4.0. To view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/\n\n## Firmware and Software\n\n### Keyboards\n\nAll keyboards (ANSI, ISO, Numpad, Macropad) run QMK firmware.\nFind the latest binary releases and source code in our [FrameworkComputer/qmk_firmware](https://github.com/FrameworkComputer/qmk_firmware/releases) repository.\n\nTo configure keybindings, use our hosted VIA fork, which has the right configurations built in at https://keyboard.frame.work.\nOr the [qmk_hid](https://github.com/FrameworkComputer/qmk_hid) native Python or Rust software GUI and console applications.\n\nHALs for RTOS or baremetal environments:\n\n- [rust-embedded](https://github.com/rp-rs/rp-hal-boards/tree/main/boards/framework16-keyboard)\n  - [capslock Sample](https://github.com/rp-rs/rp-hal-boards/blob/main/boards/framework16-keyboard/examples/capslock.rs)\n  - [white_backlight Sample](https://github.com/rp-rs/rp-hal-boards/blob/main/boards/framework16-keyboard/examples/white_backlight.rs)\n- [Zephyr](https://docs.zephyrproject.org/latest/boards/framework/laptop16_keyboard/doc/index.html)\n\nIS31FL3743 LED Controller Drivers:\n\n- [QMK](https://docs.qmk.fm/drivers/is31fl3743a)\n- [rust-embedded](https://docs.rs/is31fl3743a/latest/is31fl3743a/)\n- [CircuitPython](https://github.com/FrameworkComputer/CircuitPython_IS31FL3743)\n\n### LED Matrix\n\nOfficial firmware that ships with the modules is available in source and binary at [FrameworkComputer/inputmodule-rs](https://github.com/FrameworkComputer/inputmodule-rs).\nThat same repository also contains a Rust commandline utility and Python scripts to control the matrix.\n\nHALs for RTOS or baremetal environments:\n\n- [rust-embedded](https://github.com/rp-rs/rp-hal-boards/tree/main/boards/framework-ledmatrix)\n  - [ledtest Sample](https://github.com/rp-rs/rp-hal-boards/blob/main/boards/framework-ledmatrix/examples/ledtest.rs)\n- [Zephyr](https://docs.zephyrproject.org/latest/boards/framework/framework_ledmatrix/doc/index.html)\n\nIS31FL3741 LED Controller Drivers:\n\n- [QMK](https://docs.qmk.fm/drivers/is31fl3741)\n- [rust-embedded](https://docs.rs/is31fl3741/latest/is31fl3741)\n- [CircuitPython](https://github.com/adafruit/Adafruit_CircuitPython_IS31FL3741)\n\nThird party applications that interact with the official firmware:\n\n- [https://github.com/jpadgett314/led-matrix-vocab](jpadgett314/led-matrix-vocab) - A japanese vocab trainer\n\nThird party firmware projects that run on the official hardware:\n\n- [https://github.com/sigroot/FW_LED_Matrix_Firmware](sigroot/FW_LED_Matrix_Firmware) - Arduino based firmware with an alternative host protocol\n- [https://github.com/vddCore/sparkle-fw16](vddCore/sparkle-fw16) - Pico SDK based firmware with an alternative host protocol\n\n### CircuitPython\n\nCircuitPython can run on all modules.\n\nSample Code:\n\n- [github.com/FrameworkComputer/Framework_Inputmodule_CircuitPython](https://github.com/FrameworkComputer/Framework_Inputmodule_CircuitPython)\n\nLibraries:\n\n- [Keyboard RGB Controller Adafruit_CircuitPython_IS31FL3741](https://github.com/adafruit/Adafruit_CircuitPython_IS31FL3741)\n- [Keyboard RGB Controller - Framework CircuitPython_IS31FL3743](https://github.com/FrameworkComputer/CircuitPython_IS31FL3743)\n\n## Mechanical\n\nIn the Mechanical folder, we have 2D drawings of the different Input Module sizes.  Note that there are two version of each:\n 1. A version with full mechanical structure with a separate interface PCB and brackets.  This is what our production modules are based on.\n 2. A simplified version that allows the PCB to be used as the mechanical structure of the module, making it much cheaper and easier to make.\n    Note that to make the PCB attach securely in the system, you'll need to solder SMT nuts like Keystone\t24929 or to adhere a steel plate to attract to\n    the magnets in the system.\n\n## Electrical\n\nIn the Electrical folder, we have a reference version of a minimal RP2040-based Input Module, made in KiCAD.\n\n### Pinout\n\n| Pin | Function | Note                                                              |\n|-----|----------|-------------------------------------------------------------------|\n| 1   | GND      |                                                                   |\n| 2   | VCC_5V   | 5V, power supply from the system.                                 |\n| 3   | USB_DN   | USB D-                                                            |\n| 4   | BOARD_ID | Pull to GND through BOARD_ID resistor defined below               |\n| 5   | USB_DP   | USB D+                                                            |\n| 6   | SLEEP#   | 3.3V if the host is in S0.  0V if the host is in S0ix, S3, S4, S5 |\n| 7   | GND      |                                                                   |\n| 8   | VCC_3V3  | 3.3V, power supply from the system.                               |\n\nViewed from top:\n\n![image](https://user-images.githubusercontent.com/28994301/223607129-ab8e1dcf-dd1f-49f1-9e67-03e9ca072348.png)\n\n### Module Type Detection\n\nEmbedded Controller firmware detects location, type and size of modules by\nmeasuring the value of a pull down resistor on each connector.\nThis detection is only used for diagnostics and power sequencing (see below).\nUSB functionality is enabled on any connector no matter the module type or presence.\n\n| ID | Row    | Module Type          | Size | Module Pulldown Resistor |\n|----|--------|----------------------|------|--------------------------|\n| 0  |        | Short                |      | NA                       |\n| 1  |        | Reserved             |      | 10000                    |\n| 2  |        | Reserved             |      | 18000                    |\n| 3  |        | Reserved             |      | 27000                    |\n| 4  |        | Reserved             |      | 39000                    |\n| 5  |        | Reserved             |      | 56000                    |\n| 6  | Top    | Generic Full Width   | Full | 68000                    |\n| 7  |        | Reserved             |      | 82000                    |\n| 8  | Top    | Generic A size       | A    | 120000                   |\n| 9  | Top    | Generic B size       | B    | 150000                   |\n| 10 | Top    | Generic C size       | C    | 180000                   |\n| 11 | Top    | Numpad/Macropad      | B    | 270000                   |\n| 12 | Top    | Keyboard             | A    | 330000                   |\n| 13 | Bottom | Touchpad             | B    | 560000                   |\n| 14 |        | Reserved             |      | 820000                   |\n| 15 | Both   | Not installed        |      | NA                       |\n\nThe LED matrix and plastic spacers are both \"Generic C size\".\n\n### Power\n\nEach Input Module supports up to 500mA on the 5V rail and 100mA on the 3.3V rail when active.\n\nThe Framework Laptop 16 has a protection scheme in place to prevent Input Modules from powering on unless the input deck is fully populated.\nModule detection is done using the `BOARD_ID` pin. It is possible to override this setting on the system through BIOS settings, but at the risk of shorting the system or modules.\n\nSystem firmware expects that pogo connector where the module presents the board\nID, is at the very left of the module. It uses this assumption to calculate\nsize and position of modules and detect if the input deck is fully populated\nand all pogo pins are covered.\n\nThe following top-row combinations are accepted by firmware:\n\n| Conn 1 | Conn 2 | Conn 3 | Conn 4 | Conn 5 |\n|--------|--------|--------|--------|--------|\n| Full   |        |        |        |        |\n|        | Full   |        |        |        |\n|        |        | Full   |        |        |\n|        |        |        | Full   |        |\n|        |        |        |        | Full   |\n| A      |        |        | B      |        |\n| A      |        |        | C      | C      |\n| C      | A      |        |        | C      |\n| B      |        | A      |        |        |\n| C      | C      | A      |        |        |\n\n#### `SLEEP#` pin behavior\n\n| Platform              | BIOS | `SLEEP#`        |\n|-----------------------|------|-----------------|\n| AMD Ryzen 7040 Series | 3.XX | Lid and Suspend |\n| AMD Ryzen 7040 Series | 4.XX | Lid state       |\n| AMD AI 300 Series     | Any  | Lid state       |\n\nOn the first generation Framework 16 with BIOS 3.XX the `SLEEP#` pin is low\nwhenever the system is in S0ix (suspend) state or the lid is closed.\n\nOn the 2nd gen or 1st gen with BIOS 4.XX the `SLEEP#` pin is only low if the lid is closed.\nThis change was made because the keyboard and touchpad firmware couldn't decide between\n\nWhen SLEEP# is low or USB is in Selective Suspend mode, modules should drop below 500uA on each rail.  This will typically occur when the\nsystem enters an S0ix state. In S3/S4/S5 or when the laptop lid is closed, the power rails will typically be off.\n\nF2 on boot \u003e Setup Utility \u003e Advanced \u003e Force Power for Input Modules:\n\n- Force Off: Power always off\n- Require Modules (default): Power on only if all modules are present\n- Force On: Power always on\n\nIn the case of Force On, there is a risk of damage when the pins are exposed and come into contact with conductive material.\n\n## Touchpad Module\n\nThis section describes the Touchpad Module connection on the **system** side, including the pin define and the pin map of the connector.\nThere are three connectors for the touchpad, to allow moving it around. They are all shorted together on the same I2C bus with the same interrupt lines.\n\nPins on the connector have ESD protection to meet IEC 61000-4-2 Level 4 protection.\n\n| Pin | Function | Note                                                |\n|-----|----------|-----------------------------------------------------|\n| 1   | GND      |                                                     |\n| 2   | VCC_5V   | 5V, power supply from the system.                   |\n| 3   | I2C_SCL  | I2C Serial Clock Line                               |\n| 4   | BOARD_ID | Pull to GND through BOARD_ID resistor defined below |\n| 5   | I2C_SDA  | I2C Serial Data Line                                |\n| 6   | TP_INT_1 | Secondary interrupt for touchpad future features    |\n| 7   | TP_INT_0 | Main interrupt for touchpad                         |\n| 8   | VCC_3V3  | 3.3V, power supply from the system.                 |\n\n![image](https://github.com/FrameworkComputer/InputModules/assets/28994301/720e272d-1239-40ba-8b62-a537b74ff71a)\n\n### Touchpad Module layout requirements\n\nThe contacts on the Touchpad should be designed so that the ground pins engage first when the Touchpad is sliding in.\nPin 7 should be 0.5mm longer than the other pins to ensure it engages first.\n\nThe below picture for pads is shown in perspective. The view angle is on top of the PCB.\n\nAround the signal pads there should be a ground fill keepout to prevent the pogo connectors from shorting the pads\nto ground or other signals when sliding in if the solder mask is scraped away.\n\n![image](https://github.com/FrameworkComputer/InputModules/assets/28994301/e8d65dad-9d55-4d5a-b97c-3ccbd33e1fb6)\n\n### Touchpad I2C Protocol\n\nThe I2C bus from the touchpad is connected to the CPU for HID over I2C and\nimplements the [Precision Touchpad Protocol](https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/touchpad-protocol-implementation).\n\nIt's also connected to the EC. This is used when booting without a touchpad.\nIf the Windows driver tries to connect to an I2C device but finds it does not respond, it will disable that device.\nSo we make the [EC pretend](https://github.com/FrameworkComputer/EmbeddedController/commit/9d49389919c36e44e451514b8278b9eb7ee6ed1e)\nto be the touchpad and send the same HID report descriptor as the touchpad would.\n\n## One Key Module\n\nSee [One Key Module](/OneKeyModule).\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fframeworkcomputer%2Finputmodules","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fframeworkcomputer%2Finputmodules","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fframeworkcomputer%2Finputmodules/lists"}