cgnd.dev https://cgnd.dev/ Recent content on cgnd.dev Hugo en Ditch the Segger RTT Viewer app! https://cgnd.dev/posts/ditch-segger-rtt-viewer/ Thu, 11 Sep 2025 00:00:00 +0000 https://cgnd.dev/posts/ditch-segger-rtt-viewer/ <div class="notice note"> <div class="notice-title"> <i class="fa-solid fa-sticky-note" aria-hidden="true"></i>Note </div> <div class="notice-content">This post is part of a new series of short-form posts titled <strong><a href="https://cgnd.dev/series/today-i-learned/" >Today I learned</a></strong>. These posts are intended to be short and more informal—my goal is for you to learn one thing quickly.</div> </div> <p>Segger&rsquo;s <a href="https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/" class="external-link" target="_blank" rel="noopener">Real Time Transfer (RTT)</a> feels like magic 🪄, but their RTT viewer application feels like you&rsquo;re stuck back in the 1980&rsquo;s 📟.</p> <p>For example: fonts are not configurable, there&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.</p> Teardown 2025 Talk: Are we PLM yet? https://cgnd.dev/posts/teardown-2025-talk-are-we-plm-yet/ Mon, 09 Jun 2025 00:00:00 +0000 https://cgnd.dev/posts/teardown-2025-talk-are-we-plm-yet/ <div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"> <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Hb8QpukQxys?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe> </div> <p>Have you ever wondered how product teams manage BOMs, revisions, releases, and specifications over the lifecycle of a hardware product?</p> <p>In this talk, you’ll learn the basics of using Product Lifecycle Management (PLM) software with KiCad. I&rsquo;ll walk through how to automatically generate a KiCad database library from part data stored in <a href="https://www.aligni.com/" class="external-link" target="_blank" rel="noopener">Aligni</a>, a cloud-based PLM software offering a free tier for open-source hardware organizations.</p> KiCon 2025 Talk: Are we PLM yet? https://cgnd.dev/posts/kicon-na-2025-talk-are-we-plm-yet/ Fri, 30 May 2025 00:00:00 +0000 https://cgnd.dev/posts/kicon-na-2025-talk-are-we-plm-yet/ <div class="notice note"> <div class="notice-title"> <i class="fa-solid fa-sticky-note" aria-hidden="true"></i>Note </div> <div class="notice-content">I gave an updated version of this talk at Teardown 2025. Make sure to check out the updated slides at <a href="https://cgnd.dev/posts/teardown-2025-talk-are-we-plm-yet/" class="external-link" target="_blank" rel="noopener">Teardown 2025 Talk: Are we PLM yet?</a></div> </div> <div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"> <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Gx_-i-3BxoM?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe> </div> <p>Have you ever wondered how product teams manage BOMs, revisions, releases, and specifications over the lifecycle of a hardware product?</p> How to run Intel Quartus® Prime Lite Edition via Parallels on a Mac with Apple Silicon (ARM64) https://cgnd.dev/posts/intel-quartus-prime-lite-edition-via-parallels-mac-apple-silicon-arm64/ Sat, 25 Jan 2025 00:00:00 +0000 https://cgnd.dev/posts/intel-quartus-prime-lite-edition-via-parallels-mac-apple-silicon-arm64/ <p><em>Learn how to run Intel Quartus® Prime Lite Edition via Parallels on a Mac with Apple Silicon (ARM64).</em></p> <p> <a href="images/quartus-parallels.png"> <img src="images/quartus-parallels.png" alt="quartus-parallels" class="center" /> </a> </p> <p>Yesterday&rsquo;s post <a href="https://cgnd.dev/posts/intel-quartus-prime-lite-edition-via-remote-desktop/" class="external-link" target="_blank" rel="noopener">How to run Intel Quartus® Prime Lite Edition via Remote Desktop</a> covered how to set-up and run the Quartus tools from a separate Windows machine via Remote Desktop.</p> <p>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&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.</p> How to run Intel Quartus® Prime Lite Edition via Remote Desktop https://cgnd.dev/posts/intel-quartus-prime-lite-edition-via-remote-desktop/ Fri, 24 Jan 2025 00:00:00 +0000 https://cgnd.dev/posts/intel-quartus-prime-lite-edition-via-remote-desktop/ <div class="notice info"> <div class="notice-title"> <i class="fa-solid fa-exclamation-circle" aria-hidden="true"></i>Info </div> <div class="notice-content">Make sure to check out the follow up article <a href="https://cgnd.dev/posts/intel-quartus-prime-lite-edition-via-parallels-mac-apple-silicon-arm64/" class="external-link" target="_blank" rel="noopener">How to run Intel Quartus® Prime Lite Edition via Parallels on a Mac with Apple Silicon (ARM64)</a></div> </div> <p><em>Learn how to run Intel Quartus® Prime Lite Edition via Remote Desktop.</em></p> <p> <a href="images/quartus-remote-desktop.png"> <img src="images/quartus-remote-desktop.png" alt="quartus-remote-desktop" class="center" /> </a> </p> <p>I recently obtained a <a href="https://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&amp;CategoryNo=163&amp;No=921" class="external-link" target="_blank" rel="noopener">Terasic DE0-CV</a> FPGA dev board and needed to install/configure licensing for the accompanying <a href="https://www.intel.com/content/www/us/en/collections/products/fpga/software/downloads.html?s=Newest&amp;edition=lite&amp;f:guidetmD240C377263B4C70A4EA0E452D0182CA=%5BIntel%C2%AE%20Quartus%C2%AE%20Prime%20Design%20Software%3BIntel%C2%AE%20Quartus%C2%AE%20Prime%20Lite%20Edition%5D" class="external-link" target="_blank" rel="noopener">Intel® Quartus® Prime Lite Edition</a> FPGA design software.</p> <p> <a href="images/de0-cv.png"> <img src="images/de0-cv.png" alt="de0-cv" class="center" /> </a> </p> <p>The Quartus Prime software <a href="https://www.intel.com/content/www/us/en/support/programmable/support-resources/design-software/os-support.html" class="external-link" target="_blank" rel="noopener">requires</a> an x86-64 machine running either Windows or Linux, but my laptop is an ARM-based Macbook Pro running macOS which is not supported.</p> USB-over-IP in Docker Containers https://cgnd.dev/posts/usb-over-ip-in-docker-containers/ Fri, 06 Dec 2024 00:00:00 +0000 https://cgnd.dev/posts/usb-over-ip-in-docker-containers/ <p> <a href="images/usb-docker.webp"> <img src="images/usb-docker.webp" alt="usb-docker" class="center" /> </a> </p> <p><strong><a href="https://cgnd.dev/series/today-i-learned/" >Today I learned</a></strong> Docker recently introduced <a href="https://docs.docker.com/desktop/features/usbip/" class="external-link" target="_blank" rel="noopener">USB/IP protocol support</a> in Docker Desktop version <a href="https://docs.docker.com/desktop/release-notes/#4350" class="external-link" target="_blank" rel="noopener">4.35.0</a>. 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.</p> <p>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.</p> Array initialization with ranges in C https://cgnd.dev/posts/array-initialization-with-ranges-in-c/ Mon, 01 Jul 2024 00:00:00 +0000 https://cgnd.dev/posts/array-initialization-with-ranges-in-c/ <div class="notice note"> <div class="notice-title"> <i class="fa-solid fa-sticky-note" aria-hidden="true"></i>Note </div> <div class="notice-content">This post is part of a new series of short-form posts titled <strong><a href="https://cgnd.dev/series/today-i-learned/" >Today I learned</a></strong>. These posts are intended to be short and more informal—my goal is for you to learn one thing quickly.</div> </div> <p><strong><a href="https://cgnd.dev/series/today-i-learned/" >Today I learned</a></strong> there is a <a href="https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html" class="external-link" target="_blank" rel="noopener">GNU C extension</a> for <a href="https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html" class="external-link" target="_blank" rel="noopener">designated initializers</a> that makes it possible to initialize a <em>range</em> of elements in an array.</p> <p> <a href="images/range-example.webp"> <img src="images/range-example.webp" alt="range-example" class="center" /> </a> </p> <p>If you happen to be using GCC (or another compatible compiler that supports this GNU extension, like Clang), you can specify a <em>range</em> (<code>[first ... last]</code>) in the designated initializer list.</p> 2024 mid-year retrospective https://cgnd.dev/posts/2024-mid-year-retrospective/ Wed, 26 Jun 2024 00:00:00 +0000 https://cgnd.dev/posts/2024-mid-year-retrospective/ <p>We&rsquo;re half-way through 2024 and summer is affording me some additional time to pause and reflect on my first year of consulting.</p> <p>I figured it might be interesting to do a short post on how this business came into existance and what I&rsquo;ve been up to over the last year.</p> <h1 id="starting-common-ground-electronics"> Starting Common Ground Electronics <a class="heading-link" href="#starting-common-ground-electronics"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h1> <p>I started <a href="https://cgnd.dev/" class="external-link" target="_blank" rel="noopener">Common Ground Electronics</a> back in November of 2022 as a part-time project.</p> Prototyping a WiFi serial logger with Golioth https://cgnd.dev/posts/golioth-wifi-serial-logger-prototype/ Tue, 18 Jun 2024 00:00:00 +0000 https://cgnd.dev/posts/golioth-wifi-serial-logger-prototype/ <p> <a href="images/golioth-wifi-serial-logger.webp"> <img src="images/golioth-wifi-serial-logger.webp" alt="golioth-wifi-serial-logger" class="center" /> </a> </p> <p>In this post, I&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 <a href="https://www.zephyrproject.org/" class="external-link" target="_blank" rel="noopener">Zephyr</a> and <a href="https://golioth.io/" class="external-link" target="_blank" rel="noopener">Golioth</a>.</p> <h2 id="requirements"> Requirements <a class="heading-link" href="#requirements"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h2> <p>A couple days ago, one of the folks in the consulting forum on <a href="https://forum.contextualelectronics.com/" class="external-link" target="_blank" rel="noopener">https://forum.contextualelectronics.com/</a> asked if anybody knew of an off-the-shelf device that could forward log messages from a generic target device to the cloud.</p> Enforce Zephyr code quality with pre-commit https://cgnd.dev/posts/enforce-zephyr-code-quality-pre-commit/ Sun, 16 Jul 2023 00:00:00 +0000 https://cgnd.dev/posts/enforce-zephyr-code-quality-pre-commit/ <p> <a href="images/zephyr_kite.png"> <img src="images/zephyr_kite.png" alt="zephyr_kite" class="center" /> </a> </p> <p>In this article, I&rsquo;ll describe how embedded firmware developers can leverage <a href="https://pre-commit.com/" class="external-link" target="_blank" rel="noopener"><code>pre-commit</code></a> to automate and enforce code quality checks in their Zephyr RTOS embedded firmware projects.</p> <div class="notice note"> <div class="notice-title"> <i class="fa-solid fa-sticky-note" aria-hidden="true"></i>Note </div> <div class="notice-content"><p>An earlier revision of this article recommended running <code>clang-format</code> as a pre-commit hook. While this is still possible, there are some downsides to running <code>clang-format</code> automatically via <code>pre-commit</code> (for example, <code>clang-format</code> formatting <a href="https://github.com/zephyrproject-rtos/zephyr/issues/52712#issuecomment-1516541794" class="external-link" target="_blank" rel="noopener">does not 100% align</a> with the Zephyr project coding style and needs some manual fixing).</p> About https://cgnd.dev/about/ Mon, 01 Jan 0001 00:00:00 +0000 https://cgnd.dev/about/ <p>Common Ground Electronics is a boutique embedded systems engineering services firm.</p> <p>We specialize in early-stage prototyping and product development with an emphasis on design for manufacturability.</p> <h1 id="chris-wilson"> Chris Wilson <a class="heading-link" href="#chris-wilson"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h1> <p> <a href="images/chris_200_circular.png"> <img src="images/chris_200_circular.png" alt="chris_200" class="center" /> </a> </p> <p>Chris has over 10 years of experience building low-power embedded systems for the Internet of Things, and over 4 years of product management experience in PCB assembly manufacturing.</p> <p>Prior to starting Common Ground Electronics, Chris worked as an electronics design engineer at <a href="https://www.cisco.com/" class="external-link" target="_blank" rel="noopener">Cisco Systems</a> (via <a href="https://www.cisco.com/c/en/us/about/corporate-strategy-office/acquisitions/arch-rock.html" class="external-link" target="_blank" rel="noopener">Arch Rock acquisition</a>), and more recently as the first technical product manager at <a href="https://en.wikipedia.org/wiki/Tempo_Automation" class="external-link" target="_blank" rel="noopener">Tempo Automation</a>.</p> Let's chat https://cgnd.dev/contact/ Mon, 01 Jan 0001 00:00:00 +0000 https://cgnd.dev/contact/ <p>We&rsquo;d love to talk with you! You can get in touch by emailing <a href="mailto:[email protected]" >[email protected]</a></p> <h2 id="support"> Support <a class="heading-link" href="#support"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h2> <p>If you need support for one of our products or services, please email <a href="mailto:[email protected]" >[email protected]</a></p> <h2 id="security-disclosure"> Security Disclosure <a class="heading-link" href="#security-disclosure"> <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i> <span class="sr-only">Link to heading</span> </a> </h2> <p>We take security very seriously. If you believe you have found a security issue in one of our products or services, please email <a href="mailto:[email protected]" >[email protected]</a> with as much information as possible about the potential flaw and how it might be exploited.</p> Portfolio https://cgnd.dev/portfolio/ Mon, 01 Jan 0001 00:00:00 +0000 https://cgnd.dev/portfolio/ Services https://cgnd.dev/services/ Mon, 01 Jan 0001 00:00:00 +0000 https://cgnd.dev/services/