RSSAmplifier

Blog

Pyjama Cafe!

Recent content on Pyjama Cafe!

pyjamacafe.comRSS feed ↗64 posts

Latest posts

ARM TF-A Day 5: BL2 Deep Dive - Image Loading Framework

Hey there, welcome back! In Day 4, BL2 successfully initialized the DRAM and the UART console. The platform is stable. Now, BL2 must execute its primary mission: loading the remaining firmware stages into memory and passing the baton to the Secure Monitor.

ARM TF-A Day 4: BL2 Deep Dive - Platform Initialization

With BL1 having done the heavy lifting of raw architectural setup, we have arrived at BL2 (Trusted Boot Firmware) . BL1 was executing out of ROM; BL2 is executing out of Secure SRAM. The environment is a little less hostile now, but we are still in the dark. It’s time for BL2 to turn on the lights, initialize the broader platform, and prepare the system memory. Let’s see how it’s…

ARM TF-A Day 3: BL1 Deep Dive - Memory Management and Handoff

Hello! To recap in Day 2’s article, we covered the primary CPU core wake up, disable its caches, set up a stack pointer, and finally jump into bl1_main() . Today, we’ll walk you through what BL1 actually does in C, setting up early memory management and handling the crucial task of loading the next stage (BL2) from flash into SRAM.

ARM TF-A Day 2: BL1 Deep Dive - The First Breath

In Day 1, we established that TF-A operates as the gatekeeper of the system, and that the boot process is a chain of trust broken into several stages. Today, I want to show you the very beginning of that chain: BL1, the AP Trusted ROM . When you press the power button on an ARM SoC (or type system_reset in QEMU), the CPU comes out of reset. Where does it go? What’s the very first instruction…

ARM TF-A Day 1: Introduction to Trusted Firmware-A and The Execution Architecture

Hey there! Welcome to a brand new deep-dive series. If you followed my previous arm64* exception levels and bare-metal series, you know I love getting into the weeds of how things actually work at the silicon level. In this series, we are going to tackle ARM Trusted Firmware-A (TF-A) . We will take the official TF-A source code, dissect its assembly, trace its memory mappings, and watch it boot…

3 Must Have Skills to Ace Lower Level Software Engineering!

The three key skills you need to start your career as an embedded software engineer. Spoiler alert! It’s C-Language , 32-bit CPUs , and a good understanding of the compiler toolchain !

Function Pointers - Everything you need to know!

In this post, we explore what a function pointer is, what it really means for the machine, how to define it, and how to use it.

But, What is a System Call?

This note explains what a system call is, what you should imagine when trying to understand it and how you can design one.

C++ for Middleware Engineers

What Makes “OOPS Under the Hood” Special “OOPS Under the Hood” is not a traditional C++ course that focuses only on syntax, libraries, or design patterns. Instead, it teaches how C++ actually works beneath the surface—inside the compiler, linker, memory system, and runtime environment. This deep technical focus is what makes the course truly unique. Most developers learn how to write C++ code, but…

Soan Papdi FPGA - Setup Guide

A Quick Guide to getting up and running with the Soan Papdi FPGA board. A quick guide to getting up and running with the Soan Papsi FPGA board.

Pointers (in C)

The Design and Deliberation I am a big believer of mental models and visualisations when it comes to learning technical concepts. This course is deliberately heavy on insight and frameworks of thinking about pointers. Pointers in C is a straight forward concept but it has earned a reputation for being hard to understand. In my opinion, the problem is - most of those who try and learn pointers…

Building an Audio Visualizer in C using Fast Fourier Transform(FFT) and XCB

I made this project to understand how audio data can be analyzed and displayed visually. The idea was to take a WAV file, process its samples using Fast Fourier Transform (FFT), and show the frequency spectrum in a window using XCB (X11 protocol), all in C.

Automotive - Middleware 101

What is so special about this course? What makes this course special is its end-to-end, system-level view of embedded middleware, going beyond definitions and APIs. Instead of treating middleware as a black box, the course explains why it exists, where it fits, and how it is designed—from drivers to applications. It connects theory with real automotive use cases, including a practical SOME/IP case…

Automotive Electronics

What is so special about this course? The Automotive Electronics course is first of its kind because it provides a complete system-level understanding of how modern vehicles work — not just isolated topics. It starts with E/E architecture, the backbone of every vehicle, and builds upward through sensors, actuators, diagnostics, control strategies, and software stacks. Unlike traditional courses,…

FreeRTOS - Teardown and Porting

What is so special about this course? There are several courses online that dive into how to use FreeRTOS. This one take a different approach and dives into the internals of FreeRTOS and how to port it from scratch on a new micro-controller. Learning it this way will ensure that you understand the internals of this RTOS and reason better when using it.

How to Embedded Systems?

Embedded systems are specialized electronic setups designed to handle specific tasks by sensing environmental conditions, processing the data, and affecting the surroundings through actuators. These systems are integrated into larger devices to control particular functions.

Build and Run Linux Kernel

Course Highlights Hands-On Approach : Follow along with practical, real-time demonstrations of each step, from source code to a running system. ARM64 Focus : Target the ARM64 architecture, widely used in modern devices like servers, mobile devices, and embedded systems. Minimalist Userspace with BusyBox : Learn to create a compact and efficient userspace to complement your kernel. QEMU…

Debugging an Embedded System - Day 1 - Introducing different Tools

Let’s now actually understand the need and usage of GDB, OpenOCD, JTAG, SWD, etc. Let’s go over some of the use-cases to see how all of them come together and form a coherent debugging environment for a typical embedded system.

Debugging an Embedded System - Day 0 - Understanding What is Debugging

GDB, OpenOCD, JTAG, SWD etc are terms often thrown around when it comes to debugging in an embedded environment. They are naught but just tools made available to us. We will actually understand the core principles and ideas behind debugging such that the usage of such tools would become evident and obvious.

ARMv8a Procedure Call standard and GPRs

ABI and Procedure call standard are backbone to safe-guard compatibility and inter-operability. Let’s see how and why.

ARMv-8a IRQ handling

Interrupt handling is a very critical part of any architecture. For ARM64, they are looked at from a certain lense. Let’s see how.

ARMv-8a EL0<->EL1 Switching

Syscalls and switching between different exception levels is a very intricate topic filled with minute details which are often overlooked. Let&rsquo;s dive into details.

From Design to Tapeout (Physical Design) - Beginner's guide

If you’ve ever wondered how the tiny chips powering your smartphone or laptop come to life, you’re in for a treat.

ARMv-8a Exception Levels

ARM-A is the most prevalent architecture out there powering billions of devices. We will be covering these topics over the course of multiple articles in this series.

System on Chip (SoC) and Bare-Metal Programming

A System on Chip (SoC) is an integrated circuit that combines multiple components of a computer or electronic system into a single chip.

Power Management IC (PMIC)

Nordic nPM1300 PMIC Evaluation Board! A Power Management Integrated Circuit (PMIC) is a critical component in modern electronic devices, designed to manage power requirements efficiently. It takes input from a DC power supply or a battery, delivers regulated power to various system components, and often includes functionality to charge an onboard battery.

Bootloaders on Cortex-M CPUs

Bootloaders are the unsung heroes of ARM Cortex-M-based systems, ensuring reliable startup, application execution, and firmware updates. By leveraging the Cortex-M’s vector table, VTOR, and low-power features, developers can create efficient and secure bootloaders tailored to their application’s needs.

The Embedded Systems Library

Important: Planned courses are not yet ready for learners and will be added as the current recording concludes. Email from one of the learners ♥️ One of the subscribers wrote to us, this... The Philosophy behind the courses? We have been creating content for the Embedded Software Engineering community for over a year now. If you have been following us, you would know that we have launched courses…

The Firmware Essentials!

How to learn Firmware Development Every embedded system has a CPU with firmware running on it. Being able to master Firmware engineering comes down to mastering the following - High level view of the courses in this pack! 1. C Language C is the workhorse when it comes to firmware. While there are languages like Rust and C++ that can be used, C is still the dominant language. Primarily because of…

Roadmap to Learning Linux Device Drivers

Most Linux device driver engineers cannot reason about how the Linux kernel boots or how a device driver is loaded. This post details how you should learn to write device drivers by being able to reason down to the hardware level.

OpenWRT vs. RDK vs. prplOS

What does a humble device like a router do? To most, a router is used till it breaks like many other devices in the house. The router plays such an important role by making sure your netflix works smoothly. However, a solo glance at its shell will reveal a battle raged for OpenWRT, RDK, and prplOS.

Anatomy of Assembly Program

I am going to explain the anatomy of assembly code using RISC-V as an example since it&rsquo;s a clean, modern instruction set architecture (ISA) that&rsquo;s easy to understand. Assembly code is a low-level programming language that directly corresponds to machine instructions executed by a processor.

Git, Gerrit! and the Industry

Git and Gerrit are pivotal tools in the software development industry, each serving distinct yet complementary roles that enhance collaboration, code quality, and workflow efficiency.

Hand coding Audio files in C

Pulse-Code Modulation (PCM) is a method used to digitally represent analog signals, particularly audio. It works by sampling the amplitude of an analog signal at regular intervals and then quantizing those samples into a series of discrete numerical values. These values are stored or transmitted as binary data, making PCM a foundational technique for digital audio in computers, CDs, DVDs, and…

A shallow dive into do{..}while(0) loop in C

In this article, I want to talk about the do{..}while(0) construct in C. This construct is often used in C programming to define multi-statement macros. It is a common pattern used in the Linux kernel and other standard C projects. I will take an example of a macro that is not safe and show how do{..}while(0) construct can be used to make it safe. Especially in the conditional statements.

Scopes of Identifiers in C

various types of scopes. In the C programming language, the scope of an identifier determines where it can be accessed or referenced within a program. Understanding the different scopes in C is crucial for managing variable and function names effectively without causing conflicts.

Optimizing Timer Management in Embedded Systems with Delta Lists

Delta Timer List Efficient timer management is a crucial aspect of embedded systems, especially in applications requiring low-power operation, RTOS scheduling, or precise event timing. One of the most efficient ways to manage multiple software timers is the delta list approach, which significantly reduces CPU overhead and optimizes wake-up schedules.

Storage Classes in the C Language

Storage Classes in C Language In the C programming language, a storage class defines the scope (visibility) and life-time of variables and/or functions within a program. There are four fundamental storage classes that can be used to define these properties: auto , register , static , and extern .

Tokens in C Language

Tokens In the C programming language, tokens are the smallest individual units of a program that the compiler recognizes and processes during lexical analysis, the first phase of compilation. The C compiler breaks down the source code into tokens before proceeding to syntax analysis and further stages. Tokens are the building blocks of a program, and understanding them is fundamental to grasping…

Cancellation and Refund

Refund Policy Thank you for purchasing one of our online courses! We strive to deliver high-quality content and ensure your satisfaction. Please read our refund policy carefully before making a purchase, as it outlines the conditions under which refunds may be granted. 1. General Refund Eligibility Refunds are only available under specific circumstances. To be eligible, you must submit a refund…

Contact Us

You may contact us at support@pyjamacafe.com

Pricing Policy

At Typobrahe Education LLP (pyjamacafe.com), we strive to deliver high-quality online courses on Embedded Systems that provide exceptional value to our learners. To ensure we can continue to meet your needs and adapt to changing circumstances, our pricing policy is designed with flexibility in mind. Here’s what you need to know: Dynamic Pricing : We reserve the right to adjust course prices at any…

Privacy Policy

This privacy policy sets out how Pyjama Cafe (formally Pyjama Brah) uses and protects any information that you give Pyjama Cafe (formally Pyjama Brah) when you visit their website and/or agree to purchase from them. Pyjama Cafe (formally Pyjama Brah) is committed to ensuring that your privacy is protected. Should we ask you to provide certain information by which you can be identified when using…

Shipping and Delivery

Shipping is not applicable for business.

Terms and Conditions

For the purpose of these Terms and Conditions, The term &ldquo;we&rdquo;, &ldquo;us&rdquo;, &ldquo;our&rdquo; used anywhere on this page shall mean Typobrahe Education LLP , whose registered/operational office is F002, Keerthi Harmony Bengaluru KARNATAKA 560016 . &ldquo;you&rdquo;, “your”, &ldquo;user&rdquo;, “visitor” shall mean any natural or legal person who is visiting our website and/or…

Abstractions - From Nature to AI

Various Abstractions The layers of abstraction all the way down to Nature that lead us to the world of Electronics, Solid State machines and AI. This article explores the contracts that got us to where we are.Let us start by asking the question -

Data Structures

The Design and Deliberation As the embedded software gets more nuanced, the answer to performance and reliability usually becomes clever organization of the data and algorithms that leverage that organization. This course is designed with a focus on development in the C language. Special attention is paid to explaining the concepts of C and ways of thinking/reasoning intuitively.

Scheduler Design on ARM Cortex-M

What is so special about this course? Every complex embedded systems solution uses an OS/RTOS for implementing the state machine. An OS at its core implements a task scheduler (among other things). Not everyone understands how it works. The design of this course is deliberate in the sense that - in an attempt to implementing the &ldquo;Scheduler&rdquo; you will learn the CPU operations, how…

The C Language

The Design and Deliberation The internet is flooded with coding courses—yet none rival this. For over a decade, C has been my daily driver at work. Unlike kernel developers leaning on abstractions, I’ve wielded C in its purest, most raw form—programming CPUs from scratch, without the crutch of standard libraries. This course hands you that same unfiltered power. By the end, you won’t just know…

Writing a RISC-V CPU!

Harris & Harris Few days back I decided to implement a RISC-V rv32i CPU and deploy it on an FPGA. Here are some initial thoughts on how I will go about doing this (and potentially you can follow).