Embedded software on ARM, from Linux kernel drivers to bare-metal firmware.

I develop Linux kernel drivers, microcontroller firmware and SIMD-optimized code for ARM platforms, with a specialty in real-time video processing.

For hardware and FPGA companies, and for Linux consultancies looking for a subcontractor. Fixed price per deliverable, against a performance target we agree on. Remote, white label on request.

Cortex-A · Linuxapplication · GUIuserspace librarykernel driverDevice Treeuserkernel/dev · ioctl · mmapNEONUART · I²CCortex-M · bare metalfirmwaredrivers · DMA · IRQperipheralsHelium · DSPLinux drivers · bare-metal firmware · SIMD optimization

Selected work

1280 × 1024 @ 60 fps
Video pipeline in ARM NEON, sustained on a Raspberry Pi 4 (Cortex-A72).
V4L2
Linux capture driver written from scratch for a Raspberry Pi board.
< 1 frame
Latency of a video framework for microcontrollers (Helium, Armv8-M DSP), depending on the stages enabled.

Targets and tools

  • Linux kernel
  • Device Tree
  • V4L2
  • Raspberry Pi
  • Cortex-A72
  • STM32
  • Cortex-M55
  • Cortex-M33
  • ARM NEON
  • Helium (MVE)
  • Armv8-M DSP
  • C99

Services

Embedded software on ARM, from the Linux kernel to the microcontroller. Most of my recent work has been in real-time video.

Linux kernel drivers

Drivers for custom hardware on ARM Linux boards, and the software that uses them.

  • Character, platform and V4L2 drivers, written from scratch or extended
  • Device Tree integration
  • Kernel–userspace interfaces: ioctl, sysfs, mmap
  • Userspace libraries, tools and GUIs on top of the driver
User space
Application · GUI
Userspace library
Interface
/dev · sysfs · ioctl
Kernel
Kernel driver
Device Tree
Hardware
Custom hardware

Bare-metal firmware on Cortex-M

Deterministic firmware for microcontrollers, from register-level drivers to the application.

  • STM32 family and other Cortex-M microcontrollers
  • Peripheral drivers: DMA, interrupts, timers, communication interfaces
  • Portable C99, static allocation, vendor HAL optional

Cortex-M MCU

CoreHelium / DSP
SRAM · static buffers
DMA
Peripherals · registers
  • C99
  • no malloc
  • no HAL

Performance optimization on ARM

Making C code meet its target on the real hardware: profiling, algorithmic work and SIMD.

  • ARM NEON on Cortex-A
  • Helium (MVE) on Cortex-M55, DSP instructions on Cortex-M33
  • A portable C reference kept next to every optimized version
  • Gains measured on the target, not estimated
8-bit lanes per instructionNEON · Cortex-A128-bitHelium · Cortex-M55128-bit4 beats × 32-bitDSP · Cortex-M3332-bit
rgb_to_y.cARM NEON · C99
#include <arm_neon.h>// RGB888 -> 8-bit luma, BT.601 weights 77/150/29 (sum 256).// 16 pixels per iteration; n is a multiple of 16.void rgb_to_y(const uint8_t *rgb, uint8_t *y, size_t n){    const uint8x8_t kr = vdup_n_u8(77);    const uint8x8_t kg = vdup_n_u8(150);    const uint8x8_t kb = vdup_n_u8(29);    for (size_t i = 0; i < n; i += 16) {        // Load 16 pixels and de-interleave R, G, B.        uint8x16x3_t px = vld3q_u8(rgb + 3 * i);        uint16x8_t lo = vmull_u8(vget_low_u8(px.val[0]), kr);        lo = vmlal_u8(lo, vget_low_u8(px.val[1]), kg);        lo = vmlal_u8(lo, vget_low_u8(px.val[2]), kb);        uint16x8_t hi = vmull_u8(vget_high_u8(px.val[0]), kr);        hi = vmlal_u8(hi, vget_high_u8(px.val[1]), kg);        hi = vmlal_u8(hi, vget_high_u8(px.val[2]), kb);        vst1q_u8(y + i, vcombine_u8(vshrn_n_u16(lo, 8),                                    vshrn_n_u16(hi, 8)));    }}

Illustrative excerpt: RGB888 to luma (BT.601), 16 pixels per iteration.

Real-time video processing

My specialty: pipelines that hold a frame rate and a latency budget, from capture to output.

  • On embedded Linux or on bare-metal microcontrollers
  • Frame-rate and latency targets agreed up front
  • From capture driver to optimized processing stages
  1. capture
  2. process
  3. output

fps · latency

How it works

Focused, well-scoped projects close to proven expertise, each priced as a deliverable.

  1. Scope and target

    We define the deliverable and a measurable objective together: throughput, latency, frame rate or footprint, on your target.

  2. Fixed quote

    You receive a fixed price for the deliverable. No daily rate, no open-ended billing.

  3. Measured delivery

    The code is delivered with measured results against the agreed objective.

Terms of engagement

Pricing
Fixed price per deliverable
Objective
A measurable objective in every engagement
Subcontracting
White label available for consultancies
Location
100% remote: France, Europe and international

Reference work

Selected past work, described by what it does and how fast it runs.

1280 × 1024 @ 60 fps

SXGA, sustained

Video processing pipeline in ARM NEON

A complete video processing pipeline written from scratch in ARM NEON, sustaining SXGA at 60 frames per second on a Raspberry Pi 4.

Target
Raspberry Pi 4 · Cortex-A72
Frame budget
16.7 ms
Throughput
78.6 Mpixel/s
RGB888 · 1280 × 1024NEON · 16 × u8 lanesvld3q_u8RGBvmull_u8 · vmlal_u8 · vshrn_n_u16Yvst1q_u816 px / iteration016.733.350.066.7 ms60 fps · 16.7 ms per frame

< 1 frame

end-to-end latency*

Real-time video framework for microcontrollers

A portable video processing framework for MCUs, handling several resolutions up to SXGA at 60 fps. Every processing algorithm exists as a generic C reference and as SIMD-optimized versions for two ARM cores.

Cortex-M55
Helium (MVE)
Cortex-M33
Armv8-M DSP instructions
Code
Pure C99, no malloc, no HAL
Portability
Any MCU; ported to two microcontroller targets

* Depends on the number of enabled processing stages.

inputoutputNNN+1N+1N+2N+2< 1 frame

V4L2

written from scratch

Linux capture driver

A V4L2 capture driver written from scratch for a Raspberry Pi board.

Subsystem
Video4Linux2 (V4L2)
Platform
Raspberry Pi
kerneluser spacecapturehardwareV4L2 driver/dev/video0applicationV4L2 · Video4Linux2

Background

I’m François Descamps. I came to software through electronics, and I still work where the two meet: drivers, firmware and optimized code that has to hold its timing on real hardware.

I also have earlier freelance experience: in 2018–2019 I built a connected radio prototype on Raspberry Pi as an independent embedded engineer, from the Linux setup and the audio code in C down to the circuit board.

Education and experience

  1. BTS in electronics

    Two-year French higher technician diploma.

  2. Embedded systems engineer, freelance

    Connected radio prototype on Raspberry Pi: radio receiver chips driven over I²C and I²S, audio streams in C with JACK, audio over Ethernet-over-USB, Debian setup and administration (networking, clustering), and the custom PCB in KiCad, from schematics and routing to soldering and debugging.

  3. École 42

    Software engineering, with a lot of C.

  4. Mines Saint-Étienne

    Engineering degree in embedded electronic systems, in parallel with École 42, as a work-study programme at Thales on embedded topics.

  5. Real-time video processing on ARM

    Since 2025

    Embedded software for real-time video: NEON, Helium and Cortex-M DSP pipelines, V4L2 capture driver.

Contact

The quickest way to start is an email describing your target.

Useful to include

  • Target platform and core
  • What needs to be built
  • Performance objective: throughput, latency, frame rate…
  • Deadline
New message
To
francois@descamps-systems.com
Subject
Project inquiry

Hello François,

Target platform / core:

What needs to be built:

Performance objective:

Deadline: