Skip to content

Commit 1eb32b0

Browse files
committed
boards: add steelseries apex_pro_mini
Initial support for the Apex Pro Mini keyboard, based on STM32L412. Signed-off-by: Eve Redero <eve.redero@gmail.com>
1 parent 911b3da commit 1eb32b0

File tree

13 files changed

+533
-0
lines changed

13 files changed

+533
-0
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Copyright (c) 2025 Eve Redero
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
config BOARD_APEX_PRO_MINI
5+
select SOC_STM32L412XX
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Steelseries Apex Pro Mini keyboard configuration
2+
3+
# Copyright (c) 2025 Eve Redero
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
if BOARD_APEX_PRO_MINI
7+
8+
config SPI_STM32_INTERRUPT
9+
default y
10+
depends on SPI
11+
12+
config INPUT_KBD_MATRIX_16_BIT_ROW
13+
default y if INPUT_GPIO_KBD_MATRIX
14+
15+
config SPI_NOR_FLASH_LAYOUT_PAGE_SIZE
16+
default 4096 if FLASH
17+
18+
source "boards/common/usb/Kconfig.cdc_acm_serial.defconfig"
19+
20+
endif # BOARD_APEX_PRO_MINI
Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,246 @@
1+
/*
2+
* Copyright (c) 2025 Eve Redero
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/dts-v1/;
8+
#include <st/l4/stm32l412XB.dtsi>
9+
#include <st/l4/stm32l412rbtx-pinctrl.dtsi>
10+
#include <zephyr/dt-bindings/input/input-event-codes.h>
11+
#include <zephyr/dt-bindings/input/keymap.h>
12+
13+
/ {
14+
model = "SteelSeries Apex Pro Mini board";
15+
compatible = "steelseries,apex_pro_mini", "st,stm32l412";
16+
17+
chosen {
18+
zephyr,console = &cdc_acm_uart0;
19+
zephyr,shell-uart = &cdc_acm_uart0;
20+
zephyr,sram = &sram0;
21+
zephyr,flash = &flash0;
22+
};
23+
24+
leds: leds {
25+
compatible = "gpio-leds";
26+
27+
dbg_led: led_0 {
28+
gpios = <&gpioc 12 GPIO_ACTIVE_HIGH>;
29+
label = "User dbg tp";
30+
};
31+
};
32+
33+
aliases {
34+
led0 = &dbg_led;
35+
volt-sensor0 = &vref;
36+
volt-sensor1 = &vbat;
37+
};
38+
39+
kbd: kbd-matrix {
40+
compatible = "gpio-kbd-matrix";
41+
status = "okay";
42+
idle-mode = "poll";
43+
settle-time-us = <110>;
44+
no-ghostkey-check;
45+
col-drive-inactive;
46+
col-gpios = <&gpiob 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
47+
, <&gpiob 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
48+
, <&gpiob 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
49+
, <&gpiob 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
50+
, <&gpiob 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
51+
;
52+
row-gpios = <&gpioa 0 GPIO_ACTIVE_HIGH>
53+
, <&gpioa 1 GPIO_ACTIVE_HIGH>
54+
, <&gpioa 2 GPIO_ACTIVE_HIGH>
55+
, <&gpioa 3 GPIO_ACTIVE_HIGH>
56+
, <&gpioa 4 GPIO_ACTIVE_HIGH>
57+
, <&gpioa 5 GPIO_ACTIVE_HIGH>
58+
, <&gpioa 6 GPIO_ACTIVE_HIGH>
59+
, <&gpioa 7 GPIO_ACTIVE_HIGH>
60+
, <&gpioc 4 GPIO_ACTIVE_HIGH>
61+
, <&gpioc 5 GPIO_ACTIVE_HIGH>
62+
, <&gpioc 0 GPIO_ACTIVE_HIGH>
63+
, <&gpioc 1 GPIO_ACTIVE_HIGH>
64+
, <&gpioc 2 GPIO_ACTIVE_HIGH>
65+
, <&gpioc 3 GPIO_ACTIVE_HIGH>
66+
;
67+
68+
keymap {
69+
compatible = "input-keymap";
70+
row-size = <14>;
71+
col-size = <5>;
72+
keymap = <MATRIX_KEY(0, 0, INPUT_KEY_ESC)
73+
MATRIX_KEY(1, 0, INPUT_KEY_1)
74+
MATRIX_KEY(2, 0, INPUT_KEY_2)
75+
MATRIX_KEY(3, 0, INPUT_KEY_3)
76+
MATRIX_KEY(4, 0, INPUT_KEY_4)
77+
MATRIX_KEY(5, 0, INPUT_KEY_5)
78+
MATRIX_KEY(6, 0, INPUT_KEY_6)
79+
MATRIX_KEY(7, 0, INPUT_KEY_7)
80+
MATRIX_KEY(8, 0, INPUT_KEY_8)
81+
MATRIX_KEY(9, 0, INPUT_KEY_9)
82+
MATRIX_KEY(10, 0, INPUT_KEY_0)
83+
MATRIX_KEY(11, 0, INPUT_KEY_MINUS)
84+
MATRIX_KEY(12, 0, INPUT_KEY_EQUAL)
85+
MATRIX_KEY(13, 0, INPUT_KEY_BACKSPACE)
86+
MATRIX_KEY(0, 1, INPUT_KEY_TAB)
87+
MATRIX_KEY(1, 1, INPUT_KEY_A)
88+
MATRIX_KEY(2, 1, INPUT_KEY_Z)
89+
MATRIX_KEY(3, 1, INPUT_KEY_E)
90+
MATRIX_KEY(4, 1, INPUT_KEY_R)
91+
MATRIX_KEY(5, 1, INPUT_KEY_T)
92+
MATRIX_KEY(6, 1, INPUT_KEY_Y)
93+
MATRIX_KEY(7, 1, INPUT_KEY_U)
94+
MATRIX_KEY(8, 1, INPUT_KEY_I)
95+
MATRIX_KEY(9, 1, INPUT_KEY_O)
96+
MATRIX_KEY(10, 1, INPUT_KEY_P)
97+
MATRIX_KEY(11, 1, INPUT_KEY_LEFTBRACE)
98+
MATRIX_KEY(12, 1, INPUT_KEY_RIGHTBRACE)
99+
MATRIX_KEY(0, 2, INPUT_KEY_CAPSLOCK)
100+
MATRIX_KEY(1, 2, INPUT_KEY_Q)
101+
MATRIX_KEY(2, 2, INPUT_KEY_S)
102+
MATRIX_KEY(3, 2, INPUT_KEY_D)
103+
MATRIX_KEY(4, 2, INPUT_KEY_F)
104+
MATRIX_KEY(5, 2, INPUT_KEY_G)
105+
MATRIX_KEY(6, 2, INPUT_KEY_H)
106+
MATRIX_KEY(7, 2, INPUT_KEY_J)
107+
MATRIX_KEY(8, 2, INPUT_KEY_K)
108+
MATRIX_KEY(9, 2, INPUT_KEY_L)
109+
MATRIX_KEY(10, 2, INPUT_KEY_M)
110+
MATRIX_KEY(11, 2, INPUT_KEY_SEMICOLON)
111+
MATRIX_KEY(12, 2, INPUT_KEY_BACKSLASH)
112+
MATRIX_KEY(13, 2, INPUT_KEY_ENTER)
113+
MATRIX_KEY(0, 3, INPUT_KEY_LEFTSHIFT)
114+
MATRIX_KEY(1, 3, INPUT_KEY_HOME)
115+
MATRIX_KEY(2, 3, INPUT_KEY_W)
116+
MATRIX_KEY(3, 3, INPUT_KEY_X)
117+
MATRIX_KEY(4, 3, INPUT_KEY_C)
118+
MATRIX_KEY(5, 3, INPUT_KEY_V)
119+
MATRIX_KEY(6, 3, INPUT_KEY_B)
120+
MATRIX_KEY(7, 3, INPUT_KEY_N)
121+
MATRIX_KEY(8, 3, INPUT_KEY_M)
122+
MATRIX_KEY(9, 3, INPUT_KEY_COMMA)
123+
MATRIX_KEY(10, 3, INPUT_KEY_DOT)
124+
MATRIX_KEY(11, 3, INPUT_KEY_SLASH)
125+
MATRIX_KEY(13, 3, INPUT_KEY_RIGHTSHIFT)
126+
MATRIX_KEY(0, 4, INPUT_KEY_LEFTCTRL)
127+
MATRIX_KEY(1, 4, INPUT_KEY_LEFTMETA)
128+
MATRIX_KEY(2, 4, INPUT_KEY_LEFTALT)
129+
MATRIX_KEY(4, 4, INPUT_KEY_SPACE)
130+
MATRIX_KEY(7, 4, INPUT_KEY_RIGHTALT)
131+
MATRIX_KEY(8, 4, INPUT_KEY_RIGHTMETA)
132+
MATRIX_KEY(9, 4, INPUT_KEY_COFFEE)
133+
MATRIX_KEY(10, 4, INPUT_KEY_RIGHTCTRL)>;
134+
};
135+
};
136+
};
137+
138+
&clk_lsi {
139+
status = "okay";
140+
};
141+
142+
&clk_hsi {
143+
status = "okay";
144+
};
145+
146+
&clk_hsi48 {
147+
status = "okay";
148+
};
149+
150+
&pll {
151+
div-m = <1>;
152+
mul-n = <10>;
153+
div-q = <2>;
154+
div-r = <2>;
155+
clocks = <&clk_hsi>;
156+
status = "okay";
157+
};
158+
159+
&rcc {
160+
clocks = <&pll>;
161+
clock-frequency = <DT_FREQ_M(80)>;
162+
ahb-prescaler = <1>;
163+
apb1-prescaler = <1>;
164+
apb2-prescaler = <1>;
165+
};
166+
167+
&usart1 {
168+
pinctrl-0 = <&usart1_tx_pb6 &usart1_rx_pb7>;
169+
pinctrl-names = "default";
170+
current-speed = <115200>;
171+
status = "okay";
172+
};
173+
174+
&spi1 {
175+
pinctrl-0 = <&spi1_sck_pb3 &spi1_miso_pb4 &spi1_mosi_pb5>;
176+
pinctrl-names = "default";
177+
cs-gpios = <&gpioa 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
178+
status = "okay";
179+
180+
flash1: fm25q128c@0 {
181+
compatible = "jedec,spi-nor";
182+
reg = <0>;
183+
spi-max-frequency = <DT_FREQ_M(10)>;
184+
size = <DT_SIZE_K(16384)>;
185+
jedec-id = [a1 40 14];
186+
has-dpd;
187+
};
188+
};
189+
190+
&spi2 {
191+
pinctrl-0 = <&spi2_sck_pb13 &spi2_miso_pb14 &spi2_mosi_pb15>;
192+
pinctrl-names = "default";
193+
cs-gpios = <&gpiob 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
194+
status = "okay";
195+
};
196+
197+
&timers2 {
198+
status = "okay";
199+
200+
pwm2: pwm {
201+
status = "okay";
202+
pinctrl-0 = <&tim2_ch1_pa0>;
203+
pinctrl-names = "default";
204+
};
205+
};
206+
207+
&rtc {
208+
clocks = <&rcc STM32_CLOCK_BUS_APB1 0x10000000>,
209+
<&rcc STM32_SRC_LSI RTC_SEL(2)>;
210+
status = "okay";
211+
};
212+
213+
&flash1 {
214+
partitions {
215+
compatible = "fixed-partitions";
216+
#address-cells = <1>;
217+
#size-cells = <1>;
218+
219+
storage_partition: partition@0 {
220+
label = "storage";
221+
reg = <0x0 DT_SIZE_K(16384)>;
222+
};
223+
};
224+
};
225+
226+
&usb_fs_phy {
227+
status = "okay";
228+
};
229+
230+
zephyr_udc0: &usb {
231+
status = "okay";
232+
pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12 &usb_noe_pa13>;
233+
pinctrl-names = "default";
234+
235+
cdc_acm_uart0: cdc_acm_uart0 {
236+
compatible = "zephyr,cdc-acm-uart";
237+
};
238+
};
239+
240+
&vref {
241+
status = "okay";
242+
};
243+
244+
&vbat {
245+
status = "okay";
246+
};
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
identifier: apex_pro_mini
2+
name: SteelSeries Apex Pro Mini
3+
type: mcu
4+
arch: arm
5+
toolchain:
6+
- zephyr
7+
- gnuarmemb
8+
- xtools
9+
ram: 40
10+
flash: 64
11+
supported:
12+
- gpio
13+
- usb
14+
- spi
15+
- flash
16+
- kbd-matrix
17+
vendor: steelseries
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
3+
# Enable MPU
4+
CONFIG_ARM_MPU=y
5+
6+
# Enable HW stack protection
7+
CONFIG_HW_STACK_PROTECTION=y
8+
9+
# Enable GPIO
10+
CONFIG_GPIO=y
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
3+
board_runner_args(jlink "--device=STM32L412RB" "--speed=4000")
4+
5+
include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake)
6+
include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
board:
2+
name: apex_pro_mini
3+
full_name: Apex Pro Mini
4+
vendor: steelseries
5+
socs:
6+
- name: stm32l412xx
78.5 KB
Loading

0 commit comments

Comments
 (0)