LinkedIn ↗
Adharna Kumar, black-and-white portrait

Adharna
Kumar

Senior Embedded Software Engineer · Automotive & IoT

I build connected devices.

From the first register write to devices in the field: boot, connectivity, secure updates, and everything that breaks after deployment.

Scroll the story
Pin maphover a pin
Boot log · scroll to power up
Career · since 2016
06
System blocks online
01 · Bring up

Boards come alive: BSP, drivers, FreeRTOS and Embedded Linux on Cortex-A and Cortex-M33.

How the work actually happens

Spec to
ship.

mapping every requirement to the test that proves it
drawing the sequence before the first line
no malloc in the hot path
feeding it a corrupted image on purpose
reading the crash a device kept for me
01

Require

Customer needs become software requirements, each one traced to a test.

02

Design

Use-case and sequence diagrams, frame formats and failure modes (FMEA) before code.

03

Build

MISRA C on FreeRTOS, bare metal and Embedded Linux, with static allocation and bounded retries.

04

Validate

Simulators, fault injection, JTAG flash readback, coverage and end-of-line test firmware.

05

Ship

Staged OTA rollout, field logs, and crash data that survives a reset.

Experience

Where it
runs.

Fleet telematics

Embedded Linux telematics with LTE, Wi-Fi and BLE, store-and-forward buffering and remote logs.

01 / 06
Adharna beside a truck in a fleet depot at night, holding a telematics device Adharna next to a wall-mounted EV charger plugged into a car Adharna crouched by an open car door, laptop connected to the diagnostic port Adharna examining a small wireless sensor beside a laptop Adharna holding an LTE router in front of a server rack
Case studies

Built, tested,
shipped.

Each case has a simulation you can run.

01

An update must never brick the device it updates.

Secure OTA · MCU and Embedded Linux

The problem

Devices update over the air with no technician nearby. A bad or tampered image must never run.

What I did

  • A/B dual-bank updates with CRC, AES decryption and signature checks finished before the bank swap.
  • On the EV charger, updates flashed only from the TrustZone-M secure region.
  • A bare-metal secondary bootloader that boots only a verified image.

The proof

Deliberately corrupted images fed through the live update path. JTAG flash readback confirmed every one was rejected and the active image stayed untouched.

OTA simulation · bootloader viewTry both
Bank Aactive
Bank Bstandby
  1. Receive image
  2. CRC32 integrity
  3. AES decrypt
  4. Signature verify
  5. Swap active bank
Bank A active · waiting for an image
02

Implementing DoIP instead of integrating it.

Diagnostics over Ethernet · STM32H5 · FreeRTOS

The problem

Vehicle diagnostics are moving from CAN to Ethernet, and the controller needed DoIP on a memory-constrained MCU.

What I did

  • A full ISO 13400 stack on DMA-driven lwIP, with the TCP/IP stack tuned to a tight RAM budget.
  • Designed a DoIP vehicle simulator, implemented with AI assistance, emulating a DoIP entity and multiple ECUs.

The proof

Routing, addressing and vehicle identification validated in simulation before any vehicle hardware was available.

DoIP session · tester ⇄ gatewayExample addresses and VIN
  1. →Vehicle identification request UDP 1340002 FD 00 01 00 00 00 00
  2. ←Vehicle announcement VIN · addr 0x101002 FD 00 04 00 00 00 21 …
  3. →Routing activation request TCP 1340002 FD 00 05 00 00 00 07 0E 00 00 00 00 00 00
  4. ←Routing activation response 0x10 · activated02 FD 00 06 00 00 00 09 0E 00 10 10 10 00 00 00 00
  5. →UDS 0x22 ReadDataByIdentifier DID F190 · VIN02 FD 80 01 00 00 00 07 0E 00 10 10 22 F1 90
  6. ←Diagnostic message ACK02 FD 80 02 00 00 00 05 10 10 0E 00 00
  7. ←UDS 0x62 positive response VIN02 FD 80 01 00 00 00 18 10 10 0E 00 62 F1 90 31 48 47 42 48 34 31 4A 58 …
03

The bugs that only show up in the field.

Debugging · post-mortem · supervision

The problem

Crashes and memory corruption that never reproduce in the lab.

What I did

  • A HardFault handler that keeps the program counter and stack pointer in backup SRAM across reset.
  • Per-task stack high-water marks that traced lwIP corruption to a task-stack overflow.
  • Layered supervision: hang detection, process restart, hardware watchdog.

The proof

Rebooted field units report why they crashed, and a leak found with Valgrind and AddressSanitizer stopped forcing restarts.

Post-mortem · backup SRAMIllustrative values
PC—
LR—
SP—
CFSR—
BFAR—
Resetpower-on
Last reset: power-on · no crash record in backup SRAM
Personal projects

Sometimes I
build at home.

Same discipline, different device.

Rust · Kubernetes

AutoDecode AI ↗

An automotive diagnostics platform: an MCP server with vehicle tools for VIN decode, recalls and DTC lookup, and an agentic engine with RAG document Q&A.

TokioAxumgRPCQdrantK3s
Embedded Linux · self-taught

Jetson Orin lab

A custom Yocto image for the Jetson Orin Nano, a boot pinmux change delivered by UEFI capsule update, and an SPI link to an ESP32 checked by an end-of-line style pattern test.

Yocto · kasmeta-tegraUEFI capsulespidev
Android · self-taught

AOSP

Built and flashed Android 14 on Pixel phones, and studied production firmware to compare vendor partitions, init scripts and system properties.

Android 14build propsKeyMint
root@jetson · spi_eolReal run, Jetson SPI1 → ESP32-C3
$ spi_eol -D /dev/spidev0.0 -s 1000000,4000000[eol] precondition: spi0 runtime PM = on[eol] opened /dev/spidev0.0, mode 0, 8 bits[eol]  1000000 Hz  echo of 0x55       : PASS[eol]  1000000 Hz  echo of walking-1  : PASS[eol]  1000000 Hz  echo of random-8   : PASS[eol]  4000000 Hz  echo of 0xAA       : PASS[eol]  4000000 Hz  echo of walking-0  : PASS[eol] bit lanes with errors (bit0..bit7): 0 0 0 0 0 0 0 0[eol] RESULT=PASS frames=34 bad_frames=0 bad_bits=0
Contact

Let's
connect.