
LPC 00
probe-rs/hive
A Raspberry PI shield for testing probe-rs against many chips & probes.

In this assignment the target platform changes from the STM32F407 to the NXP S32K118, an Arm Cortex‑M0+ microcontroller from the S32K1xx automotive family.
Ers s32-board is an open-source printed circuit board by schrodlm, from the schrodlm/nxp_hal repository on GitHub. It is a 4-layer board of 88.9 × 96.5 mm with 138 parts on 188 nets, routed with 2,340 tracks and 632 vias.
It is built around the FS32K118LAT0MLHT, LPC55S69JBD64K and TJA1044GTK/3Z, with the SHT40-BD1B-R2, M95080-RMN6TP and PEC12R-4220F-S0024 among its other parts. Its parts include 43 capacitors, 39 resistors, 13 connectors, 12 diodes and 8 ICs. It belongs with the NXP (LPC, Kinetis, i.MX RT) boards of this library.
In this assignment the target platform changes from the STM32F407 to the NXP S32K118, an Arm Cortex‑M0+ microcontroller from the S32K1xx automotive family. On STM32, STM32CubeMX generated both the initialization code and a Hardware Abstraction Layer (HAL). On the S32K118, no vendor HAL is provided: you are given the CMSIS‑style register definitions and a minimal project skeleton, and the objective of this assignment is to implement the HAL yourself.
For every peripheral used in the exercises, a header file with a complete Doxygen description of the API (functions, parameters, preconditions, pin mapping) is supplied. Your task is to implement the corresponding .c files so that the provided example programs in main.c behave as specified.
⚠️ Before powering the board on and before flashing anything, the board jumpers must be reconfigured for the S32K118:
- move the STM jumper to the OFF position (disables the STM32 side by keeping it all the time in reset);
- move the S32 jumper to the RST position (connects the reset signal on S32 to the reset button on the board).
- connect the board via a USB-C Once this is done, the STM32 development board may remain physically attached to the shield — it does not interfere with the sensors/actuators.
The exact jumper locations are shown in the board schematic and in the KiCad project under ers-board-v1.2/. See in particular ers-board-v1.2/schematics.pdf and the KiCad sources under ers-board-v1.2/kicad/ 210_prog_soft_start.kicad_sch for the programmer/reset‑related jumpers, and the other sheets for the peripheral pin assignments referenced by the HAL headers.

The project is self‑contained and is organized as follows (simplified):
├── CMakeLists.txt # top-level build script
├── devices/ # CMSIS headers, startup code, linker script
│ ├── common/s32_core_cm0.h
│ ├── S32K118/… # register definitions, linker scripts, SVD
│ ├── device_registers.h
│ ├── callbacks.h
│ ├── devassert.h
│ ├── floats.h
│ ├── status.h
│ └── startup.c / .h
├── src/
│ ├── core/ # provided: clock, systick, UART, syscalls
│ │ ├── clock.c / .h
│ │ ├── systick.c / .h
│ │ ├── syscalls.c / .h
│ │ ├── debug_uart.c / .h
│ │ └── system.c / .h # system_init() convenience
│ ├── lib/ # to be implemented: only the .h files are given
│ │ ├── led.h # implement led.c
│ │ ├── btn.h # implement btn.c
│ │ ├── btn_cnt.h # implement btn_cnt.c
│ │ ├── kpad.h # implement kpad.c
│ │ ├── enc.h # implement enc.c
│ │ ├── servo.h # implement servo.cProvided:
devices/ — NXP CMSIS register headers, startup code, and the GCC linker script.src/core/ — clock at 40 MHz, SysTick at 1 ms, debug UART (printf over LPUART1 at 1 Mbps), and syscalls. Calling system_init() performs all of this.src/lib/lcd_font.{c,h} — 5×7 bitmap font used by the LCD driver.src/eXX_*/main.c — the main.c of every exercise.CMakeLists.txt — all build targets, including flashing targets (UP_*).To be implemented:
.c file per peripheral under src/lib/, implementing the API documented in the corresponding header. The header files contain the full specification (pin mapping, required behavior, preconditions, ISR contracts, and so on) and should be read carefully before starting.No new main.c is to be written.
Two tools are required: an ARM GCC toolchain (for cross‑compilation) and OpenOCD (for flashing and debugging).
A recent OpenOCD (version ≥ 0.12.0+dev – from 2026) is required. Older distribution packages frequently lack correct support for the S32K target. Prebuilt releases are available from https://github.com/openocd-org/openocd/releases.
In addition, CMake (≥ 3.20) and a build driver (Ninja is recommended; make is also supported) are required.
The use of an IDE with integrated CMake support, such as CLion or Visual Studio Code (with the CMake Tools and Cortex‑Debug extensions), is strongly recommended. CLion ships its own bundled copies of CMake and Ninja, so under CLion only the ARM GCC toolchain and OpenOCD have to be installed separately. Both IDEs provide integrated support for GDB + OpenOCD debugging.
arm-none-eabi package). Alternatively, it can be installed via the Scoop package manager: scoop install gcc-arm-none-eabi. Students who already have STM32CubeCLT installed from a previous assignment do not need to install anything else, since STM32CubeCLT ships arm-none-eabi-gcc and arm-none-eabi-gdb as part of its distribution.bin/ directory to PATH (or invoke the executable with its full path).Install the ARM GCC toolchain via your distribution's package manager (the package name varies between distributions; on Debian/Ubuntu it is gcc-arm-none-eabi).
The project uses CMake with the cross‑compilation toolchain configured directly inside CMakeLists.txt (which forces arm-none-eabi-gcc and links against the S32K118 linker script). The recommended way of working with the project is to open it as a CMake project in CLion or VS Code and let the IDE drive the configuration, build, and flashing steps.
For each exercise target eXX_name, the build produces:
eXX_name.elf — ELF file with debug symbols (consumed by GDB);eXX_name.hex — Intel HEX file (consumed by the flashing command);eXX_name.map — linker map;eXX_name.asm — full disassembly listing, useful for diagnosing subtle HAL issues.The development board is connected via CMSIS‑DAP over SWD. Each exercise defines an auto‑generated flashing target named UP_<target>.elf (for example, UP_e00_starter.elf). Building this target from the IDE builds the corresponding exercise, programs the flash, verifies the content, and resets the microcontroller. (The UP_* targets are custom CMake targets — they are built, not run. In CLion and VS Code, select the target from the target selector and invoke the usual build command.)
printf() is routed to LPUART1 (pins PTC7/TX and PTC6/RX) at 1 Mbps, 8N1 by debug_uart_init(), which is invoked from system_init().
A USB‑to‑UART adapter must be connected to these pins and a terminal application (for example PuTTY, Tera Term, minicom, picocom, or the VS Code Serial Monitor extension) configured for 1 000 000 baud, 8N1, no flow control.
Several modules (e01_led, e02_btn, e03_btn_cnt, e08_eeprom) are accompanied by a companion test.c that runs on the board. The tests are written against Unity, a small C unit‑testing framework designed for embedded targets. Each test file defines a set of test_* functions and registers them with RUN_TEST(...) inside main; Unity executes them sequentially, compares actual and expected values via TEST_ASSERT_* macros, and prints a PASS/FAIL line per test together with a summary of the whole run. The framework itself lives under unity/ and is linked automatically into every test binary.
The corresponding binaries are exposed through the TST_* target prefix (for example, UP_TST_e01_led.elf builds and flashes the test variant of the LED exercise). Test results are printed on the debug UART. Some tests require an additional jumper wire; refer to the comments at the top of each test.c file for details.
printfprintf is the most immediate diagnostic instrument available and will be used throughout the assignment. The following points should be observed:
\n or call fflush(stdout) explicitly. The C runtime line‑buffers stdout, and a message without a newline may remain in the buffer and never be transmitted over the UART.printf from interrupt service routines. LPUART1 blocks when its transmit FIFO is full, so a verbose ISR may stall the main loop. For ISRs, either set a flag and perform the output from the main loop, or restrict the output to a single character via debug_uart_putchar().%f conversion specifier. Use integer formatting (milli‑units or fixed‑point) instead.Several reference PDFs are provided under examples/s32/docs/. You will not need to read any of them cover to cover; each one is a lookup reference for a specific layer of the stack.
S32K-RM.pdf — S32K1xx Series Reference Manual. The primary document for this assignment. Contains the description of every peripheral (GPIO/PORT, LPSPI, LPI2C, LPUART, LPIT, ADC, FTM, DMA/DMAMUX, FlexCAN, …) and the corresponding register maps, together with the pin‑mux (PORT alternate‑function) tables and the DMAMUX source tables (which DMA request number corresponds to which peripheral). The register names used in the manual match the macros in devices/S32K118/include/S32K118.h, so a chapter in this PDF translates directly to the register writes you need in your .c file. Consult it whenever you are configuring a new peripheral, wiring a pin to an alternate function, or hooking a peripheral to a DMA channel. Note: the reference manuals has a number of attachments, including S32K118 IO signal description input multiplexing and S32K1xx DMA interrupt mapping as excel files. To see the attachments, open the PDF in a capable viewer (for example, Foxit PDF Reader or Acrobat Reader) and look for the attachments pane.
S32K1xx.pdf — S32K1xx Data Sheet. Electrical characteristics, memory map overview, clock tree, and package pin assignments. Useful for the electrical/timing side of things; the functional pin‑mux information is in S32K-RM.pdf (see above).Arm_Architecture_v6m_Reference_Manual.pdf — ARMv6‑M Architecture Reference Manual. Defines the instruction set, exception model, and programmer's model of the Cortex‑M0+ core. Needed only if you want to read or understand Thumb assembly (for example, the .asm listing produced by the build) or when dealing with low‑level exception behavior.DDI0484C_cortex_m0p_r0p1_trm.pdf — Cortex‑M0+ Technical Reference Manual. Implementation‑specific documentation of the CPU core (NVIC layout, SysTick, pipeline behavior). Relevant mainly when you are configuring the NVIC (interrupt enable/priority) or SysTick — both of which are already done for you in core/, but are worth consulting if you add your own interrupts.DUI0662B_cortex_m0p_r0p1_dgug.pdf — Cortex‑M0+ Devices Generic User Guide. A tutorial‑style companion to the TRM, written from a programmer's point of view. Often a gentler starting point when the TRM is too dense.In short: start from the corresponding header in src/lib/, look up the peripheral chapter (and the pin‑mux and DMAMUX tables) in S32K-RM.pdf and fall back to the Cortex‑M0+ documents only for core‑side questions (interrupts, exceptions, low‑level CPU behavior).
Each HAL module should be implemented one at a time and verified with the corresponding exercise program. The recommended procedure for every exercise is:
.h file in src/lib/ and read the Doxygen description in full (pin mapping, expected behavior, whether functions may be called from ISR context, notes on listeners, and so on).docs/S32K-RM.pdf). The register names in the manual match the macros in devices/S32K118/include/S32K118.h..c file in src/lib/. No modification to CMakeLists.txt is required — the top‑level CMakeLists.txt already references the expected filenames.UP_eXX_...elf target to flash the corresponding exercise, and verify the behavior on the board and over UART.UP_TST_eXX_...elf target and confirm that all test cases pass on the debug UART. Executing the provided tests is a mandatory part of the assignment: a module counts as correctly implemented only once its test reports all PASS. Any additional wiring required by the test is documented at the top of the corresponding test.c file.You are allowed to use AI coding assistants (Copilot, ChatGPT, Claude, Gemini, …) while working on this assignment, but the following conditions apply:
docs/S32K-RM.pdf before trusting it, especially for PORT PCR (MUX field), PCC clock gates, peripheral enable bits, DMAMUX source numbers, and NVIC settings.PCC->PCCn[...] = …, every PORT->PCR[...] = …, every LPSPIx->CFGRx = …, and so on, why those bits are set the way they are and what the resulting hardware behavior is. "The AI wrote it" is not an acceptable answer. If you cannot explain a line, treat that as a signal to go back and read the relevant section of the Reference Manual until you can.Target: e00_starter.
Goal: verify that the complete toolchain (build, flash, serial terminal, debugger) is functional before any HAL code is written. No HAL code is required for this exercise; only the provided core modules are used.
Expected behavior: once flashed, the board prints one line per second on the debug UART:
[0000000003] Counter 0
[0000001003] Counter 1
[0000002003] Counter 2
…If the output is garbled, verify that the terminal is configured for 1 Mbps. If there is no output at all, verify that the USB‑to‑UART adapter is wired to PTC7 and PTC6 and that no other device is driving these pins.
Target: e01_led. Module: led.c.
Goal: implement GPIO output control for the four on‑board LEDs. Verified by e01_led cycling through the LEDs one at a time.
Build the UP_TST_e01_led.elf target to flash and execute the unit test, and confirm that all cases report PASS on the debug UART.
Target: e02_btn. Module: btn.c.
Goal: implement GPIO input and PORT‑interrupt handling for the four on‑board buttons. Verified by e02_btn printing the button state on every edge.
Build the UP_TST_e02_btn.elf target to flash and execute the unit test, and confirm that all cases report PASS on the debug UART.
Target: e03_btn_cnt. Module: btn_cnt.c.
Goal: implement a debounced press counter on top of btn.c and the SysTick listener mechanism, following the state machine described in btn_cnt.h. Verified by e03_btn_cnt reporting a stable count even under rapid repeated presses.
Build the UP_TST_e03_btn_cnt.elf target to flash and execute the unit test, and confirm that all cases report PASS on the debug UART.
Target: e04_kpad. Module: kpad.c.
Goal: implement scanning of the external 3×4 matrix keypad. Verified by e04_kpad printing the set of pressed keys whenever it changes.
Target: e05_enc. Module: enc.c.
Goal: implement quadrature decoding of the rotary encoder using FTM1, plus GPIO input for the encoder push button. Verified by e05_enc printing the encoder position and resetting it on button press.
Target: e06_servo. Module: servo.c.
Goal: implement 50 Hz PWM control of the SG90 servo using FTM0. Verified by e06_servo driving the servo from the encoder position.
Modules: spi.c, lcd.c.
Goal: implement the SPI driver for LPSPI0 and the ST7565 graphical LCD driver on top of it.
This exercise is split into two phases and should be done in order:
e07_lcd. Start with the blocking SPI (spi_txrx) and the full framebuffer‑based drawing API. The implementation busy‑waits on the LPSPI TDF/RDF flags. Verified by e07_lcd showing a static text pattern and animated pixels.e07_lcd-dma (OPTIONAL, for the daring ones). Once the blocking variant works, add the DMA path (spi_dma_txrx plus the asynchronous path in lcd.c), compiled with the SPI_WITH_DMA definition that the e07_lcd-dma target already provides. The on‑screen behavior must be identical; the difference is that the main loop stays responsive during SPI transfers. This phase is optional — it is significantly more involved than the blocking variant, and students may skip it and move on to exercise 8.Read spi.h carefully before starting the DMA phase — especially the instructions on the buffer alignment and byte‑swap.
The DMA variant offloads the entire transfer to eDMA + LPSPI, so spi_dma_txrx() can return immediately and the caller is notified later via a callback. Before starting, read spi.h in full — it fixes the observable contract (non‑blocking semantics, 4‑byte buffer alignment, byte swap, split TX/RX callbacks). The implementation can then proceed roughly as follows:
Two DMA channels. Allocate one channel for TX (source = memory buffer, destination = LPSPI0->TDR) and one for RX (source = LPSPI0->RDR, destination = memory buffer). Route the LPSPI0 TX and RX requests to them via DMAMUX (sources 15 and 14) and enable LPSPI's DMA request generation with DER = TDDE | RDDE.
4‑byte transfer granularity. Program the eDMA TCDs with SSIZE = DSIZE = 2 (meaning 2² = 4 bytes) and NBYTES = 4. The major‑loop iteration count is count / 4. This is why spi.h requires buffers aligned to 4 bytes.
Byte swap. The Cortex‑M0+ is little‑endian, but LPSPI shifts out TDR MSB‑first. Setting LPSPI_TCR_BYSW = 1 reverses the byte order inside each 32‑bit transfer, so the bytes appear on the wire in the same order as they sit in memory.
Frame size. LPSPI_TCR_FRAMESZ = count * 8 − 1 controls exactly how many bits are clocked. A byte count that is not a multiple of 4 therefore stops in the middle of the last word; the tail (count & 3 bytes) is handled differently on TX and RX:
TX tail — scatter‑gather. Prepare a second TCD (statically allocated, 32‑byte aligned) that transfers a single 32‑bit word from a small staging variable into TDR. Before starting the transfer, copy the rem = count & 3 tail bytes into that staging word right‑aligned, so that after the byte swap they clock out in the correct order. Link the two TCDs by setting the main TCD's DLASTSGA to the address of the tail TCD and CSR.ESG = 1; when the main major loop finishes, eDMA automatically switches to the tail TCD. When count is a multiple of 4, scatter‑gather is disabled and CSR.DREQ = 1 stops the channel cleanly after the major loop.
RX tail — LPSPI Frame‑Complete IRQ. The RX DMA channel only receives a request once a full 32‑bit word is in the RX FIFO, and so it will never service the tail. Enable the LPSPI frame‑complete interrupt (IER.FCIE = 1) and, inside the ISR, read LPSPI0->RDR once and un‑swap the remaining bytes into the caller's RX buffer.
Completion callbacks. Two callbacks are delivered independently, matching the spi.h contract:
CSR.INTMAJOR = 1) when count % 4 == 0; otherwise it is fired from the LPSPI frame‑complete ISR after the tail has been drained.Idle tracking. Keep two independent idle flags (TX, RX); each becomes false when its side is queued and true again only once its callback has been invoked. spi_is_idle() returns the conjunction; spi_dma_txrx() refuses a new request if either side is still busy.
The LCD driver on top of this must become asynchronous as well: lcd_update() starts a DMA transfer and returns immediately, and the DC and CS lines must be toggled inside the callbacks (not inline after spi_dma_txrx()), since at that point no bit has yet left the shift register. The header shows the callback‑chaining pattern to use.
Target: e08_eeprom. Module: eeprom.c.
Goal: implement page‑level read and write access to the M95080 SPI EEPROM, including WIP polling. Verified by e08_eeprom writing a test pattern to page 0, reading it back, and turning the green LED on if the contents match (red otherwise).
Build the UP_TST_e08_eeprom.elf target to flash and execute the unit test, and confirm that all cases report PASS on the debug UART.
Target: e09_joy. Module: joy.c.
Goal: implement 12‑bit ADC conversions of the joystick X/Y channels on ADC0, plus the push‑button GPIO. Verified by e09_joy streaming the joystick state over UART.
Target: e10_sht. Module: sht40.c.
Goal: implement the SHT40 driver over LPI2C0 with periodic, asynchronous measurements triggered by LPIT channel 0. Verified by e10_sht, which integrates the sensor with the LCD and EEPROM from the earlier exercises: the current and min/max temperature/humidity are displayed on the LCD and persisted across reset.
Please refer to the cookbook for examples of how to use registers to configure and how to use peripherals.
The book references a repo with example code, which has moved to the following location: https://github.com/nxp-auto-support/s32k118_cookbook
Submit your solution in the assignment5/ folder of your course GitLab repository. For each implemented module, include the .c file (and any other files that have been modified). The build-debug/ and build-release/ directories should not be committed.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 23 | 10k | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R10, R11, R12, R15, R16, R17, R19, R24, R25, R26, R27, R30, R31, R32, R33, R34 +7 |
| 22 | 100nF | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C2, C3, C10, C11, C12, C13, C14, C15, C16, C17, C22, C25, C26, C28, C29, C31 +6 |
| 8 | 10uF | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C1, C4, C6, C8, C23, C30, C35, C43 |
| 5 | PTS815SJM250SMTR_LFS | ers-s32-board:PTS815SJM250SMTR_LFS | S1, S2, S3, S4, S5 |
| 4 | 100pF | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C33, C34, C38, C39 |
| 4 | 3k9 | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R3, R20, R28, R29 |
| 4 | MountingHole | MountingHole:MountingHole_3mm | H1, H2, H3, H4 |
| 3 | 0R | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R13, R14, R18 |
| 3 | 1k | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R7, R21, R22 |
| 3 | SolderJumper_2_Bridged | Jumper:SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm | JP2, JP3, JP4 |
| 2 | 10nF | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C41, C42 |
| 2 | 22uF | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C9, C19 |
| 2 | 2pF | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C24, C27 |
| 2 | 5k1 | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R1, R2 |
| 2 | 8pF | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C20, C21 |
| 2 | B5817WS | Diode_SMD:D_SOD-323 | D1, D3 |
| 2 | BLM18KG601SN1D | Inductor_SMD:L_0603_1608Metric_Pad1.05x0.95mm_HandSolder | FB1, FB2 |
| 2 | DLW21SZ900HQ2L | ers-s32-board:L_choke_DLW21SZ | L2, L3 |
| 2 | PESD2IVN24-TR | Package_TO_SOT_SMD:SOT-23 | D4, D5 |
| 2 | TJA1044GTK/3Z | ers-s32-board:HVSON-8-1EP_3x3mm_P0.65mm_EP1.6x2.4mm | U2, U3 |
| 2 | XL-1608SURC-06 | ers-s32-board:XL-1608_LED_0603 | LED2, LED6 |
| 2 | XL-1608UGC-06A | ers-s32-board:XL-1608_LED_0603 | LED1, LED4 |
| 2 | XL-1608UYC-06 | ers-s32-board:XL-1608_LED_0603 | LED3, LED5 |
| 1 | 120 | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R6 |
| 1 | 1k5 | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R23 |
| 1 | 20k | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R5 |
| 1 | 2k2 | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R8 |
| 1 | 3225-16-8-10-10/A | ers-s32-board:3225-16-8-10-10_A | Y1 |
| 1 | 47pF | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C18 |
| 1 | 4u7H | ers-s32-board:LCD0805 | L1 |
| 1 | CAN_HDR | Connector_PinHeader_2.54mm:PinHeader_2x03_P2.54mm_Vertical | J7 |
| 1 | CTRL_P1 | Connector_PinHeader_2.54mm:PinHeader_2x22_P2.54mm_Vertical | J1 |
| 1 | CTRL_P2 | Connector_PinHeader_2.54mm:PinHeader_2x22_P2.54mm_Vertical | J2 |
| 1 | Conn_ARM_SWD_TagConnect_TC2030-NL | Connector:Tag-Connect_TC2030-IDC-NL_2x03_P1.27mm_Vertical | J5 |
| 1 | DISCO_P1 | ers-s32-board:DISCO_Socket | J4 |
| 1 | DISCO_P2 | ers-s32-board:DISCO_Socket | J6 |
| 1 | DISPLAY | Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical | J12 |
| 1 | DMG3406L | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | FS32K118LAT0MLHT | ers-s32-board:FS32K118LAT0MLHT | IC2 |
| 1 | KEYPAD | Connector_PinHeader_2.54mm:PinHeader_1x07_P2.54mm_Horizontal | J13 |
| 1 | LPC55S69JBD64K | ers-s32-board:LPC55S69JBD64K | IC1 |
| 1 | M95080-RMN6TP | ers-s32-board:M95080-RMN6TP | IC5 |
| 1 | PEC12R-4220F-S0024 | ers-s32-board:PEC12R-4220F-S0024 | IC4 |
| 1 | POWER | ers-s32-board:Pairwise_Connected_PinHeader_2x06_P2.54mm_Vertical | J9 |
| 1 | PROG_ISP | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | JP1 |
| 1 | PRTR5V0U2AX,215 | ers-s32-board:PRTR5V0U2AX,215 | D2 |
| 1 | Pairwise_connected_ex56_02x06_Odd_Even | ers-s32-board:Pairwise_Connected_ex56_PinHeader_2x06_P2.54mm_Vertical | J8 |
| 1 | RST_SRC | Connector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_Vertical | J10 |
| 1 | SERVO | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J11 |
| 1 | SHT40-BD1B-R2 | ers-s32-board:SHT40-BD1B-R2 | IC3 |
| 1 | SX20Y040000B81T008 | Crystal:Crystal_SMD_2016-4Pin_2.0x1.6mm | Y2 |
| 1 | SolderJumper_2_Open | Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm | JP5 |
| 1 | TPS70933QDRV | Package_SON:WSON-6-1EP_2x2mm_P0.65mm_EP1x1.6mm | U1 |
| 1 | TYPE-C 16PIN 2MD(073) | ers-s32-board:TYPE-C 16PIN 2MD(073) | J3 |
| 1 | XL-1608UBC-06A | ers-s32-board:XL-1608_LED_0603 | LED7 |
| 1 | ~ | ers-s32-board:JOYSTICK_THUMB | JOY1 |

probe-rs/hive
A Raspberry PI shield for testing probe-rs against many chips & probes.


Churrosoft/OpenEFI-PCB
Coleccion de PCB y planos recomendados para montar una OpenEFI




bbokser/persuasive_waker
An open source hardware alarm clock that can't be snoozed or turned off.

It measures 88.9 × 96.5 mm and has 4 copper layers, 1.64 mm thick.
138 parts, built around the FS32K118LAT0MLHT, LPC55S69JBD64K, TJA1044GTK/3Z and SHT40-BD1B-R2. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the schrodlm/nxp_hal repository on GitHub, at the commit this page was made from: the board is ers-board-v1.2/kicad/ers-s32-board.kicad_pcb and its schematic ers-board-v1.2/kicad/100_usb_eds_filter.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask schrodlm before reusing the design.