cgnd.dev
https://cgnd.dev/
Recent content on cgnd.devHugoenDitch the Segger RTT Viewer app!
https://cgnd.dev/posts/ditch-segger-rtt-viewer/
Thu, 11 Sep 2025 00:00:00 +0000https://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’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’re stuck back in the 1980’s 📟.</p>
<p>For example: fonts are not configurable, there’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 +0000https://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&controls=1&end=0&loop=0&mute=0&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’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 +0000https://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&controls=1&end=0&loop=0&mute=0&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 +0000https://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’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’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 +0000https://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&CategoryNo=163&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&edition=lite&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 +0000https://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 +0000https://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 +0000https://cgnd.dev/posts/2024-mid-year-retrospective/<p>We’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’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 +0000https://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’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 +0000https://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’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 +0000https://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 +0000https://cgnd.dev/contact/<p>We’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 +0000https://cgnd.dev/portfolio/Services
https://cgnd.dev/services/
Mon, 01 Jan 0001 00:00:00 +0000https://cgnd.dev/services/