<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on cge.dev</title>
    <link>https://cge.dev/posts/</link>
    <description>Recent content in Posts on cge.dev</description>
    <generator>Hugo</generator>
    <language>en</language>
    <atom:link href="https://cge.dev/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Ditch the Segger RTT Viewer app!</title>
      <link>https://cge.dev/posts/ditch-segger-rtt-viewer/</link>
      <pubDate>Thu, 11 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://cge.dev/posts/ditch-segger-rtt-viewer/</guid>
      <description>&lt;div class=&#34;notice note&#34;&gt;&#xA;  &lt;div class=&#34;notice-title&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-sticky-note&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;Note&#xA;  &lt;/div&gt;&#xA;  &lt;div class=&#34;notice-content&#34;&gt;This post is part of a new series of short-form posts titled &lt;strong&gt;&lt;a href=&#34;https://cge.dev/series/today-i-learned/&#34; &gt;Today I learned&lt;/a&gt;&lt;/strong&gt;. These posts are intended to be short and more informal—my goal is for you to learn one thing quickly.&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Segger&amp;rsquo;s &lt;a href=&#34;https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Real Time Transfer (RTT)&lt;/a&gt; feels like magic 🪄, but their RTT viewer application feels like you&amp;rsquo;re stuck back in the 1980&amp;rsquo;s 📟.&lt;/p&gt;&#xA;&lt;p&gt;For example: fonts are not configurable, there&amp;rsquo;s a clunky line-based input, and it only works with Latin1 (ISO/IEC 8859-1) encoded strings. If your device is sending UTF-8 characters to the RTT console, you get garbled output for multi-byte characters.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Teardown 2025 Talk: Are we PLM yet?</title>
      <link>https://cge.dev/posts/teardown-2025-talk-are-we-plm-yet/</link>
      <pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://cge.dev/posts/teardown-2025-talk-are-we-plm-yet/</guid>
      <description>&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/Hb8QpukQxys?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&lt;p&gt;Have you ever wondered how product teams manage BOMs, revisions, releases, and specifications over the lifecycle of a hardware product?&lt;/p&gt;&#xA;&lt;p&gt;In this talk, you’ll learn the basics of using Product Lifecycle Management (PLM) software with KiCad. I&amp;rsquo;ll walk through how to automatically generate a KiCad database library from part data stored in &lt;a href=&#34;https://www.aligni.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Aligni&lt;/a&gt;, a cloud-based PLM software offering a free tier for open-source hardware organizations.&lt;/p&gt;</description>
    </item>
    <item>
      <title>KiCon 2025 Talk: Are we PLM yet?</title>
      <link>https://cge.dev/posts/kicon-na-2025-talk-are-we-plm-yet/</link>
      <pubDate>Fri, 30 May 2025 00:00:00 +0000</pubDate>
      <guid>https://cge.dev/posts/kicon-na-2025-talk-are-we-plm-yet/</guid>
      <description>&lt;div class=&#34;notice note&#34;&gt;&#xA;  &lt;div class=&#34;notice-title&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-sticky-note&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;Note&#xA;  &lt;/div&gt;&#xA;  &lt;div class=&#34;notice-content&#34;&gt;I gave an updated version of this talk at Teardown 2025. Make sure to check out the updated slides at &lt;a href=&#34;https://cge.dev/posts/teardown-2025-talk-are-we-plm-yet/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Teardown 2025 Talk: Are we PLM yet?&lt;/a&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/Gx_-i-3BxoM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&lt;p&gt;Have you ever wondered how product teams manage BOMs, revisions, releases, and specifications over the lifecycle of a hardware product?&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to run Intel Quartus® Prime Lite Edition via Parallels on a Mac with Apple Silicon (ARM64)</title>
      <link>https://cge.dev/posts/intel-quartus-prime-lite-edition-via-parallels-mac-apple-silicon-arm64/</link>
      <pubDate>Sat, 25 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://cge.dev/posts/intel-quartus-prime-lite-edition-via-parallels-mac-apple-silicon-arm64/</guid>
      <description>&lt;p&gt;&lt;em&gt;Learn how to run Intel Quartus® Prime Lite Edition via Parallels on a Mac with Apple Silicon (ARM64).&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;images/quartus-parallels.png&#34;&gt;&#xA;  &lt;img src=&#34;images/quartus-parallels.png&#34; alt=&#34;quartus-parallels&#34; class=&#34;center&#34; /&gt;&#xA;&lt;/a&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Yesterday&amp;rsquo;s post &lt;a href=&#34;https://cge.dev/posts/intel-quartus-prime-lite-edition-via-remote-desktop/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;How to run Intel Quartus® Prime Lite Edition via Remote Desktop&lt;/a&gt; covered how to set-up and run the Quartus tools from a separate Windows machine via Remote Desktop.&lt;/p&gt;&#xA;&lt;p&gt;This follow-up post covers how to install the exact same tools in a Windows VM running in Parallels on a Mac with Apple Silicon (ARM64). This is a nice alternative if you don&amp;rsquo;t have an extra Windows machine available, or if you want to be able to edit Windows files directly from your Mac via Parallels file sharing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to run Intel Quartus® Prime Lite Edition via Remote Desktop</title>
      <link>https://cge.dev/posts/intel-quartus-prime-lite-edition-via-remote-desktop/</link>
      <pubDate>Fri, 24 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://cge.dev/posts/intel-quartus-prime-lite-edition-via-remote-desktop/</guid>
      <description>&lt;div class=&#34;notice info&#34;&gt;&#xA;  &lt;div class=&#34;notice-title&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-exclamation-circle&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;Info&#xA;  &lt;/div&gt;&#xA;  &lt;div class=&#34;notice-content&#34;&gt;Make sure to check out the follow up article &lt;a href=&#34;https://cge.dev/posts/intel-quartus-prime-lite-edition-via-parallels-mac-apple-silicon-arm64/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;How to run Intel Quartus® Prime Lite Edition via Parallels on a Mac with Apple Silicon (ARM64)&lt;/a&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;Learn how to run Intel Quartus® Prime Lite Edition via Remote Desktop.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;images/quartus-remote-desktop.png&#34;&gt;&#xA;  &lt;img src=&#34;images/quartus-remote-desktop.png&#34; alt=&#34;quartus-remote-desktop&#34; class=&#34;center&#34; /&gt;&#xA;&lt;/a&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;I recently obtained a &lt;a href=&#34;https://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&amp;amp;CategoryNo=163&amp;amp;No=921&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Terasic DE0-CV&lt;/a&gt; FPGA dev board and needed to install/configure licensing for the accompanying &lt;a href=&#34;https://www.intel.com/content/www/us/en/collections/products/fpga/software/downloads.html?s=Newest&amp;amp;edition=lite&amp;amp;f:guidetmD240C377263B4C70A4EA0E452D0182CA=%5BIntel%C2%AE%20Quartus%C2%AE%20Prime%20Design%20Software%3BIntel%C2%AE%20Quartus%C2%AE%20Prime%20Lite%20Edition%5D&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Intel® Quartus® Prime Lite Edition&lt;/a&gt; FPGA design software.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;images/de0-cv.png&#34;&gt;&#xA;  &lt;img src=&#34;images/de0-cv.png&#34; alt=&#34;de0-cv&#34; class=&#34;center&#34; /&gt;&#xA;&lt;/a&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;The Quartus Prime software &lt;a href=&#34;https://www.intel.com/content/www/us/en/support/programmable/support-resources/design-software/os-support.html&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;requires&lt;/a&gt; an x86-64 machine running either Windows or Linux, but my laptop is an ARM-based Macbook Pro running macOS which is not supported.&lt;/p&gt;</description>
    </item>
    <item>
      <title>USB-over-IP in Docker Containers</title>
      <link>https://cge.dev/posts/usb-over-ip-in-docker-containers/</link>
      <pubDate>Fri, 06 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://cge.dev/posts/usb-over-ip-in-docker-containers/</guid>
      <description>&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;images/usb-docker.webp&#34;&gt;&#xA;  &lt;img src=&#34;images/usb-docker.webp&#34; alt=&#34;usb-docker&#34; class=&#34;center&#34; /&gt;&#xA;&lt;/a&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://cge.dev/series/today-i-learned/&#34; &gt;Today I learned&lt;/a&gt;&lt;/strong&gt; Docker recently introduced &lt;a href=&#34;https://docs.docker.com/desktop/features/usbip/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;USB/IP protocol support&lt;/a&gt; in Docker Desktop version &lt;a href=&#34;https://docs.docker.com/desktop/release-notes/#4350&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;4.35.0&lt;/a&gt;. Since Docker containers do not support native USB passthrough, this feature makes it possible for Docker containers to remotely access USB devices attached to a machine running Docker Desktop. This is exciting because it opens the door to using Docker containers for embedded development workflows that need to access real hardware via USB.&lt;/p&gt;&#xA;&lt;p&gt;There is a great introductory article on the Golioth blog by founder and CEO Jonathan Beri, where he describes how he worked with the Docker team to integrate USB/IP support into Docker Desktop. The article walks through setting up a USB/IP server and how to connect to USB devices from a Docker container running in Docker Desktop.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Array initialization with ranges in C</title>
      <link>https://cge.dev/posts/array-initialization-with-ranges-in-c/</link>
      <pubDate>Mon, 01 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://cge.dev/posts/array-initialization-with-ranges-in-c/</guid>
      <description>&lt;div class=&#34;notice note&#34;&gt;&#xA;  &lt;div class=&#34;notice-title&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-sticky-note&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;Note&#xA;  &lt;/div&gt;&#xA;  &lt;div class=&#34;notice-content&#34;&gt;This post is part of a new series of short-form posts titled &lt;strong&gt;&lt;a href=&#34;https://cge.dev/series/today-i-learned/&#34; &gt;Today I learned&lt;/a&gt;&lt;/strong&gt;. These posts are intended to be short and more informal—my goal is for you to learn one thing quickly.&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://cge.dev/series/today-i-learned/&#34; &gt;Today I learned&lt;/a&gt;&lt;/strong&gt; there is a &lt;a href=&#34;https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GNU C extension&lt;/a&gt; for &lt;a href=&#34;https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;designated initializers&lt;/a&gt; that makes it possible to initialize a &lt;em&gt;range&lt;/em&gt; of elements in an array.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;images/range-example.webp&#34;&gt;&#xA;  &lt;img src=&#34;images/range-example.webp&#34; alt=&#34;range-example&#34; class=&#34;center&#34; /&gt;&#xA;&lt;/a&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;If you happen to be using GCC (or another compatible compiler that supports this GNU extension, like Clang), you can specify a &lt;em&gt;range&lt;/em&gt; (&lt;code&gt;[first ... last]&lt;/code&gt;) in the designated initializer list.&lt;/p&gt;</description>
    </item>
    <item>
      <title>2024 mid-year retrospective</title>
      <link>https://cge.dev/posts/2024-mid-year-retrospective/</link>
      <pubDate>Wed, 26 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://cge.dev/posts/2024-mid-year-retrospective/</guid>
      <description>&lt;p&gt;We&amp;rsquo;re half-way through 2024 and summer is affording me some additional time to pause and reflect on my first year of consulting.&lt;/p&gt;&#xA;&lt;p&gt;I figured it might be interesting to do a short post on how this business came into existance and what I&amp;rsquo;ve been up to over the last year.&lt;/p&gt;&#xA;&lt;h1 id=&#34;starting-common-ground-electronics&#34;&gt;&#xA;  Starting Common Ground Electronics&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#starting-common-ground-electronics&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I started &lt;a href=&#34;https://cge.dev/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Common Ground Electronics&lt;/a&gt; back in November of 2022 as a part-time project.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Prototyping a WiFi serial logger with Golioth</title>
      <link>https://cge.dev/posts/golioth-wifi-serial-logger-prototype/</link>
      <pubDate>Tue, 18 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://cge.dev/posts/golioth-wifi-serial-logger-prototype/</guid>
      <description>&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;images/golioth-wifi-serial-logger.webp&#34;&gt;&#xA;  &lt;img src=&#34;images/golioth-wifi-serial-logger.webp&#34; alt=&#34;golioth-wifi-serial-logger&#34; class=&#34;center&#34; /&gt;&#xA;&lt;/a&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;In this post, I&amp;rsquo;ll show how I built a cloud-connected WiFi serial logger proof-of-concept in a couple hours (and for less than $10) by leveraging &lt;a href=&#34;https://www.zephyrproject.org/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Zephyr&lt;/a&gt; and &lt;a href=&#34;https://golioth.io/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Golioth&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;requirements&#34;&gt;&#xA;  Requirements&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#requirements&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A couple days ago, one of the folks in the consulting forum on &lt;a href=&#34;https://forum.contextualelectronics.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://forum.contextualelectronics.com/&lt;/a&gt; asked if anybody knew of an off-the-shelf device that could forward log messages from a generic target device to the cloud.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Enforce Zephyr code quality with pre-commit</title>
      <link>https://cge.dev/posts/enforce-zephyr-code-quality-pre-commit/</link>
      <pubDate>Sun, 16 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://cge.dev/posts/enforce-zephyr-code-quality-pre-commit/</guid>
      <description>&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;images/zephyr_kite.png&#34;&gt;&#xA;  &lt;img src=&#34;images/zephyr_kite.png&#34; alt=&#34;zephyr_kite&#34; class=&#34;center&#34; /&gt;&#xA;&lt;/a&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;In this article, I&amp;rsquo;ll describe how embedded firmware developers can leverage &lt;a href=&#34;https://pre-commit.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;pre-commit&lt;/code&gt;&lt;/a&gt; to automate and enforce code quality checks in their Zephyr RTOS embedded firmware projects.&lt;/p&gt;&#xA;&lt;div class=&#34;notice note&#34;&gt;&#xA;  &lt;div class=&#34;notice-title&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-sticky-note&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;Note&#xA;  &lt;/div&gt;&#xA;  &lt;div class=&#34;notice-content&#34;&gt;&lt;p&gt;An earlier revision of this article recommended running &lt;code&gt;clang-format&lt;/code&gt; as a pre-commit hook. While this is still possible, there are some downsides to running &lt;code&gt;clang-format&lt;/code&gt; automatically via &lt;code&gt;pre-commit&lt;/code&gt; (for example, &lt;code&gt;clang-format&lt;/code&gt; formatting &lt;a href=&#34;https://github.com/zephyrproject-rtos/zephyr/issues/52712#issuecomment-1516541794&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;does not 100% align&lt;/a&gt; with the Zephyr project coding style and needs some manual fixing).&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
