## Yocto Project — dedicated course

For a full **vendor-neutral** Yocto curriculum (mental model, modules 0–11, labs, capstones, glossary), use:

**[Yocto / Guide.md](Yocto/Guide.md)**

The outline below remains a roadmap checklist; the Yocto folder is the structured “course” version.

---

## Worked Linux code-reading course

For a concrete **Embedded Linux** case study built around a real Jetson host driver, use:

**[Jetson ESP-Hosted Host Code / Guide.md](Jetson%20ESP-Hosted%20Host%20Code/Guide.md)**

This is a structured mini-course, parallel to the Yocto material, with five detailed lectures covering:

- how Linux sees the host stack
- the Jetson build/load path and board policy
- SPI, GPIO, and IRQ-driven bring-up
- `cfg80211` Wi-Fi integration into `wlan0`
- HCI/BLE integration into `hci0`

Use it when you want a real Linux host-driver reading exercise rather than another generic Embedded Linux checklist.

---

**Phase 1: Embedded Linux Development (12-24 months)**

**1. Yocto Project (Beyond the Basics)**

* **Yocto Architecture and Internals:**
    * **BitBake and OpenEmbedded:**  Dive deep into BitBake, the build engine behind Yocto, and OpenEmbedded, the core build framework. Understand how they work together to create your custom Linux distributions.
    * **Recipes, Layers, and Metadata:**  Master the concepts of recipes (build instructions for individual packages), layers (collections of recipes), and metadata (configuration and dependency information). Learn how to create and modify them to customize your builds.
    * **Yocto Build Process:**  Gain a thorough understanding of the Yocto build process, from fetching source code to generating the final images. Learn how to analyze build logs, troubleshoot errors, and optimize build times.

* **Advanced Yocto Customization:**
    * **Custom BSP (Board Support Package) Development:**  Go beyond using existing BSPs. Learn how to create and maintain your own BSPs for custom hardware platforms, including writing device drivers, configuring bootloaders, and integrating kernel modifications.
    * **Kernel Configuration with `menuconfig`:**  Master the `menuconfig` interface for configuring the Linux kernel, enabling and disabling features, and tailoring it to your specific hardware and application requirements.
    * **Root File System Customization:**  Explore advanced techniques for customizing the root file system, including adding and removing packages, configuring system services (systemd), and optimizing for size and performance.

* **Yocto for Advanced Applications:**
    * **Real-Time Systems with Yocto:**  Learn how to build real-time Linux systems using Yocto, incorporating real-time patches (PREEMPT_RT) and configuring the kernel for real-time performance.
    * **Security Hardening with Yocto:**  Explore security features in Yocto, such as secure boot, image signing, and access control, to build secure embedded Linux distributions.
    * **Yocto for Multi-Platform Development:**  Learn how to use Yocto to create images for different processor architectures (e.g., ARM, x86) and hardware platforms, enabling you to develop portable and adaptable embedded systems.

**2. PetaLinux (Mastering Xilinx-Specific Tools)**

* **PetaLinux Workflow and Integration:**
    * **PetaLinux Project Creation and Configuration:**  Master the PetaLinux workflow, from creating new projects to configuring the hardware platform, kernel, and root file system.
    * **Integrating Custom Hardware with PetaLinux:**  Learn how to integrate your custom FPGA designs and peripherals with PetaLinux, including creating device tree descriptions and writing device drivers.
    * **PetaLinux and Yocto:**  Understand the relationship between PetaLinux and Yocto, and how you can leverage Yocto's features and customization options within the PetaLinux environment.

* **Advanced PetaLinux Customization:**
    * **Kernel and Device Tree Customization (Advanced):**  Dive deeper into kernel and device tree customization within PetaLinux, including using the Device Tree Generator (DTG) and customizing device tree source files.
    * **Root File System Customization (Advanced):**  Explore advanced techniques for customizing the root file system in PetaLinux, including adding custom packages, configuring system services, and optimizing for size and performance.
    * **Debugging and Troubleshooting PetaLinux Projects:**  Learn how to debug and troubleshoot issues that may arise during the PetaLinux build process or when running your embedded Linux system.

* **PetaLinux for Advanced Applications:**
    * **PetaLinux for Zynq UltraScale+ MPSoC:**  Master the use of PetaLinux for developing embedded Linux systems on the Zynq UltraScale+ MPSoC, leveraging its heterogeneous processing capabilities and advanced features.
    * **PetaLinux for Industrial and Automotive Applications:**  Explore the application of PetaLinux in industrial and automotive systems, where real-time performance, reliability, and safety are critical.

**3. Kernel Configuration (Fine-Tuning the Heart of Linux)**

* **Kernel Configuration (Deep Dive):**
    * **Kernel Build System (kbuild):**  Understand the Linux kernel build system (kbuild) and how it compiles and links the kernel source code.
    * **Kernel Configuration Options:**  Explore the vast array of kernel configuration options, understanding their impact on kernel size, functionality, and performance.
    * **Kernel Modules:**  Learn how to build and load kernel modules to dynamically extend the functionality of the Linux kernel.

* **Kernel Customization for Embedded Systems:**
    * **Reducing Kernel Size:**  Master techniques for reducing the size of the Linux kernel, such as removing unnecessary drivers and features, and using kernel compression.
    * **Optimizing Kernel Performance:**  Explore kernel configuration options and techniques to optimize kernel performance, including tuning scheduling parameters, managing memory efficiently, and enabling real-time features.
    * **Security Hardening the Kernel:**  Learn how to configure the kernel with security features, such as access control lists (ACLs), secure boot, and kernel address space layout randomization (KASLR).

**4. Root File System Creation (Building the Foundation)**

* **Root File System Essentials:**
    * **File System Hierarchy:**  Understand the Linux file system hierarchy (e.g., `/`, `/bin`, `/etc`, `/dev`) and the purpose of different directories.
    * **Essential Files and Directories:**  Learn about essential files and directories in the root file system, such as the `/etc/passwd` file for user accounts, the `/etc/group` file for groups, and the `/etc/fstab` file for mounting file systems.
    * **Init System and Systemd:**  Explore the role of the init system (systemd) in starting and managing system services and processes.

* **Building a Minimal Root File System:**
    * **Busybox:**  Learn how to use Busybox, a lightweight set of essential Linux utilities, to create a minimal root file system.
    * **Root File System Tools:**  Explore tools like `genimage` and `mkfs` for creating and formatting different file system types (e.g., ext4, squashfs).
    * **Customizing the Root File System:**  Learn how to customize the root file system by adding necessary libraries, utilities, and configuration files for your embedded application.

**Resources:**

* **"Embedded Linux Development with Yocto Project" by Rudolf Streif:**  A comprehensive guide to the Yocto Project, covering its features, workflows, and customization options.
* **"Linux Kernel Development" by Robert Love:**  A detailed book on Linux kernel internals and development, including kernel configuration and driver development.
* **"Building Embedded Linux Systems" by Karim Yaghmour:**  A practical guide to building embedded Linux systems, covering various aspects from bootloader to root file system.

**Projects:**

* **Create a Custom Linux Distribution with Yocto:**  Build a customized Linux distribution for your Zynq board with a specific set of packages, kernel configurations, and a tailored root file system.
* **Port an Existing Linux Application to Your Embedded Platform:**  Port a Linux application (e.g., a web server, a media player) to your embedded platform, adapting it to the specific hardware and software environment.
* **Build a Secure Embedded Linux System:**  Implement security features like user authentication, access control, and encryption in your embedded Linux system to protect it from unauthorized access and data breaches.

You're right, let's dive even deeper into the world of Embedded Linux Development! We'll explore more specialized areas, advanced techniques, and industry best practices to make you a true expert in this field.

**Phase 2 (Significantly Expanded): Embedded Linux Development (18-36 months)**

**1. Building Embedded Linux Systems (Advanced)**

* **Yocto Project (Mastering the Art):**
    * **Custom BSP (Board Support Package) Development:**  Go beyond using existing BSPs. Learn how to create and maintain your own BSPs for custom hardware platforms, including writing device drivers, configuring bootloaders, and integrating kernel modifications. This involves understanding hardware specifications, writing low-level code, and collaborating with hardware engineers.
    * **Advanced Yocto Configuration:**  Dive deeper into Yocto configuration files (e.g., `local.conf`, `bblayers.conf`) to fine-tune the build process, manage dependencies, and optimize for specific hardware and software requirements. This includes mastering BitBake syntax, understanding variable inheritance, and utilizing advanced configuration options.
    * **Yocto Security Best Practices:**  Explore security considerations in Yocto builds, including secure boot, code signing, and vulnerability management. Learn how to integrate security features into your embedded Linux distributions. This involves understanding security threats, implementing security policies, and using tools for vulnerability analysis and mitigation.
    * **Multi-Platform Support with Yocto:**  Learn how to use Yocto to build images for different processor architectures (e.g., ARM, x86) and hardware platforms, enabling you to create portable and adaptable embedded systems. This involves understanding cross-compilation, managing architecture-specific configurations, and testing on diverse hardware.

* **Buildroot (Beyond the Basics):**
    * **Buildroot Customization:**  Master the art of customizing Buildroot configurations to tailor the Linux distribution to your exact needs. Learn how to add and remove packages, configure kernel options, and integrate custom software components. This involves understanding the Buildroot infrastructure, managing package dependencies, and writing custom build scripts.
    * **Buildroot Package Management:**  Explore advanced package management techniques in Buildroot, including creating custom packages, managing dependencies, and resolving conflicts. This involves understanding package metadata, using package management tools, and resolving build issues.
    * **Buildroot for Specific Applications:**  Learn how to use Buildroot for specific application domains, such as industrial automation, automotive, and networking, by selecting and configuring relevant packages and features. This involves understanding industry-specific requirements, integrating domain-specific software, and optimizing for performance and security.

* **OpenEmbedded:**
    * **OpenEmbedded Fundamentals:**  Get familiar with OpenEmbedded, another powerful build system for embedded Linux. Understand its core components (recipes, layers, metadata) and build process. This involves learning the OpenEmbedded build environment, understanding its configuration files, and building basic images.
    * **OpenEmbedded Customization:**  Learn how to customize OpenEmbedded builds to create tailored Linux distributions for your target hardware. This involves modifying recipes, adding layers, and configuring build options.
    * **OpenEmbedded and BitBake:**  Dive deeper into the relationship between OpenEmbedded and BitBake, understanding how BitBake is used to parse recipes and execute the build process.

**2.  Kernel and Driver Development (Mastering the Kernel)**

* **Kernel Internals (Deep Dive):**
    * **Memory Management:**  Explore the intricacies of Linux memory management, including virtual memory, paging, memory allocation, and the slab allocator. Understand how the kernel manages physical and virtual memory, handles page faults, and allocates memory to processes.
    * **Process Scheduling:**  Dive deeper into the Linux process scheduler, understanding different scheduling algorithms, process priorities, and real-time scheduling. Learn how the scheduler determines which process to run next, manages process states, and handles context switching.
    * **File Systems:**  Learn about different file systems supported by Linux (e.g., ext4, squashfs, JFFS2) and their characteristics. Explore how to choose the appropriate file system for your embedded application, considering factors like read/write performance, wear leveling, and power consumption.
    * **Networking Stack:**  Understand the Linux networking stack, including TCP/IP protocols, network interfaces, and socket programming. Learn how network packets are processed, how network interfaces are managed, and how to develop network applications using sockets.

* **Advanced Driver Development:**
    * **Interrupt Handling (Advanced):**  Master advanced interrupt handling techniques, including interrupt sharing, threaded interrupts, and interrupt latency optimization. Understand how to handle interrupts from multiple devices, prioritize interrupts, and minimize interrupt latency for real-time performance.
    * **DMA (Advanced):**  Explore advanced DMA techniques, such as scatter-gather DMA and DMA engine management. Learn how to efficiently transfer data between devices and memory using DMA, minimizing CPU overhead and improving system performance.
    * **Device Tree Bindings:**  Learn how to write device tree bindings to describe your custom hardware to the Linux kernel. This involves understanding the device tree syntax, defining device properties, and integrating your device tree with the kernel build system.
    * **Kernel Debugging (Advanced):**  Master advanced kernel debugging techniques, including using kernel debuggers (kgdb), tracing tools (ftrace), and analyzing kernel crash dumps. Learn how to identify and fix kernel bugs, analyze kernel behavior, and troubleshoot system crashes.

**3.  System Integration and Optimization (Beyond the Basics)**

* **Boot Process and U-Boot (Advanced):**
    * **U-Boot Customization (Advanced):**  Dive deeper into U-Boot customization, including adding support for new hardware, modifying boot scripts, and implementing custom commands. This involves understanding the U-Boot architecture, writing custom U-Boot drivers, and configuring the boot process for your specific needs.
    * **Secure Boot with U-Boot:**  Learn how to implement secure boot using U-Boot, ensuring that only trusted code is executed during the boot process. This involves understanding secure boot concepts, configuring U-Boot for secure boot, and integrating with secure hardware features.
    * **Network Booting with U-Boot:**  Explore network booting capabilities in U-Boot, enabling you to boot your embedded system over the network. This involves configuring U-Boot for network booting, setting up a TFTP server, and transferring kernel and root file system images over the network.

* **Root File System Management (Advanced):**
    * **Initramfs:**  Understand the initramfs (initial RAM file system) and how it is used during the Linux boot process. Learn how to create and customize initramfs images. This involves understanding the initramfs structure, populating it with necessary files and drivers, and integrating it with the boot process.
    * **Systemd (Advanced):**  Explore advanced Systemd features, such as unit files, service dependencies, and resource management. Learn how to write custom systemd unit files, manage service dependencies, and control resource allocation for different services.
    * **Root File System Security:**  Implement security measures in the root file system, such as access control lists (ACLs), mandatory access control (MAC), and encryption. This involves understanding different security models, configuring access control policies, and encrypting sensitive data.

* **Performance Analysis and Optimization (Advanced):**
    * **Performance Profiling and Tracing:**  Use advanced profiling tools (e.g., perf, ftrace) to analyze system performance, identify bottlenecks, and optimize critical code paths. This involves understanding performance metrics, collecting performance data, and analyzing it to identify areas for improvement.
    * **Real-Time Optimization:**  Explore techniques for optimizing embedded Linux systems for real-time performance, including using real-time kernels (e.g., PREEMPT_RT) and configuring process priorities. This involves understanding real-time concepts, configuring the kernel for real-time scheduling, and prioritizing real-time tasks.
    * **Power Management:**  Learn about power management techniques in embedded Linux, such as CPU frequency scaling, device power management, and suspend/resume functionality. This involves understanding power management states, configuring power management policies, and optimizing for low power consumption.
