1
- # Framework Laptop 16 - Input Module Firmware/ Software
1
+ # Framework Laptop 16 - Input Module Software
2
2
3
- This repository contains both the firmware for the Framework Laptop 16 input modules,
4
- as well as the tool to control them .
3
+ This repository contains a python library and scripts to control the
4
+ (non-keyboard) input modules, which is currently just the LED Matrix .
5
5
6
- Rust firmware project setup based off of: https://github.com/rp-rs/rp2040-project-template
6
+ ## Installing
7
7
8
- ## Modules
8
+ Pre-requisites: Python with pip
9
9
10
- See pages of the individual modules for details about how they work and how
11
- they're controlled.
12
-
13
- - [ LED Matrix] ( ledmatrix/README.md )
14
- - [ Minimal C1 Input Module] ( c1minimal/README.md )
15
- - [ 2nd Display] ( b1display/README.md )
16
- - [ QT PY RP2040] ( qtpy/README.md )
17
-
18
- ## Generic Features
19
-
20
- All modules are built with an RP2040 microcontroller
21
- Features that all modules share
22
-
23
- - Firmware written in bare-metal Rust
24
- - Reset into RP2040 bootloader when firmware crashes/panics
25
- - Sleep Mode to save power
26
- - API over USB ACM Serial Port - Requires no Drivers on Windows and Linux
27
- - Go to sleep
28
- - Reset into bootloader
29
- - Control and read module state (brightness, displayed image, ...)
10
+ ``` sh
11
+ python3 -m pip install framework16_inputmodule
12
+ ```
30
13
31
14
## Control from the host
32
15
33
- To build your own application see the: [ API command documentation] ( commands.md )
34
-
35
- Or use our ` inputmodule-control ` app, which you can download from the latest
36
- [ GH Actions] ( https://github.com/FrameworkComputer/led_matrix_fw/actions ) run or
37
- the [ release page] ( https://github.com/FrameworkComputer/led_matrix_fw/releases ) .
38
- Optionally there are is also a [ Python script] ( python.md ) .
39
-
40
- For device specific commands, see their individual documentation pages.
16
+ To build your own application see the: [ API command documentation] ( https://github.com/FrameworkComputer/inputmodule-rs/tree/main/commands.md )
41
17
42
18
###### Permissions on Linux
43
19
To ensure that the input module's port is accessible, install the ` udev ` rule and trigger a reload:
@@ -52,126 +28,131 @@ sudo udevadm control --reload && sudo udevadm trigger
52
28
###### Listing available devices
53
29
54
30
``` sh
55
- > inputmodule-control --list
56
- /dev/ttyACM0
57
- VID 0x32AC
58
- PID 0x0020
59
- SN FRAKDEAM0020110001
60
- Product LED_Matrix
31
+ > ledmatrixctl
32
+ More than 1 compatible device found. Please choose with --serial-dev ...
33
+ Example on Windows: --serial-dev COM3
34
+ Example on Linux: --serial-dev /dev/ttyACM0
61
35
/dev/ttyACM1
62
- VID 0x32AC
63
- PID 0x0021
64
- SN FRAKDEAM0000000000
65
- Product B1_Display
36
+ VID: 0x32AC
37
+ PID: 0x0020
38
+ SN: FRAKDEBZ0100000000
39
+ Product: LED Matrix Input Module
40
+ /dev/ttyACM0
41
+ VID: 0x32AC
42
+ PID: 0x0020
43
+ SN: FRAKDEBZ0100000000
44
+ Product: LED Matrix Input Module
66
45
```
67
46
68
47
###### Apply command to single device
69
48
70
- By default a command will be sent to all devices that can be found, to apply it
71
- to a single device, specify the COM port.
72
- In this example the command is targeted at ` b1-display ` , so it will only apply
73
- to this module type.
49
+ When there are multiple devices you need to select which one to control.
74
50
75
51
```
76
52
# Example on Linux
77
- > inputmodule-control --serial-dev /dev/ttyACM0 b1-display --pattern black
53
+ > ledmatrixctl --serial-dev /dev/ttyACM0 --percentage 33
78
54
79
55
# Example on Windows
80
- > inputmodule-control.exe --serial-dev COM5 b1-display --pattern black
56
+ > ledmatrixctl --serial-dev COM5 --percentage 33
81
57
```
82
58
83
- ###### Send command when device connects
59
+ ### Graphical Application
60
+
61
+ Launch the graphical application
84
62
85
- By default the app tries to connect with the device and aborts if it can't
86
- connect. But you might want to start the app, have it wait until the device is
87
- connected and then send the command.
63
+ ``` sh
64
+ # Either via the commandline
65
+ ledmatrixctl --gui
88
66
67
+ # Or using the standanlone application
68
+ ledmatrixgui
89
69
```
90
- > inputmodule-control b1-display --pattern black
91
- Failed to find serial devivce. Please manually specify with --serial-dev
92
70
93
- # No failure, waits until the device is connected, sends command and exits
94
- > inputmodule-control --wait-for-device b1-display --pattern black
71
+ ### Other example commands
72
+
73
+ ``` sh
95
74
96
- # If the device is already connected, it does nothing, just wait 1s.
97
- # This means you can run this command by a system service and restart it when
98
- # it finishes. Then it will only ever do anything if the device reconnects.
99
- > inputmodule-control --wait-for-device b1-display --pattern black
100
- Device already present. No need to wait. Not executing command.
75
+ # Show current time and keep updating it
76
+ ledmatrixctl --clock
77
+
78
+ # Draw PNG or GIF
79
+ ledmatrixctl --image stripe.gif
80
+ ledmatrixctl --image stripe.png
81
+
82
+ # Change brightness (0-255)
83
+ ledmatrixctl --brightness 50
84
+ ```
85
+
86
+ ### All commandline options
87
+
88
+ ```
89
+ > ledmatrixctl --help
90
+ options:
91
+ -h, --help show this help message and exit
92
+ -l, --list List all compatible devices
93
+ --bootloader Jump to the bootloader to flash new firmware
94
+ --sleep, --no-sleep Simulate the host going to sleep or waking up
95
+ --is-sleeping Check current sleep state
96
+ --brightness BRIGHTNESS
97
+ Adjust the brightness. Value 0-255
98
+ --get-brightness Get current brightness
99
+ --animate, --no-animate
100
+ Start/stop vertical scrolling
101
+ --get-animate Check if currently animating
102
+ --pwm {29000,3600,1800,900}
103
+ Adjust the PWM frequency. Value 0-255
104
+ --get-pwm Get current PWM Frequency
105
+ --pattern {...} Display a pattern
106
+ --image IMAGE Display a PNG or GIF image in black and white only)
107
+ --image-grey IMAGE_GREY
108
+ Display a PNG or GIF image in greyscale
109
+ --camera Stream from the webcam
110
+ --video VIDEO Play a video
111
+ --percentage PERCENTAGE
112
+ Fill a percentage of the screen
113
+ --clock Display the current time
114
+ --string STRING Display a string or number, like FPS
115
+ --symbols SYMBOLS [SYMBOLS ...]
116
+ Show symbols (degF, degC, :), snow, cloud, ...)
117
+ --gui Launch the graphical version of the program
118
+ --panic Crash the firmware (TESTING ONLY)
119
+ --blink Blink the current pattern
120
+ --breathing Breathing of the current pattern
121
+ --eq EQ [EQ ...] Equalizer
122
+ --random-eq Random Equalizer
123
+ --wpm WPM Demo
124
+ --snake Snake
125
+ --snake-embedded Snake on the module
126
+ --pong-embedded Pong on the module
127
+ --game-of-life-embedded {currentmatrix,pattern1,blinker,toad,beacon,glider}
128
+ Game of Life
129
+ --quit-embedded-game Quit the current game
130
+ --all-brightnesses Show every pixel in a different brightness
131
+ -v, --version Get device version
132
+ --serial-dev SERIAL_DEV
133
+ Change the serial dev. Probably /dev/ttyACM0 on Linux, COM0 on Windows
101
134
```
102
135
103
136
## Update the Firmware
104
137
105
138
First, put the module into bootloader mode.
106
139
107
- This can be done either by pressing the bootsel button while plugging it in or
140
+ This can be done either by flipping DIP switch # 2 or
108
141
by using one of the following commands:
109
142
110
143
``` sh
111
- inputmodule-control led-matrix --bootloader
112
- inputmodule-control b1-display --bootloader
113
- inputmodule-control c1-minimal --bootloader
144
+ > ledmatrixctl --bootloader
114
145
```
115
146
116
147
Then the module will present itself in the same way as a USB thumb drive.
117
148
Copy the UF2 firmware file onto it and the device will flash and reset automatically.
118
- Alternatively when building from source, run one of the following commands:
119
-
120
- ``` sh
121
- cargo run -p ledmatrix
122
- cargo run -p b1display
123
- cargo run -p c1minimal
124
- ```
125
-
126
- ## Building the firmware
127
-
128
- Dependencies: Rust
129
-
130
- Prepare Rust toolchain (once):
131
-
132
- ``` sh
133
- rustup target install thumbv6m-none-eabi
134
- cargo install flip-link
135
- ```
136
-
137
- Build:
138
-
139
- ``` sh
140
- cargo make --cwd ledmatrix
141
- cargo make --cwd b1display
142
- cargo make --cwd c1minimal
143
- ```
144
-
145
- Generate the UF2 update file:
146
-
147
- ``` sh
148
- cargo make --cwd ledmatrix uf2
149
- cargo make --cwd b1display uf2
150
- cargo make --cwd c1minimal uf2
151
- ```
152
-
153
- ## Building the Application
154
-
155
- Dependencies: Rust, pkg-config, libudev
156
-
157
- Currently have to specify the build target because it's not possible to specify a per package build target.
158
- Tracking issue: https://github.com/rust-lang/cargo/issues/9406
159
-
160
- ```
161
- # Build it
162
- > cargo make --cwd inputmodule-control
163
-
164
- # Build and run it, showing the tool version
165
- > cargo make --cwd inputmodule-control run -- --version
166
149
```
167
150
168
151
### Check the firmware version of the device
169
152
170
- ###### In-band using commandline
171
-
172
153
```sh
173
- > inputmodule-control b1-display --version
174
- Device Version: 0.1.3
154
+ > ledmatrixctl --version
155
+ Device Version: 0.1.7
175
156
```
176
157
177
158
###### By looking at the USB descriptor
@@ -180,18 +161,7 @@ On Linux:
180
161
181
162
``` sh
182
163
> lsusb -d 32ac: -v 2> /dev/null | grep -P ' ID 32ac|bcdDevice'
183
- Bus 003 Device 078: ID 32ac:0021 Framework Laptop 16 B1 Display
184
- bcdDevice 0.10
164
+ Bus 003 Device 078: ID 32ac:0020 Framework Computer Inc LED Matrix Input Module
165
+ bcdDevice 0.17
185
166
```
186
167
187
- ## Rust Panic
188
-
189
- When the Rust code panics, the RP2040 resets itself into bootloader mode.
190
- This means a new firmware can be written to overwrite the old one.
191
-
192
- Additionally the panic message is written to XIP RAM, which can be read with [ picotool] ( https://github.com/raspberrypi/picotool ) :
193
-
194
- ``` sh
195
- sudo picotool save -r 0x15000000 0x15004000 message.bin
196
- strings message.bin | head
197
- ```
0 commit comments