Contents Menu Expand Light mode Dark mode Auto light/dark, in light mode Auto light/dark, in dark mode Skip to content
Embedded Linux on i.MX6ULL
Embedded Linux on i.MX6ULL

Front matter

  • Embedded Linux on i.MX6ULL — From First Boot to First Driver
  • PART I — FOUNDATIONS
  • PART II — BARE-METAL i.MX6ULL
  • PART III — U-BOOT, DEEPLY
  • PART IV — THE KERNEL
  • PART V — ROOT FILESYSTEM & USER SPACE
  • PART VI — DRIVER DEVELOPMENT
  • PART VII — DEVICE COOKBOOK
  • PART VIII — DEBUG, PRODUCTION, ADVANCED
  • PART IX — APPLIED VIRTUALIZATION AND MIXED-CRITICALITY SYSTEMS
  • Status

Part I — Foundations

  • Chapter 1: Preface and how to use this book
  • Chapter 2: What “Embedded Linux” actually is
  • Chapter 3: Host environment setup
  • Chapter 4: ARMv7-A and the Cortex-A7, for the MCU engineer
  • Chapter 5: A tour of the i.MX6ULL SoC
  • Chapter 6: The toolchain
  • Chapter 7: The Boot ROM, IVT, DCD, and BootData
  • Chapter 8: Hardware bring-up checklist

Part II — Bare-metal i.MX6ULL

  • Chapter 9: First LED, pure assembly
  • Chapter 10: C + startup.S + linker script
  • Chapter 11: Hand-building a Boot ROM-acceptable image
  • Chapter 12: UART driver and printf
  • Chapter 13: CCM clock tree bring-up
  • Chapter 14: DDR3 initialization with MMDC
  • Chapter 15: Exceptions and the GIC
  • Chapter 16: Timers, EPIT and GPT
  • Chapter 17: MMU and caches
  • Chapter 18: Optional bare-metal peripherals
  • Chapter 18A: Project organization
  • Chapter 18B: Button input and beep
  • Chapter 18C: Bare-metal RTC

Part III — U-Boot, deeply

  • Chapter 19: U-Boot from source, first boot
  • Chapter 20: U-Boot SPL: the missing link
  • Chapter 21: U-Boot internals
  • Chapter 22: Porting U-Boot to a custom board
  • Chapter 22A: Building i.MX6ULL U-Boot from nothing
  • Chapter 23: bootcmd, bootargs, FIT images
  • Chapter 23A: Multi-variant FIT images and DT overlays
  • Chapter 24: Workflows, TFTP, NFS, USB-OTG

Part IV — The Kernel

  • Chapter 25: Building mainline Linux for i.MX6ULL
  • Chapter 26: Booting the kernel from U-Boot
  • Chapter 27: Device Tree: the contract between firmware and kernel
  • Chapter 27A: DT bindings YAML and dt_binding_check
  • Chapter 28: Kernel startup, traced
  • Chapter 29: Initramfs from scratch
  • Chapter 30: Kernel configuration deep-dive
  • Chapter 30A: Kernel lifecycle: mainline, stable, LTS, vendor BSPs

Part V — Root filesystem & user space

  • Chapter 31: A root filesystem, by hand
  • Chapter 32: /proc, /sys, devtmpfs
  • Chapter 33: Init systems
  • Chapter 34: libc, dynamic linking, and the loader
  • Chapter 35: Buildroot, after you can do it by hand
  • Chapter 35A: Ubuntu-base rootfs as a peer to BusyBox/Buildroot
  • Chapter 35B: Read-only rootfs + overlayfs
  • Chapter 35C: Container runtimes on embedded
  • Appendix — Userspace tooling reference

Part VI — Driver development (foundations)

  • Chapter 36: Your first kernel module
  • Chapter 37: A character driver, by hand
  • Chapter 38: Auto-creating /dev/ nodes
  • Chapter 39: Platform drivers + device tree
  • Chapter 40: The misc framework
  • Chapter 41: Concurrency in the kernel
  • Chapter 42: Sleeping, waiting, polling
  • Chapter 43: Interrupts

Part VI — Driver development (common subsystems)

  • Chapter 44: GPIO subsystem + pinctrl
  • Chapter 45: Input subsystem
  • Chapter 46: I²C drivers
  • Chapter 47: SPI drivers
  • Chapter 48: PWM and RTC subsystems
  • Chapter 49: IIO subsystem (ADCs, sensors)
  • Chapter 50: regmap

Part VI — Driver development (advanced + insertions)

  • Chapter 51: DMA
  • Chapter 51A: Watchdog
  • Chapter 51B: Power management
  • Chapter 52: Network driver: FEC + KSZ8081
  • Chapter 52A: PREEMPT_RT
  • Chapter 53: Sound: ALSA and ASoC
  • Chapter 54: LCD framebuffer and DRM/KMS
  • Chapter 54A: MTD / UBI for raw NAND
  • Chapter 54B: V4L2 + GStreamer
  • Chapter 55: USB gadget
  • Chapter 55A: Kernel timers and hrtimers
  • Chapter 55B: Async notification (SIGIO)
  • Chapter 55C: CAN bus (SocketCAN + FlexCAN)
  • Chapter 55D: Block device drivers
  • Chapter 55E: WiFi + wpa_supplicant
  • Chapter 55F: Cellular modems
  • Chapter 55G: Multi-touch (GT911)
  • Chapter 55H: RGB-to-HDMI bridge (sii902x)
  • Chapter 55I: Rust for Linux

Part VII — Device cookbook (Storage)

  • Chapter 64: QSPI NOR flash
  • Chapter 65: I²C / SPI EEPROM
  • Chapter 66: SD card and eMMC deep dive

Part VII — Device cookbook (Environmental sensors)

  • Chapter 67: Temperature / humidity / pressure
  • Chapter 68: Light & color sensors
  • Chapter 69: Air quality, gas, particulate matter

Part VII — Device cookbook (Motion sensors)

  • Chapter 70: I²C IMUs
  • Chapter 71: SPI IMUs

Part VII — Device cookbook (Position & distance)

  • Chapter 72: Distance & proximity sensors
  • Chapter 73: Magnetometer / compass
  • Chapter 74: Hall-effect & rotary position sensors

Part VII — Device cookbook (Power & current)

  • Chapter 75: Current & power monitoring
  • Chapter 76: Battery fuel gauge + charger

Part VII — Device cookbook (Specialty sensors)

  • Chapter 77: 1-Wire sensors
  • Chapter 78: MEMS microphones
  • Chapter 79: Health sensors

Part VII — Device cookbook (ADC / DAC / clocks)

  • Chapter 80: External ADCs
  • Chapter 81: External DACs + clock generators

Part VII — Device cookbook (Displays)

  • Chapter 82: RGB parallel LCD on LCDIF
  • Chapter 83: SPI LCD
  • Chapter 84: QSPI LCD
  • Chapter 85: OLED & e-paper
  • Chapter 86: Touch input ICs

Part VII — Device cookbook (Cameras)

  • Chapter 87: Parallel CSI cameras
  • Chapter 88: USB UVC cameras

Part VII — Device cookbook (Audio)

  • Chapter 89: I²S audio codecs
  • Chapter 90: Digital class-D amplifiers

Part VII — Device cookbook (WiFi)

  • Chapter 91: SDIO WiFi
  • Chapter 92: USB WiFi
  • Chapter 93: Hosted WiFi via ESP32 / ESP8266
  • Chapter 94: WiFi+BT combo modules

Part VII — Device cookbook (Bluetooth)

  • Chapter 95: HCI Bluetooth over UART/USB
  • Chapter 96: AT-command BLE modules
  • Chapter 97: BLE Mesh

Part VII — Device cookbook (Long-range & specialty wireless)

  • Chapter 98: LoRa
  • Chapter 99: Sub-GHz proprietary
  • Chapter 100: ZigBee / Thread / 802.15.4
  • Chapter 101: UWB ranging

Part VII — Device cookbook (Cellular)

  • Chapter 102: USB 4G LTE modems
  • Chapter 103: UART AT-command modems
  • Chapter 104: NB-IoT / Cat-M1

Part VII — Device cookbook (Identification)

  • Chapter 105: RFID / NFC
  • Chapter 106: Fingerprint sensors

Part VII — Device cookbook (Positioning)

  • Chapter 107: GPS / GNSS + PPS

Part VII — Device cookbook (Industrial buses)

  • Chapter 108: RS-485 + Modbus RTU
  • Chapter 109: LIN bus
  • Chapter 110: CAN deep dive

Part VII — Device cookbook (Motors & encoders)

  • Chapter 111: Quadrature encoders & rotary
  • Chapter 112: Stepper & DC motor drivers

Part VII — Device cookbook (Indicators & actuators)

  • Chapter 113: WS2812 / SK6812 / APA102 addressable LEDs
  • Chapter 114: Beepers, relays, SSRs

Part VII — Device cookbook (Network & system power)

  • Chapter 115: Dual FEC + hosted Ethernet
  • Chapter 116: PMICs and regulator framework
  • Chapter 117: External RTC

Part VIII — Debug, production, advanced

  • Chapter 118: JTAG, OpenOCD, GDB at every layer
  • Chapter 119: Kernel debugging without JTAG
  • Chapter 120: User-space debugging
  • Chapter 120A: Mainline patch submission workflow
  • Chapter 121: Capstone: custom board port
  • Chapter 121A: CI/CD for embedded Linux
  • Chapter 122: Build your own cross-toolchain
  • Chapter 122A: BSP → mainline migration playbook
  • Chapter 123: Yocto vs Buildroot, an honest comparison
  • Chapter 123A: Yocto layer development in depth
  • Chapter 124: Secure boot (HAB) and OP-TEE
  • Chapter 125: Field updates
  • Chapter 125A: VSCode + gdbserver remote-debug workflow
  • Chapter 126: Closing: what to read next

Part IX — Applied virtualization

  • Chapter 127: Why embedded products use hypervisors
  • Chapter 128: QEMU as a virtual hardware lab
  • Chapter 129: Build and boot tiny Linux in QEMU
  • Chapter 130: U-Boot in QEMU
  • Chapter 131: HYP mode, stage-2 MMU, and virtual interrupts
  • Chapter 132: Xen in QEMU
  • Chapter 133: First DomU Linux
  • Chapter 134: Xen on i.MX6ULL
  • Chapter 135: DomU Linux on i.MX6ULL
  • Chapter 136: Devices, memory, and DMA boundaries
  • Chapter 137: Jailhouse in QEMU ARM64
  • Chapter 138: Bare-metal or Zephyr inmate cell
  • Chapter 139: STM32MP1 Linux plus RTOS, the production pattern
Back to top
View this page
Edit this page

Chapter 126: Closing: what to read next¶

Lab vs production: Do not burn fuses, enroll production keys, or sign release images while following the lab. Use throwaway keys and back up the unsigned image plus the key directory before testing irreversible security flows.

In 125 chapters you’ve gone from MCU engineer to someone who can bring up a custom i.MX6ULL board with mainline U-Boot, Linux, a hand-built rootfs, drivers, secure boot, CI, and OTA. That’s a lot of ground. This chapter points to what to read and do next. MCU bridge: Think of the rootfs as the firmware image’s file-backed runtime environment. On an MCU you link everything into flash. On Linux, programs and config live in this mounted tree. MCU bridge: Think of U-Boot like a much larger boot stub plus debug monitor: it initializes hardware, loads the next image, and gives you commands before Linux starts. rootfs: root filesystem, the directory tree mounted at / that contains /bin, /etc, /dev, and libraries. U-Boot: the bootloader that initializes enough hardware to load and start the Linux kernel.

126.1 The next-step canon¶

Five books and sites that pick up where this book ends:

1. Linux Device Drivers, 3rd Ed. (LDD3), Corbet, Rubini, Kroah-Hartman¶

The canonical kernel-driver book. Written for kernel 2.6 (so the specific APIs are dated), but the concepts are timeless, char devices, blocks, networking drivers, USB drivers, PCI, sleeping primitives, kernel memory management. The mental model it gives you is correct. Just check current APIs in the kernel source when implementing.

Free online: https://lwn.net/Kernel/LDD3/

2. Bootlin’s “Embedded Linux” training material¶

Bootlin (formerly Free Electrons) is a French embedded-Linux training + consulting company. Their training slides + labs are free, comprehensive, current, and license-permissive. Topics: kernel internals, Yocto, Buildroot, audio, video, real-time, security.

Yocto: a metadata-driven build system for producing custom Linux distributions. Buildroot: a configuration-driven build system that produces a complete root filesystem and related images.

https://bootlin.com/training/

Probably the best free online resource for further study.

3. kernelnewbies.org¶

Wiki + mailing list for new kernel contributors. Hosts:

  • A “first patch” tutorial.

  • Release notes for every kernel version since 2.6, read these to track what’s changing.

  • “KernelHacking” tutorials.

http://kernelnewbies.org

The most welcoming community for first-time kernel contributors. Mailing-list lurkers welcome.

4. LWN.net¶

The professional-grade kernel-development periodical. A paid subscription ($10/month) is worth it if you work with Linux full-time. Coverage:

  • Weekly summaries of LKML threads.

  • Deep dives on new kernel features (eBPF, io_uring, sched_ext).

  • Conference reports (Linux Plumbers, Kernel Summit, Open Source Summit).

  • Subsystem maintainer profiles.

Reading LWN weekly is one of the most reliable ways to absorb kernel-development culture and stay current.

https://lwn.net/

5. Documentation/process/ in the Linux source tree¶

The kernel ships its own onboarding documentation. Read in order:

  • 1.Intro.rst: “the kernel project is huge”

  • 2.Process.rst: “how the release cycle works”

  • 3.Early-stage.rst: “what to do before sending a patch”

  • 4.Coding.rst: “the code style and norms”

  • 5.Posting.rst: “how to send patches (Ch 120A’s bible)”

  • 6.Followthrough.rst: “how to respond to reviews”

  • 7.AdvancedTopics.rst: “everything else”

200 pages total. Every new contributor should read it once.

126.2 Communities and conferences¶

  • Linux Plumbers Conference (annual. ~Sep–Oct), the developer’s conference. Streamed talks free.

  • Embedded Linux Conference (Linux Foundation. Spring + fall), embedded-specific.

  • FOSDEM (Brussels, Feb), free, sprawling, every open-source project under one roof.

  • Open Source Summit (Linux Foundation, multiple cities), broader open-source.

  • DebConf (annual), Debian-specific. Many embedded developers attend.

Local: search for “Linux meetup” or “embedded systems meetup” in your city. Bring questions. The community is welcoming.

126.3 Mailing lists¶

Subscribe (digest mode if volume is too high):

  • linux-kernel@vger.kernel.org: the firehose. ~500 mails/day. Lurk.

  • linux-arm-kernel@lists.infradead.org: ARM-specific. ~50/day. Relevant to you.

  • linux-imx@nxp.com: NXP-imx-specific (moderated). ~5/day. Very relevant.

  • devicetree@vger.kernel.org: DT bindings discussions.

  • stable@vger.kernel.org: stable-kernel patch announcements.

  • kernelnewbies@kernelnewbies.org: beginner Q&A.

Lurk for a month before posting. Read the patches you can understand. Ignore the rest. Slowly your understanding accretes.

126.4 Three further specializations¶

Depending on your interests:

Path A, Kernel hacker¶

Goal: become a subsystem maintainer.

  • Pick a subsystem (e.g., IIO sensors, GPIO, regulators).

MCU bridge: Think of Linux GPIO like the same pin set/reset block you used on STM32, but accessed through a kernel subsystem that owns numbering, direction, interrupts, and user-space exposure. IIO: Industrial I/O, Linux’s subsystem for sensors, ADCs, DACs, and buffered sampled data. GPIO: General-Purpose Input/Output, a pin controlled as a digital input, output, or interrupt source.

  • Read every patch on that subsystem’s mailing list for 6 months.

  • Submit small fixes. Build reputation.

  • Eventually: maintain a driver, then a subsystem.

Path B, Product engineer¶

Goal: ship great embedded products.

  • Master one BSP family deeply (i.MX, STM32MP, TI Sitara, RPi).

BSP: Board Support Package: vendor patches, configs, bootloader files, and scripts needed to boot one board.

  • Build the CI/release/OTA infrastructure (Ch 121A, 125).

  • Develop soft skills: talking to product managers, defending engineering trade-offs.

  • Eventually: tech lead on a product team.

Path C, Embedded security¶

Goal: build trustworthy embedded systems.

  • Deepen on TrustZone + OP-TEE.

  • Study secure boot in depth across multiple SoCs.

  • Learn cryptography (Boneh’s online course is excellent).

  • Eventually: security architect. Review designs across products.

126.5 Skills outside Linux you’ll still need¶

  • C and C++: kernel is C. Many embedded apps are C++.

  • Python: for tooling, build scripts, test automation.

  • Rust: increasingly relevant. Learn it for new kernel contributions and for high-reliability user-space.

  • Git: beyond add/commit/push. Understand rebase, bisect, blame, format-patch, send-email.

  • Make + CMake + Meson: build system fluency saves hours.

  • Networking: TCP/IP at the implementation level, not just usage. RFC 793 / 1122.

  • Shell scripting: bash, awk, sed. Indispensable.

  • Schematic / PCB reading: you may never design boards, but you’ll read thousands.

  • Public speaking and writing: explaining technical decisions to non-engineers is a force multiplier.

126.6 A short list of “if you remember nothing else”¶

  1. The kernel-userspace split is the most important concept in this book. Every confusion ultimately reduces to “I forgot which side that runs on.”

  2. Driver-binding is via DT compatible strings. Add your chip’s compatible to the driver’s table. DT enables it. The kernel binds.

  3. A/B partitioning + rollback is mandatory for OTA. Without it, one bad update bricks your fleet.

  4. printk is the universal Linux debugger. When in doubt, add a printk. Trust dmesg.

  5. Mainline first. Fork only when you must. Vendor BSPs cost more over the product’s life than the engineering to use mainline.

  6. Secure boot, key ceremony, and OTA together, not individually, is what makes a product secure. Each in isolation is theatrical.

  7. The community is your colleague. Lurk lists. Ask after lurking. Help others. Submit patches. Embedded Linux is built by humans. Be a good human.

126.7 Acknowledgements¶

(Reserved for the book author’s final acknowledgements: the people who made the journey possible, the colleagues who reviewed early drafts, the readers who reported errors, the maintainers whose code makes this possible at all.)

126.8 Errata + feedback¶

(Reserved: URL of the book’s errata page. An email or GitHub issues tracker for reader-submitted corrections.)


End of the main i.MX6ULL path.

You started with a question: “How do I become an embedded-Linux engineer when my background is microcontrollers and bare-metal?”

Now you have an answer: “By understanding every layer from the reset vector to the systemd target, having built each by hand once, and knowing where to look up the rest when you need it.”

Most importantly, you now have the vocabulary to read kernel source, the frameworks to think about new problems, the debugging instincts to solve them, and the community connections to learn faster than alone.

Build something. Ship it. Watch a customer use it for years. That is embedded Linux.

Good luck. Send your first patch.

Optional next path: Part IX, Applied virtualization and mixed-criticality systems, starts with QEMU as a lab bench, then moves through Xen, real i.MX6ULL constraints, Jailhouse, and STM32MP1 Linux + RTOS patterns.

Next
Chapter 127: Why embedded products use hypervisors
Previous
Chapter 125A: VSCode + gdbserver remote-debug workflow
Copyright © 2026, DangViTin
Made with Furo
On this page
  • Chapter 126: Closing: what to read next
    • 126.1 The next-step canon
      • 1. Linux Device Drivers, 3rd Ed. (LDD3), Corbet, Rubini, Kroah-Hartman
      • 2. Bootlin’s “Embedded Linux” training material
      • 3. kernelnewbies.org
      • 4. LWN.net
      • 5. Documentation/process/ in the Linux source tree
    • 126.2 Communities and conferences
    • 126.3 Mailing lists
    • 126.4 Three further specializations
      • Path A, Kernel hacker
      • Path B, Product engineer
      • Path C, Embedded security
    • 126.5 Skills outside Linux you’ll still need
    • 126.6 A short list of “if you remember nothing else”
    • 126.7 Acknowledgements
    • 126.8 Errata + feedback