<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Nguyen Minh Tien on Embedded Linux Blog</title><link>https://embeddedlinux.blog/en/authors/tien/</link><description>Recent content in Nguyen Minh Tien on Embedded Linux Blog</description><generator>Hugo</generator><language>en</language><atom:link href="https://embeddedlinux.blog/en/authors/tien/index.xml" rel="self" type="application/rss+xml"/><item><title>[Yocto-Lichee] 2. Getting started: flashing an image to the SD card for the Lichee Pi Nano</title><link>https://embeddedlinux.blog/en/2026/09/05/yocto-lichee-2-lam-quen-voi-board-lichee-pi-nano/</link><pubDate>Sat, 05 Sep 2026 21:25:15 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/09/05/yocto-lichee-2-lam-quen-voi-board-lichee-pi-nano/</guid><description>&lt;p&gt;In this post I show you how to get familiar with the board and test it when you first receive a LicheePi Nano and want to check whether it is alive :vv.&lt;/p&gt;&#10;&lt;p&gt;It is a bit backwards that the getting-started post is only the third post in the Yocto-Lichee series :vv. Recently I realised Yocto is quite complicated for beginners, so after the basic posts I will probably move to Buildroot to build the image first :vv.&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 20. Building Yocto 6.0 Wrynose for the Beaglebone Black</title><link>https://embeddedlinux.blog/en/2026/06/20/yocto-bbb-20-build-yocto-6-0-wrynose-cho-board-beaglebone-black/</link><pubDate>Sat, 20 Jun 2026 06:09:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/06/20/yocto-bbb-20-build-yocto-6-0-wrynose-cho-board-beaglebone-black/</guid><description>&lt;p&gt;It has been a full year since I posted my first article about building Yocto for the Beaglebone Black. At first I used Kirkstone, then updated to Scarthgap and thought that would last quite a while :vv, but Wrynose brings fairly big structural changes. So I am writing this extra post on how to build with the new version; I think from 6.0 onwards the structure will stay the same.&lt;/p&gt;</description></item><item><title>[Device-Driver-Lichee] 3. Gpioget, controlling an LED with a button</title><link>https://embeddedlinux.blog/en/2026/06/13/device-driver-lichee-3-gpioget-dung-nut-bam-dieu-khien-led/</link><pubDate>Sat, 13 Jun 2026 06:23:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/06/13/device-driver-lichee-3-gpioget-dung-nut-bam-dieu-khien-led/</guid><description>&lt;p&gt;I said we would use a button, but I turned my pile of electronics upside down and found no through-hole buttons, only SMD ones. So in this post I use a potentiometer playing the role of a button :vv&lt;/p&gt;&#10;&lt;h2 id="1-connecting-the-led-and-the-potentiometer"&gt;1. Connecting the LED and the potentiometer&lt;/h2&gt;&#10;&lt;p&gt;&lt;figure class="md-img"&gt;&lt;img src="https://embeddedlinux.blog/uploads/2026/06/4acccfc095f414aa4de5.jpg" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;</description></item><item><title>[Device-Driver-Lichee] 2. Blink an LED with gpioset, create an LED node in the Device Tree</title><link>https://embeddedlinux.blog/en/2026/06/06/device-driver-lichee-2-blink-led-bang-gpioset-tao-led-node-device-tree/</link><pubDate>Sat, 06 Jun 2026 06:46:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/06/06/device-driver-lichee-2-blink-led-bang-gpioset-tao-led-node-device-tree/</guid><description>&lt;p&gt;Okay, after part 1 we have a board that boots to a terminal to tinker with; now for the Hello world of the embedded world. Let's try blinking an LED&lt;/p&gt;&#10;&lt;h2 id="1-licheepi-nano-pinout"&gt;1. LicheePi Nano pinout&lt;/h2&gt;&#10;&lt;p&gt;Search online for sipeed licheepi nano and you will find plenty; this is the pinout from Sipeed&lt;/p&gt;</description></item><item><title>[Device-Driver-Lichee] 1. Build the image and flash it to the board</title><link>https://embeddedlinux.blog/en/2026/05/30/device-driver-lichee-0-build-image-va-flash-toi-board/</link><pubDate>Sat, 30 May 2026 06:03:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/05/30/device-driver-lichee-0-build-image-va-flash-toi-board/</guid><description>&lt;p&gt;Instead of using yocto, which I think is actually quite complicated for beginners, I simplify things by building u-boot and the kernel separately and taking a ready-made root file system to flash to the board. Then we start the Device Driver series without needing to care what yocto is :vv&lt;/p&gt;</description></item><item><title>[Yocto-Lichee] 1. Building Yocto Scarthgap for the Lichee Pi Nano</title><link>https://embeddedlinux.blog/en/2026/05/24/yocto-lichee-1-build-yocto-scarthgap-cho-board-lichee-pi-nano/</link><pubDate>Sun, 24 May 2026 18:26:27 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/05/24/yocto-lichee-1-build-yocto-scarthgap-cho-board-lichee-pi-nano/</guid><description>&lt;p&gt;In fact I have already finished porting and updated the meta-layer, so the work here is quite easy; I leave a note at the end of the post on what I had to change to port from Yocto 3.0 Zeus to Yocto 5.0 Scarthgap&lt;/p&gt;</description></item><item><title>[Yocto-Lichee] 0. Building Yocto Zeus for the Lichee Pi Nano</title><link>https://embeddedlinux.blog/en/2026/05/16/yocto-lichee-0-build-yocto-zeus-cho-board-lichee-pi-nano/</link><pubDate>Sat, 16 May 2026 06:02:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/05/16/yocto-lichee-0-build-yocto-zeus-cho-board-lichee-pi-nano/</guid><description>&lt;p&gt;I have decided to use the Lichee Pi Nano as the cheap board for the upcoming Device Driver series. I found a &lt;a href="https://fanning.vn/study_yocto/build_nano_yocto_licheepi_nano.html" target="_blank" rel="noopener"&gt;guide from fanning (ninhnn2)&lt;/a&gt;&#10; showing how to build for this board with Yocto Zeus (3.0), from 6 years ago. Many thanks to him for creating the BSP meta layer for it; the hardest part is already done !!&lt;/p&gt;</description></item><item><title>[Linux] The cheapest embedded board that can run Linux</title><link>https://embeddedlinux.blog/en/2026/05/09/linux-board-nhung-re-nhat-co-the-chay-linux/</link><pubDate>Sat, 09 May 2026 06:15:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/05/09/linux-board-nhung-re-nhat-co-the-chay-linux/</guid><description>&lt;p&gt;With prices climbing, a Beaglebone Black now costs around 2 million VND. I decided to look for the cheapest board that can run Linux. After about 2 weeks I settled on the board I will make a series about soon. Because I think a cheap board lets the most people get their hands on it and tinker :vv. Read to the end to find out which board I chose&lt;/p&gt;</description></item><item><title>[Kernel-QEMU] 1. KGDB debugging from start_kernel with a VS Code interface</title><link>https://embeddedlinux.blog/en/2026/05/02/kernel-qemu-1-kgdb-debug-tu-start_kernel-voi-giao-dien-tren-vs-code/</link><pubDate>Sat, 02 May 2026 06:27:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/05/02/kernel-qemu-1-kgdb-debug-tu-start_kernel-voi-giao-dien-tren-vs-code/</guid><description>&lt;p&gt;As I said in the Kernel-BBB 2 post, without JTAG on the BBB we probably cannot debug the kernel from the very first line. So I am turning to QEMU to have full control over the code.&lt;/p&gt;&#10;&lt;p&gt;Oh, in this post I clone the sources and build the related components, no Yocto this time (If yocto is my strength, what am i without Yocto :vv Haha)&lt;/p&gt;</description></item><item><title>[Kernel-BBB] 2. kgdbwait and the gdb server</title><link>https://embeddedlinux.blog/en/2026/04/25/kernel-bbb-2-kgdbwait-va-gdb-server/</link><pubDate>Sat, 25 Apr 2026 06:09:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/04/25/kernel-bbb-2-kgdbwait-va-gdb-server/</guid><description>&lt;p&gt;In this post I use kgdbwait so we can debug the kernel earlier (not as early as through JTAG) and also set up the gdb server so we can use the VS Code extensions :vv&lt;/p&gt;&#10;&lt;h2 id="1-configuring-the-kernel-command-line"&gt;1. Configuring the kernel command line&lt;/h2&gt;&#10;&lt;h3 id="11-finding-the-way"&gt;1.1 Finding the way&lt;/h3&gt;&#10;&lt;p&gt;In the previous post I tried to change the boot command through u-boot, but in reality&lt;/p&gt;</description></item><item><title>[Kernel-BBB] 1. KGDB over UART</title><link>https://embeddedlinux.blog/en/2026/04/18/kernel-bbb-1-kgdb-qua-uart/</link><pubDate>Sat, 18 Apr 2026 06:56:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/04/18/kernel-bbb-1-kgdb-qua-uart/</guid><description>&lt;p&gt;Keeping the configuration from &lt;a href="https://embeddedlinux.blog/en/2025/06/28/yocto-bbb-1-build-beaglebone-black-image-bang-yocto-project/"&gt;Yocto-BBB 1&lt;/a&gt;&#10;, I add a new meta-layer just for this kernel work&lt;/p&gt;&#10;&lt;h2 id="1-create-a-new-meta-layer"&gt;1. Create a new meta layer&lt;/h2&gt;&#10;&lt;h3 id="11-create-the-meta-layer-and-add-it-to-bblayers"&gt;1.1 Create the meta layer and add it to bblayers&lt;/h3&gt;&#10;&lt;div class="code-block is-term" translate="no" data-lang="bash" data-pagefind-weight="0.4"&gt;&#10; &lt;div class="code-head" data-pagefind-ignore&gt;&lt;span class="lang"&gt;bash&lt;/span&gt;&lt;button type="button" class="copy-btn" aria-label="Copy" data-copied="Copied"&gt;&lt;svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;rect x="9" y="9" width="11" height="11" rx="2"/&gt;&lt;path d="M5 15V5a2 2 0 012-2h10"/&gt;&lt;/svg&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;pre class="term"&gt;&lt;code&gt;&lt;span class="line"&gt;&lt;span class="t-p"&gt;$&lt;/span&gt; &lt;span class="t-c"&gt;source&lt;/span&gt; oe-init-build-env &lt;span class="t-pa"&gt;build-bbb/&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="t-p"&gt;&lt;span class="t-pu"&gt;zk47@ltu&lt;/span&gt;:&lt;span class="t-pd"&gt;~/Youtube/Yocto/yocto-bbb/poky/build-bbb&lt;/span&gt;$&lt;/span&gt; &lt;span class="t-c"&gt;bitbake-layers&lt;/span&gt; create-layer &lt;span class="t-pa"&gt;../meta-kernel&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="t-out"&gt;NOTE: Starting bitbake server...&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="t-out"&gt;Add your new layer with 'bitbake-layers add-layer ../meta-kernel'&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="t-out"&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="t-p"&gt;$&lt;/span&gt; &lt;span class="t-c"&gt;bitbake-layers&lt;/span&gt; add-layer &lt;span class="t-pa"&gt;../meta-kernel&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="t-out"&gt;NOTE: Starting bitbake server...&lt;/span&gt;&lt;/span&gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;h3 id="12-create-the-kernel-append-recipe"&gt;1.2 Create the kernel append recipe&lt;/h3&gt;&#10;&lt;p&gt;We use the following command to find the kernel recipe (in fact we could use virtual/kernel, but that is a generic name, not the specific one)&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 19. Sharing sstate to speed up builds</title><link>https://embeddedlinux.blog/en/2026/04/11/yocto-bbb-19-cau-hinh-share-state-day-nhanh-qua-trinh-build/</link><pubDate>Sat, 11 Apr 2026 06:54:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/04/11/yocto-bbb-19-cau-hinh-share-state-day-nhanh-qua-trinh-build/</guid><description>&lt;h2 id="1-setting-up-the-http-server"&gt;1. Setting up the HTTP server&lt;/h2&gt;&#10;&lt;p&gt;Here I use nginx, but you can use simpler methods. All we are doing is sharing the sstate-cache folder from one machine that has already built yocto to another machine on the same network&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 18. GDB debugging through recipe-sysroot</title><link>https://embeddedlinux.blog/en/2026/03/31/yocto-bbb-18-debug-qua-recipe-sysroot/</link><pubDate>Tue, 31 Mar 2026 20:11:59 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/03/31/yocto-bbb-18-debug-qua-recipe-sysroot/</guid><description>&lt;p&gt;In this post I show you how to debug a binary built by a recipe using the recipe-sysroot in that recipe's output folder.&lt;/p&gt;&#10;&lt;h2 id="1-what-is-a-sysroot"&gt;1. What is a sysroot?&lt;/h2&gt;&#10;&lt;p&gt;Sysroot means system root: a folder acting as a virtual root filesystem for cross-compiling. It contains the header files, libraries and artifacts the compiler/linker needs to build code for the target without running on the target.&lt;/p&gt;</description></item><item><title>[GIT] 1. Git send-email (patching the Linux kernel)</title><link>https://embeddedlinux.blog/en/2026/02/28/git-1-git-send-email-patch-linux-kernel-source/</link><pubDate>Sat, 28 Feb 2026 10:17:25 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/02/28/git-1-git-send-email-patch-linux-kernel-source/</guid><description>&lt;p&gt;I plan to send proposals to 2 Google Summer of Code 2026 projects this year, so here is a small skill I just learned. It is quite simple: git send-email. It is used by community projects that don't use github or gitlab pull requests but a mailing list instead: you create a patch and send it to the maintainer of the subsystem. The most typical example is the Linux Kernel. I will use the Linux Kernel codebase as the example in this post :vv (Oh, I don't have any merged patch yet, but I will work towards one in the near future :vv)&lt;/p&gt;</description></item><item><title>[Yocto-MX93] 2. Connecting to wifi, trying Chromium</title><link>https://embeddedlinux.blog/en/2026/02/07/yocto-mx93-2-ket-noi-wifi-test-thu-chromium/</link><pubDate>Sat, 07 Feb 2026 07:34:09 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/02/07/yocto-mx93-2-ket-noi-wifi-test-thu-chromium/</guid><description>&lt;p&gt;One nice thing about using the vendor's full-featured image is that adding things is quite simple, and there is plenty of documentation from the vendor too&lt;/p&gt;&#10;&lt;h2 id="1-adding-chromium-to-the-build"&gt;1. Adding Chromium to the build&lt;/h2&gt;&#10;&lt;p&gt;First, as I said in the previous post, to avoid editing local.conf and bblayers and then having those 2 files reset when you run source, we first run the following command to initialise the build environment&lt;/p&gt;</description></item><item><title>[Yocto-MX93] 1. Building imx-image-full for the FRDM-i.MX93</title><link>https://embeddedlinux.blog/en/2026/01/31/yocto-mx93-1-build-imx-image-full-cho-frdm-i-mx93/</link><pubDate>Sat, 31 Jan 2026 22:07:48 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/01/31/yocto-mx93-1-build-imx-image-full-cho-frdm-i-mx93/</guid><description>&lt;p&gt;In the Yocto series for the Beaglebone Black and STM32MP157 I did a lot of basic features, how to use yocto, working up from core-image-minimal. This time I build the features for the FRDM i.MX93 board starting straight from the vendor's full image.&lt;/p&gt;</description></item><item><title>[Android-BBB] 1. Running Android 6 on the Beaglebone Black</title><link>https://embeddedlinux.blog/en/2026/01/24/android-bbb-1-chay-android-6-tren-bealgebone-black/</link><pubDate>Sat, 24 Jan 2026 21:24:47 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/01/24/android-bbb-1-chay-android-6-tren-bealgebone-black/</guid><description>&lt;p&gt;Of course, the Beaglebone Black only has 512Mb, so it can hardly run Android smoothly. I tried it, and wrote this post so anyone planning to try can have the experience :vv&lt;/p&gt;&#10;&lt;h2 id="1-android-6-image"&gt;1. Android 6 Image&lt;/h2&gt;&#10;&lt;h3 id="11-building-the-image-yourself"&gt;1.1 Building the image yourself&lt;/h3&gt;&#10;&lt;p&gt;You can follow this github page to build the image yourself: &lt;a href="https://github.com/csimmonds/android4beagle" target="_blank" rel="noopener"&gt;https://github.com/csimmonds/android4beagle&lt;/a&gt;&#10;&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 17. Installing Links-X11, browsing the web on core-image-sato</title><link>https://embeddedlinux.blog/en/2026/01/17/yocto-bbb-17-cai-links-x11-luot-web-tren-core-image-sato/</link><pubDate>Sat, 17 Jan 2026 06:34:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/01/17/yocto-bbb-17-cai-links-x11-luot-web-tren-core-image-sato/</guid><description>&lt;p&gt;The other day I installed Android 6 on the Beaglebone Black and saw a Browser app, but it could not browse the web. Newer boards such as the FRDM i.MX93 support Chromium well, but that certainly requires much better hardware.&lt;/p&gt;</description></item><item><title>[STM32MP1] 1. Remoteproc: loading Cortex-M4 firmware from Linux on the A7 core</title><link>https://embeddedlinux.blog/en/2026/01/10/stm32mp1-remoteproc-2-nap-firmware-core-m4-tu-core-a7-linux/</link><pubDate>Sat, 10 Jan 2026 07:06:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/01/10/stm32mp1-remoteproc-2-nap-firmware-core-m4-tu-core-a7-linux/</guid><description>&lt;h2 id="1-preparing-the-elf-file-for-the-m4-core"&gt;1. Preparing the elf file for the M4 core&lt;/h2&gt;&#10;&lt;p&gt;Get STM32IDE, downloaded from ST's website &lt;a href="https://www.st.com/en/development-tools/stm32cubeide.html" target="_blank" rel="noopener"&gt;https://www.st.com/en/development-tools/stm32cubeide.html&lt;/a&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;My machine runs Ubuntu, so it will differ. For this part it is really still just debugging the M4 core, nothing to do with remoteproc yet. You can do this part on a Windows machine, or do something similar with another Arm Cortex-M4 board&lt;/p&gt;</description></item><item><title>[Fun Fact] 1. Where some programming terms come from</title><link>https://embeddedlinux.blog/en/2026/01/03/fun-fact-1-nguon-goc-cua-1-so-thuat-ngu-trong-lap-trinh/</link><pubDate>Sat, 03 Jan 2026 07:12:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2026/01/03/fun-fact-1-nguon-goc-cua-1-so-thuat-ngu-trong-lap-trinh/</guid><description>&lt;p&gt;Have you ever wondered why people use terms like &amp;quot;Core dumped&amp;quot;, &amp;quot;bug&amp;quot;, &amp;quot;mount&amp;quot;, &amp;quot;unmount&amp;quot;, &amp;quot;patch&amp;quot;, &amp;quot;cursor&amp;quot;?&lt;/p&gt;&#10;&lt;details class="md-details"&gt;&#10; &lt;summary&gt;Why 'Core dumped' and not 'Memory Dumped'&lt;/summary&gt;&#10; &lt;div class="md-details-body"&gt;&lt;h4 id="when-does-a-core-dump-happen"&gt;When does a core dump happen?&lt;/h4&gt;&#10;&lt;p&gt;When a program crashes (for example with a Segmentation Fault), the operating system can take a snapshot of the whole memory state of that process at the exact moment of the crash:&lt;/p&gt;</description></item><item><title>[C-MCU] 2. Memory Layout in a C program</title><link>https://embeddedlinux.blog/en/2025/12/27/c-mcu-memory-layout-function-call-stack/</link><pubDate>Sat, 27 Dec 2025 06:54:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/12/27/c-mcu-memory-layout-function-call-stack/</guid><description>&lt;p&gt;In the previous post we looked at the Build Process of a C program; now I continue with the Memory Layout (the regions of memory)&lt;/p&gt;&#10;&lt;h2 id="1-overview"&gt;1. Overview&lt;/h2&gt;&#10;&lt;p&gt;&lt;figure class="md-img"&gt;&lt;img src="https://embeddedlinux.blog/uploads/2025/12/image-21.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;As in the previous post, when we inspect the elf header of the object file with objdump we see (this is elf64-x86-64, which differs somewhat from an MCU's elf; I will cover that in more detail in the MCU demo below)&lt;/p&gt;</description></item><item><title>[C-MCU] 1. The build process of a C program</title><link>https://embeddedlinux.blog/en/2025/12/20/c-mcu-1-build-process-chuong-trinh-code-c/</link><pubDate>Sat, 20 Dec 2025 06:57:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/12/20/c-mcu-1-build-process-chuong-trinh-code-c/</guid><description>&lt;p&gt;You have written plenty of programs in C, but have you ever wondered what runs behind the scenes before the final executable file comes out? Today I will explain that&lt;/p&gt;&#10;&lt;h2 id="1-preparing-the-host-machine"&gt;1. Preparing the host machine&lt;/h2&gt;&#10;&lt;p&gt;For today's post you need GCC to compile C code; the commands don't differ much between the two sides. You can see how to install it at &lt;a href="https://embeddedlinux.blog/en/2024/10/19/cach-cai-dat-gcc-tren-windows-va-ubuntu/"&gt;How to install gcc on Windows and Ubuntu&lt;/a&gt;&#10;&lt;/p&gt;</description></item><item><title>[Yocto-STM32MP1] 2. Creating a kernel device tree patch, enabling i2c</title><link>https://embeddedlinux.blog/en/2025/12/13/yocto-stm32mp1-2-tao-patch-device-tree-kernel-mo-i2c/</link><pubDate>Sat, 13 Dec 2025 07:18:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/12/13/yocto-stm32mp1-2-tao-patch-device-tree-kernel-mo-i2c/</guid><description>&lt;p&gt;In this post I show you how to create a kernel device tree patch to enable i2c5 on the board&lt;/p&gt;&#10;&lt;h2 id="1-documents-and-hardware"&gt;1. Documents and hardware&lt;/h2&gt;&#10;&lt;p&gt;Read the vendor's &lt;a href="https://www.st.com/resource/en/user_manual/um2534-discovery-kits-with-stm32mp157-mpus-stmicroelectronics.pdf" target="_blank" rel="noopener"&gt;User Manual&lt;/a&gt;&#10;; page 8 has the Hardware block diagram, showing the connections currently routed out from the chip&lt;/p&gt;</description></item><item><title>[Yocto-STM32MP1] 1. Build and flash core-image-minimal for the STM32MP157</title><link>https://embeddedlinux.blog/en/2025/12/06/yocto-stm32mp1-1-build-va-flash-core-image-minimal-cho-stm32mp157/</link><pubDate>Sat, 06 Dec 2025 07:11:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/12/06/yocto-stm32mp1-1-build-va-flash-core-image-minimal-cho-stm32mp157/</guid><description>&lt;h2 id="1-preparing-the-host-machine"&gt;1. Preparing the host machine&lt;/h2&gt;&#10;&lt;p&gt;My machine runs Ubuntu 22.04.5 LTS (Jammy Jellyfish). I installed it dual boot with windows to make the most of the cores&lt;/p&gt;&#10;&lt;p&gt;Following the &lt;a href="https://docs.yoctoproject.org/2.2.2/ref-manual/ref-manual.html#required-packages-for-the-host-development-system" target="_blank" rel="noopener"&gt;Yocto Project Reference Manual&lt;/a&gt;&#10;, section 1.3.2.1, we install the following packages&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 16. Enabling ADB, SSH port forwarding</title><link>https://embeddedlinux.blog/en/2025/11/22/yocto-bbb-16-bat-adb-ssh-port-forwarding/</link><pubDate>Sat, 22 Nov 2025 06:46:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/11/22/yocto-bbb-16-bat-adb-ssh-port-forwarding/</guid><description>&lt;p&gt;ADB: Android Debug Bridge&lt;/p&gt;&#10;&lt;p&gt;In this post I show you how to configure the image build with ADB to make transferring files over USB more convenient, as well as Port Forwarding so we can use ssh over USB.&lt;/p&gt;&#10;&lt;h2 id="1-android-debug-bridge-adb"&gt;1. Android Debug Bridge (ADB)&lt;/h2&gt;&#10;&lt;p&gt;&lt;figure class="md-img"&gt;&lt;img src="https://embeddedlinux.blog/uploads/2025/11/image-14.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;</description></item><item><title>[Boot-BBB] 5. Create a Beaglebone Black image with Buildroot</title><link>https://embeddedlinux.blog/en/2025/11/21/boot-bbb-5-tao-beaglebone-black-image-voi-buildroot/</link><pubDate>Fri, 21 Nov 2025 08:58:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/11/21/boot-bbb-5-tao-beaglebone-black-image-voi-buildroot/</guid><description>&lt;p&gt;In this post I show you how to use Buildroot to create a Beaglebone Black image. Simply put, Buildroot is similar to the Yocto Project but leaner, with less configuration. The end goal is to build a custom embedded linux image&lt;/p&gt;</description></item><item><title>[Boot-BBB] 4. Create a root filesystem by hand with busybox</title><link>https://embeddedlinux.blog/en/2025/11/15/boot-bbb-4-tao-root-filesystem-thu-cong-voi-busybox/</link><pubDate>Sat, 15 Nov 2025 06:30:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/11/15/boot-bbb-4-tao-root-filesystem-thu-cong-voi-busybox/</guid><description>&lt;p&gt;Okay, in today's post I continue by showing you how to create a root filesystem by hand, with utilities from busybox (utilities here means the binaries behind commands such as &amp;quot;ls&amp;quot;, &amp;quot;cat&amp;quot;, ...)&lt;/p&gt;&#10;&lt;p&gt;Even a basic root filesystem (rfs) needs around 50 commands.&lt;/p&gt;</description></item><item><title>[Boot-BBB] 3. Compile the Linux Kernel and configure u-boot automatically</title><link>https://embeddedlinux.blog/en/2025/11/08/boot-bbb-3-comiple-linux-kernel-va-cau-hinh-uboot-env/</link><pubDate>Sat, 08 Nov 2025 07:16:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/11/08/boot-bbb-3-comiple-linux-kernel-va-cau-hinh-uboot-env/</guid><description>&lt;p&gt;In the previous post we stopped at the missing u-boot configuration. In this post we compile the kernel and add a uboot.env configuration file so the bootloader runs properly.&lt;/p&gt;&#10;&lt;h2 id="1-fetch-the-kernel-code-and-compile"&gt;1. Fetch the kernel code and compile&lt;/h2&gt;&#10;&lt;h3 id="11-clone-the-source-code"&gt;1.1 Clone the source code&lt;/h3&gt;&#10;&lt;div class="code-block is-term" translate="no" data-lang="bash" data-pagefind-weight="0.4"&gt;&#10; &lt;div class="code-head" data-pagefind-ignore&gt;&lt;span class="lang"&gt;bash&lt;/span&gt;&lt;button type="button" class="copy-btn" aria-label="Copy" data-copied="Copied"&gt;&lt;svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;rect x="9" y="9" width="11" height="11" rx="2"/&gt;&lt;path d="M5 15V5a2 2 0 012-2h10"/&gt;&lt;/svg&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;pre class="term"&gt;&lt;code&gt;&lt;span class="line"&gt;&lt;span class="t-c"&gt;git&lt;/span&gt; clone &lt;a class="t-u" href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux" target="_blank" rel="noopener"&gt;https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux&lt;/a&gt;&lt;/span&gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;p&gt;It takes quite a while, so grab a snack, drink some coffee, chill, and come back to check later. When I cloned it, it was 5.1 Gb&lt;/p&gt;</description></item><item><title>[Boot-BBB] 2. Compile U-boot and test MLO, u-boot.img</title><link>https://embeddedlinux.blog/en/2025/11/01/boot-bbb-2-u-boot-1-build-va-chay-test-mlo-u-boot-img/</link><pubDate>Sat, 01 Nov 2025 09:18:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/11/01/boot-bbb-2-u-boot-1-build-va-chay-test-mlo-u-boot-img/</guid><description>&lt;p&gt;In this post I will show you how to compile &lt;code&gt;u-boot&lt;/code&gt; from source and configure it for the &lt;strong&gt;Beaglebone Black&lt;/strong&gt; board. For what u-boot is, you can read more at &lt;a href="https://embeddedlinux.blog/en/2025/05/10/bbb-linux-3-beaglebone-black-boot-process-u-boot/"&gt;[BBB-Linux] 3. Beaglebone Black Boot Process - U-boot&lt;/a&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="1-clone-configure-and-compile-u-boot"&gt;1. Clone, configure and compile u-boot&lt;/h2&gt;&#10;&lt;h3 id="11-clone-and-checkout"&gt;1.1 Clone and checkout&lt;/h3&gt;&#10;&lt;div class="code-block is-term" translate="no" data-lang="bash" data-pagefind-weight="0.4"&gt;&#10; &lt;div class="code-head" data-pagefind-ignore&gt;&lt;span class="lang"&gt;bash&lt;/span&gt;&lt;button type="button" class="copy-btn" aria-label="Copy" data-copied="Copied"&gt;&lt;svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;rect x="9" y="9" width="11" height="11" rx="2"/&gt;&lt;path d="M5 15V5a2 2 0 012-2h10"/&gt;&lt;/svg&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;pre class="term"&gt;&lt;code&gt;&lt;span class="line"&gt;&lt;span class="t-c"&gt;git&lt;/span&gt; clone &lt;a class="t-u" href="https://source.denx.de/u-boot/u-boot.git" target="_blank" rel="noopener"&gt;https://source.denx.de/u-boot/u-boot.git&lt;/a&gt;&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="t-c"&gt;cd&lt;/span&gt; u-boot&lt;/span&gt;&#10;&lt;span class="line"&gt;&lt;span class="t-c"&gt;git&lt;/span&gt; checkout v2023.01&lt;/span&gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;p&gt;I &lt;code&gt;checkout&lt;/code&gt; v2023.01 because that is the version used in the &lt;strong&gt;worklabs bootlin&lt;/strong&gt;, which is highly compatible with the &lt;code&gt;busybox&lt;/code&gt; and &lt;code&gt;buildroot&lt;/code&gt; used in the same series&lt;/p&gt;</description></item><item><title>[Boot-BBB] 1. Build a cross compiler toolchain with crosstool-ng</title><link>https://embeddedlinux.blog/en/2025/10/25/boot-bbb-1-build-cross-compiler-tool/</link><pubDate>Sat, 25 Oct 2025 08:03:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/10/25/boot-bbb-1-build-cross-compiler-tool/</guid><description>&lt;p&gt;Hi everyone, today I am starting a new series called Boot-BBB. This series is independent of the Yocto-BBB series. Here I will not use yocto; instead I will build crosstool-ng, u-boot, buildroot and busybox from source.&lt;/p&gt;&#10;&lt;h2 id="1-why-we-start-with-the-cross-compiler-toolchain"&gt;1. Why we start with the cross compiler toolchain&lt;/h2&gt;&#10;&lt;p&gt;Embedded Linux consists of 4 main components&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 15. Changing the Boot Logo</title><link>https://embeddedlinux.blog/en/2025/10/18/yocto-bbb-15-thay-doi-boot-logo/</link><pubDate>Sat, 18 Oct 2025 09:25:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/10/18/yocto-bbb-15-thay-doi-boot-logo/</guid><description>&lt;p&gt;Okay, in this post I show how to change the &lt;strong&gt;Boot Logo&lt;/strong&gt; on the &lt;strong&gt;Beaglebone Black&lt;/strong&gt;. At first I thought it would require deep research, but in reality changing it is quite simple. That is one of the nice things about &lt;code&gt;Linux&lt;/code&gt;: there is support for so many &lt;code&gt;Package&lt;/code&gt;s. My job is to find what I need and put it together.&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 14. X11 and RDP (Remote Desktop Protocol)</title><link>https://embeddedlinux.blog/en/2025/10/11/yocto-bbb-14-x11-va-rdp/</link><pubDate>Sat, 11 Oct 2025 09:13:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/10/11/yocto-bbb-14-x11-va-rdp/</guid><description>&lt;p&gt;Since building Weston was far too complicated, and I also tried Weston + RDP without success, I switched to X11 + RDP to keep things simpler&lt;/p&gt;&#10;&lt;h2 id="1-why-use-rdp"&gt;1. Why use RDP&lt;/h2&gt;&#10;&lt;p&gt;The goal of using &lt;code&gt;RDP&lt;/code&gt; (Remote Desktop Protocol) is that you can access the board remotely with a graphical interface, like VNC.&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 13. Building Weston, fixing input and dnd errors</title><link>https://embeddedlinux.blog/en/2025/10/04/yocto-bbb-13-build-weston-sua-loi-input-dnd/</link><pubDate>Sat, 04 Oct 2025 12:15:29 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/10/04/yocto-bbb-13-build-weston-sua-loi-input-dnd/</guid><description>&lt;p&gt;When I started, I did not expect to write this post; I thought I would go straight to the &lt;strong&gt;RDP + Weston&lt;/strong&gt; post. Because on the &lt;code&gt;STM32MP157&lt;/code&gt; it built right away, but on this &lt;strong&gt;Beaglebone Black&lt;/strong&gt; it took me 2 days to get &lt;code&gt;Weston&lt;/code&gt; working more or less properly.&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 12. Transferring files over TFTP</title><link>https://embeddedlinux.blog/en/2025/09/27/yocto-bbb-12-truyen-file-qua-tftp/</link><pubDate>Sat, 27 Sep 2025 09:10:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/09/27/yocto-bbb-12-truyen-file-qua-tftp/</guid><description>&lt;p&gt;In the previous post I showed you how to transfer files over UART; in this post I show you how to transfer files over TFTP. (u-boot supports TFTP for loading files)&lt;/p&gt;&#10;&lt;h2 id="1-what-is-tftp"&gt;1. What is TFTP?&lt;/h2&gt;&#10;&lt;p&gt;TFTP (Trivial File Transfer Protocol) is a &lt;strong&gt;very simple&lt;/strong&gt; file transfer protocol running over &lt;code&gt;UDP&lt;/code&gt; (port 69).&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 11. Transferring files over UART</title><link>https://embeddedlinux.blog/en/2025/09/20/yocto-bbb-11-truyen-file-qua-uart/</link><pubDate>Sat, 20 Sep 2025 09:25:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/09/20/yocto-bbb-11-truyen-file-qua-uart/</guid><description>&lt;p&gt;In this post I show you how to transfer files over UART. It will be very useful soon when we study the Boot process on the BBB and u-boot.&lt;/p&gt;&#10;&lt;h2 id="1-why"&gt;1. Why&lt;/h2&gt;&#10;&lt;p&gt;So far I know of the following ways to transfer files from the HOST to the board. Here are their pros and cons&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 10. Booting from eMMC</title><link>https://embeddedlinux.blog/en/2025/08/30/yocto-bbb-10-boot-from-emmc/</link><pubDate>Sat, 30 Aug 2025 08:40:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/08/30/yocto-bbb-10-boot-from-emmc/</guid><description>&lt;p&gt;In this post I show you how to configure the Beaglebone Black to boot from eMMC.&lt;/p&gt;&#10;&lt;h2 id="1-why"&gt;1. Why&lt;/h2&gt;&#10;&lt;h3 id="11-what-is-emmc"&gt;1.1 What is eMMC?&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;eMMC (embedded MultiMediaCard)&lt;/strong&gt; is a type of integrated storage that combines &lt;strong&gt;NAND flash&lt;/strong&gt; and a &lt;strong&gt;controller&lt;/strong&gt; on the same chip.&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 9. Using devtool, creating patches and installing IPK files</title><link>https://embeddedlinux.blog/en/2025/08/23/yocto-bbb-9-su-dung-devtool-tao-patch-va-file-ipk/</link><pubDate>Sat, 23 Aug 2025 08:52:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/08/23/yocto-bbb-9-su-dung-devtool-tao-patch-va-file-ipk/</guid><description>&lt;p&gt;In post 5 on adding a driver for the &lt;strong&gt;USB wifi&lt;/strong&gt; adapter I showed you how to create &lt;code&gt;recipes&lt;/code&gt; by hand to fetch code from git and build it. In post 8 I also put the &lt;code&gt;main.c&lt;/code&gt; i2c code on git, but after copying it to the board we have to fix &lt;code&gt;I2C_DEV&lt;/code&gt; and &lt;code&gt;I2C_ADDR&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 8. Connecting an SSD1306 0.96 inch OLED over I2C</title><link>https://embeddedlinux.blog/en/2025/08/16/yocto-bbb-8-ket-noi-voi-ssd1306-oled-0-96-inch/</link><pubDate>Sat, 16 Aug 2025 08:05:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/08/16/yocto-bbb-8-ket-noi-voi-ssd1306-oled-0-96-inch/</guid><description>&lt;p&gt;In this post I show you how to connect the Beaglebone Black to an SSD1306 screen and create recipes to build a program for it. Below is how to wire it&lt;/p&gt;&#10;&lt;p&gt;(If you run into difficulties following the blog, you can refer to my hands-on video at the end of the post)&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 7. Adding a driver for a USB wifi adapter</title><link>https://embeddedlinux.blog/en/2025/08/09/yocto-bbb-7-them-driver-cho-usb-wifi/</link><pubDate>Sat, 09 Aug 2025 08:15:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/08/09/yocto-bbb-7-them-driver-cho-usb-wifi/</guid><description>&lt;p&gt;For boards without a built-in wifi module like the &lt;strong&gt;Beaglebone Black&lt;/strong&gt;, a usb wifi adapter is far more convenient than an Ethernet cable. In this post I use the &lt;strong&gt;TP-Link WN722N&lt;/strong&gt; V2 USB wifi adapter, which is quite common in Vietnamese shops&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 6. SSH into the board over Ethernet</title><link>https://embeddedlinux.blog/en/2025/08/02/yocto-bbb-6-ssh-toi-board-qua-ethernet/</link><pubDate>Sat, 02 Aug 2025 08:25:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/08/02/yocto-bbb-6-ssh-toi-board-qua-ethernet/</guid><description>&lt;p&gt;Continuing from post 5, in this post I show you how to add packages to the image so it can connect to the Internet when Ethernet is plugged in, and then SSH into the board, which makes programming easier later.&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 5. Changing the banner after login</title><link>https://embeddedlinux.blog/en/2025/07/26/yocto-bbb-5-thay-doi-banner-sau-khi-dang-nhap/</link><pubDate>Sat, 26 Jul 2025 09:37:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/07/26/yocto-bbb-5-thay-doi-banner-sau-khi-dang-nhap/</guid><description>&lt;p&gt;Our goal for this post is that after logging in, the following screen appears&lt;/p&gt;&#10;&lt;p&gt;(If you run into difficulties following the blog, you can refer to my hands-on video at the end of the post)&lt;/p&gt;&#10;&lt;p&gt;&lt;figure class="md-img"&gt;&lt;img src="https://embeddedlinux.blog/uploads/2025/06/image-21.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;To print this on the screen we need to run some script. To trigger that script we could use a service and install it in systemd, but the setup would be more complicated.&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 4. Changing the Distro Description</title><link>https://embeddedlinux.blog/en/2025/07/19/yocto-bbb-4-thay-doi-distro-description/</link><pubDate>Sat, 19 Jul 2025 09:21:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/07/19/yocto-bbb-4-thay-doi-distro-description/</guid><description>&lt;p&gt;As mentioned in the previous post, the goal of this post is to change the distro description from &amp;quot;Poky (Yocto Project Reference Distro)&amp;quot; to a custom line of my own&lt;/p&gt;&#10;&lt;h2 id="changing-the-distro-description"&gt;Changing the Distro Description&lt;/h2&gt;&#10;&lt;p&gt;First, let's find which file in the poky repo contains this text once the image is built&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 3. Adding a password for the user</title><link>https://embeddedlinux.blog/en/2025/07/12/yocto-bbb-3-them-mat-khau-cho-user/</link><pubDate>Sat, 12 Jul 2025 09:38:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/07/12/yocto-bbb-3-them-mat-khau-cho-user/</guid><description>&lt;p&gt;In the previous 2 posts we did not set a password for the root user. In this post I add a password (since there is no sudo, I add it for root :v)&lt;/p&gt;&#10;&lt;p&gt;(If you run into difficulties following the blog, you can refer to my hands-on video at the end of the post)&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 2. UART Debug Board and Bitbake Append</title><link>https://embeddedlinux.blog/en/2025/07/05/yocto-bbb-2-uart-debug-board/</link><pubDate>Sat, 05 Jul 2025 08:04:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/07/05/yocto-bbb-2-uart-debug-board/</guid><description>&lt;p&gt;In the previous post we successfully built core-minimal-image; in this post I continue with connecting the uart debug and review bitbake append&lt;/p&gt;&#10;&lt;p&gt;(If you run into difficulties following the blog, you can refer to my hands-on video at the end of the post)&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 1. Build a Beaglebone Black image with the Yocto Project</title><link>https://embeddedlinux.blog/en/2025/06/28/yocto-bbb-1-build-beaglebone-black-image-bang-yocto-project/</link><pubDate>Sat, 28 Jun 2025 17:54:46 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/06/28/yocto-bbb-1-build-beaglebone-black-image-bang-yocto-project/</guid><description>&lt;p&gt;Let's start the series on building with Yocto; the first post is about building for the Beaglebone Black.&lt;/p&gt;&#10;&lt;p&gt;(If you run into difficulties following the blog, you can refer to my hands-on video at the end of the post)&lt;/p&gt;&#10;&lt;p&gt;&lt;figure class="md-img"&gt;&lt;img src="https://embeddedlinux.blog/uploads/2025/06/image-25.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;</description></item><item><title>[Yocto-BBB] 0. Theory, documents, and common commands in the Yocto series</title><link>https://embeddedlinux.blog/en/2025/06/27/yocto-bbb-0-ly-thuyet-tai-lieu-va-cau-lenh-thuong-dung-trong-series-yocto/</link><pubDate>Fri, 27 Jun 2025 09:26:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/06/27/yocto-bbb-0-ly-thuyet-tai-lieu-va-cau-lenh-thuong-dung-trong-series-yocto/</guid><description>&lt;p&gt;When following the posts in the series, there are commands I use often, some theory that is easy to forget, and some extra documents. In this post I gather them together so it is easier for you to follow along.&lt;/p&gt;</description></item><item><title>[BBB-Linux] 1. Beaglebone Black Boot Process Overview</title><link>https://embeddedlinux.blog/en/2025/06/21/bbb-linux-1-beaglebone-black-boot-process-overview/</link><pubDate>Sat, 21 Jun 2025 08:51:00 +0700</pubDate><guid>https://embeddedlinux.blog/en/2025/06/21/bbb-linux-1-beaglebone-black-boot-process-overview/</guid><description>&lt;p&gt;&lt;figure class="md-img"&gt;&lt;img src="https://embeddedlinux.blog/uploads/blogger/043d800bc825.jpg" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;The overview consists of 5 stages as shown in the picture; let's go deeper into each stage.&lt;/p&gt;&#10;&lt;h2 id="1-soc-rom-bootloader"&gt;1. SoC ROM Bootloader&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;RBL (ROM Bootloader): this is written by the vendor, i.e. the chip maker; its content cannot be replaced&lt;/li&gt;&#10;&lt;li&gt;It is the first piece of code that runs when the board powers up&lt;/li&gt;&#10;&lt;li&gt;Its main job is to run the next block, the First Stage Bootloader (SPL/MLO)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="2-first-stage-bootloader-splmlo"&gt;2. First Stage Bootloader (SPL/MLO)&lt;/h2&gt;&#10;&lt;p&gt;SPL: Secondary Program Loader&lt;/p&gt;</description></item><item><title>[OrangePi] Fixing wrong colours on the MPI3501 3.5 inch TFT screen</title><link>https://embeddedlinux.blog/en/2025/06/17/orangepi-fix-loi-man-mpi3501-tft-3-5-inch-len-mau-khong-chuan/</link><pubDate>Tue, 17 Jun 2025 15:25:00 +0000</pubDate><guid>https://embeddedlinux.blog/en/2025/06/17/orangepi-fix-loi-man-mpi3501-tft-3-5-inch-len-mau-khong-chuan/</guid><description>&lt;p&gt;I have an Orange pi zero 2w board, which can be seen as a higher-performance yet cheaper version of the Raspberry Pi Zero 2w. The trade-off is less documentation and less support. I felt this deeply when I ran into a problem where the screen on the board displayed the wrong colours&lt;/p&gt;</description></item><item><title>[Linux] Configuring a Logitech mouse with Bash scripts</title><link>https://embeddedlinux.blog/en/2025/05/24/linux-cau-hinh-chuot-logitech-bang-bash-scripts/</link><pubDate>Sat, 24 May 2025 08:27:00 +0000</pubDate><guid>https://embeddedlinux.blog/en/2025/05/24/linux-cau-hinh-chuot-logitech-bang-bash-scripts/</guid><description>&lt;p&gt;Learning a little more about Linux every day. Normally my Logitech G402 mouse on Windows can be configured with G Hub, but on Ubuntu that is not supported yet. I listen to music a lot and usually set 2 of the 5 side buttons to volume up and down, so with some free time I tried to work it out. Specifically, Key 5 is volume up, Key 4 is volume down.&lt;/p&gt;</description></item><item><title>[BBB-Linux] 3. Beaglebone Black Boot Process - U-boot</title><link>https://embeddedlinux.blog/en/2025/05/10/bbb-linux-3-beaglebone-black-boot-process-u-boot/</link><pubDate>Sat, 10 May 2025 11:16:00 +0000</pubDate><guid>https://embeddedlinux.blog/en/2025/05/10/bbb-linux-3-beaglebone-black-boot-process-u-boot/</guid><description>&lt;p&gt;Continuing with the boot process on the BBB: u-boot.&lt;/p&gt;&#10;&lt;p&gt;&lt;figure class="md-img"&gt;&lt;img src="https://embeddedlinux.blog/uploads/blogger/b2740fa3dded.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="1-what-is-u-boot"&gt;1. What is U-boot?&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;U-Boot (Universal Boot Loader)&lt;/strong&gt; is an open-source bootloader that plays an important role in embedded systems running Linux. It is responsible for initialising the basic hardware and handing control over to the operating system kernel. Because it supports many platforms such as ARM, x86 and PowerPC, U-Boot is widely used in embedded software development. It also lets you configure the system environment before the kernel runs, helping the boot process be stable and flexible.&lt;/p&gt;</description></item><item><title>[BBB-Linux] 3.1 Why do we need a Device Tree?</title><link>https://embeddedlinux.blog/en/2025/05/10/bbb-linux-3-1-tai-sao-can-co-device-tree/</link><pubDate>Sat, 10 May 2025 11:16:00 +0000</pubDate><guid>https://embeddedlinux.blog/en/2025/05/10/bbb-linux-3-1-tai-sao-can-co-device-tree/</guid><description>&lt;p&gt;&lt;figure class="md-img"&gt;&lt;img src="https://embeddedlinux.blog/uploads/blogger/30b8446785db.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;A board has many peripherals, but once the OS is running it cannot discover the on-board peripherals by itself, except USB (which has a self-discovery mechanism). That is why we need a code file that defines the peripherals on the board.&lt;/p&gt;</description></item><item><title>[BBB-Linux] 2. Beaglebone Black Boot Process - RBL, SPL</title><link>https://embeddedlinux.blog/en/2025/05/08/bbb-linux-2-beaglebone-black-boot-process-rbl-spl/</link><pubDate>Thu, 08 May 2025 15:29:00 +0000</pubDate><guid>https://embeddedlinux.blog/en/2025/05/08/bbb-linux-2-beaglebone-black-boot-process-rbl-spl/</guid><description>&lt;p&gt;&lt;figure class="md-img"&gt;&lt;img src="https://embeddedlinux.blog/uploads/2025/05/image-3.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;This post looks more closely at the RBL (ROM Bootloader) and SPL (Secondary Program Loader) stages that I mentioned in part 1.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Ti AM335x CPU diagram&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;figure class="md-img"&gt;&lt;img src="https://embeddedlinux.blog/uploads/2025/05/image-4.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="1-rbl-rom-bootloader"&gt;1. RBL (ROM Bootloader)&lt;/h2&gt;&#10;&lt;p&gt;As in the picture above, we have the structure of the AM3359 SoC; the main chip consists of&lt;/p&gt;</description></item><item><title>[Android] 4. How to change the boot animation on Android 15 / Raspberry Pi 4</title><link>https://embeddedlinux.blog/en/2025/05/05/android4-cach-doi-boot-animation-android-15-raspberry-pi-4/</link><pubDate>Mon, 05 May 2025 15:16:00 +0000</pubDate><guid>https://embeddedlinux.blog/en/2025/05/05/android4-cach-doi-boot-animation-android-15-raspberry-pi-4/</guid><description>&lt;p&gt;&lt;em&gt;For building Android 15 I followed the Devlinux.vn post &lt;a href="https://devlinux.vn/blog/X%C3%A2y-d%E1%BB%B1ng-Android-Automotive-15-cho-Raspberry-Pi-4" target="_blank" rel="noopener"&gt;Building Android Automotive 15 for the Raspberry Pi 4&lt;/a&gt;&#10;. The only thing to watch out for in that guide is step 3.1, repo init: use this command instead (change the revision):&lt;/em&gt;&lt;/p&gt;</description></item><item><title>[Android] 3. How to connect to the Raspberry Pi 4 over SSH</title><link>https://embeddedlinux.blog/en/2025/04/22/android3-cach-ket-noi-vao-raspberry-pi-4-dung-ssh/</link><pubDate>Tue, 22 Apr 2025 15:18:00 +0000</pubDate><guid>https://embeddedlinux.blog/en/2025/04/22/android3-cach-ket-noi-vao-raspberry-pi-4-dung-ssh/</guid><description>&lt;p&gt;Reference: &lt;a href="https://gist.github.com/raveenb/ab3217798c827be889b83b584d70b08b" target="_blank" rel="noopener"&gt;https://gist.github.com/raveenb/ab3217798c827be889b83b584d70b08b&lt;/a&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;&lt;figure class="md-img"&gt;&lt;img src="https://embeddedlinux.blog/uploads/blogger/fb975454d7f4.jpg" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;h3 id="1-preparing-the-host"&gt;1. Preparing the host&lt;/h3&gt;&#10;&lt;p&gt;Get adb connected to the board first, see &lt;a href="https://embeddedlinux.blog/en/2025/04/22/android2-cach-ket-noi-vao-raspberry-pi-4-dung-adb-android-debugger-bridge/"&gt;[Android] 2. How to connect to the Raspberry Pi 4 with ADB (Android Debug Bridge)&lt;/a&gt;&#10;. Download termux.apk to get a terminal on the board: &lt;a href="https://termux.en.download.it/android" target="_blank" rel="noopener"&gt;https://termux.en.download.it/android&lt;/a&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;On the host, type:&lt;/p&gt;</description></item><item><title>[Android] 2. How to connect to the Raspberry Pi 4 with ADB (Android Debug Bridge)</title><link>https://embeddedlinux.blog/en/2025/04/22/android2-cach-ket-noi-vao-raspberry-pi-4-dung-adb-android-debugger-bridge/</link><pubDate>Tue, 22 Apr 2025 15:00:00 +0000</pubDate><guid>https://embeddedlinux.blog/en/2025/04/22/android2-cach-ket-noi-vao-raspberry-pi-4-dung-adb-android-debugger-bridge/</guid><description>&lt;h3 id="1-preparing-the-host"&gt;1. Preparing the host&lt;/h3&gt;&#10;&lt;p&gt;&lt;figure class="md-img"&gt;&lt;img src="https://embeddedlinux.blog/uploads/blogger/db032521f065.jpg" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;Obviously, adb has to be installed on the computer first. There are two ways: install the zip, or install the package with apt. I went with the second one:&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;sudo apt install adb&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;After installing, verify with &lt;em&gt;adb version&lt;/em&gt;&lt;/p&gt;</description></item><item><title>[Android] 1. How to build Android 13 for the Raspberry Pi 4</title><link>https://embeddedlinux.blog/en/2025/04/22/android1-cach-build-android-13-cho-raspberry-pi-4/</link><pubDate>Tue, 22 Apr 2025 14:29:00 +0000</pubDate><guid>https://embeddedlinux.blog/en/2025/04/22/android1-cach-build-android-13-cho-raspberry-pi-4/</guid><description>&lt;p&gt;I followed the build guide from Phú's blog: &lt;a href="https://vinalinux.com.vn/2024/08/01/xay-dung-android-13-cho-raspberry-pi-4/" target="_blank" rel="noopener"&gt;https://vinalinux.com.vn/2024/08/01/xay-dung-android-13-cho-raspberry-pi-4/&lt;/a&gt;&#10;. The steps are exactly the same; here I only note a few errors I hit while building.&lt;/p&gt;&#10;&lt;p&gt;&lt;figure class="md-img"&gt;&lt;img src="https://embeddedlinux.blog/uploads/blogger/1a72833b2a86.jpg" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;I used a real machine running Ubuntu 22.04, but a virtual machine such as VirtualBox or VMware works just as well (a VM gets fewer cores for the build, so it takes longer).&lt;/p&gt;</description></item><item><title>How to install gcc on Windows and Ubuntu</title><link>https://embeddedlinux.blog/en/2024/10/19/cach-cai-dat-gcc-tren-windows-va-ubuntu/</link><pubDate>Sat, 19 Oct 2024 02:25:00 +0000</pubDate><guid>https://embeddedlinux.blog/en/2024/10/19/cach-cai-dat-gcc-tren-windows-va-ubuntu/</guid><description>&lt;h2 id="1-what-is-gcc"&gt;1. What is GCC?&lt;/h2&gt;&#10;&lt;p&gt;GCC is a &lt;strong&gt;compiler&lt;/strong&gt;. It is a powerful compiler toolset widely used to compile source code from programming languages such as &lt;code&gt;C&lt;/code&gt;, &lt;code&gt;C++&lt;/code&gt;, &lt;code&gt;Objective-C&lt;/code&gt;.., and many other languages into machine code (binary code that can run on the operating system).&lt;/p&gt;</description></item><item><title>Using GCC to compile C/C++</title><link>https://embeddedlinux.blog/en/2024/10/19/su-dung-gcc-bien-dich-c-c/</link><pubDate>Sat, 19 Oct 2024 02:08:00 +0000</pubDate><guid>https://embeddedlinux.blog/en/2024/10/19/su-dung-gcc-bien-dich-c-c/</guid><description>&lt;h2 id="what-is-gcc"&gt;What is GCC?&lt;/h2&gt;&#10;&lt;p&gt;GCC is a &lt;strong&gt;compiler&lt;/strong&gt;. It is a powerful compiler toolset, widely used to compile source code from languages such as C, C++, Objective-C… and many others into machine code (binary code that can run on the operating system).&lt;/p&gt;</description></item></channel></rss>