{"@attributes":{"version":"2.0"},"channel":{"title":"cge.dev","link":"https:\/\/cge.dev\/","description":"Recent content on cge.dev","generator":"Hugo","language":"en","item":[{"title":"Ditch the Segger RTT Viewer app!","link":"https:\/\/cge.dev\/posts\/ditch-segger-rtt-viewer\/","pubDate":"Thu, 11 Sep 2025 00:00:00 +0000","guid":"https:\/\/cge.dev\/posts\/ditch-segger-rtt-viewer\/","description":"<div class=\"notice note\">\n  <div class=\"notice-title\">\n    <i class=\"fa-solid fa-sticky-note\" aria-hidden=\"true\"><\/i>Note\n  <\/div>\n  <div class=\"notice-content\">This post is part of a new series of short-form posts titled <strong><a href=\"https:\/\/cge.dev\/series\/today-i-learned\/\" >Today I learned<\/a><\/strong>. These posts are intended to be short and more informal\u2014my goal is for you to learn one thing quickly.<\/div>\n<\/div>\n\n<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 \ud83e\ude84, but their RTT viewer application feels like you&rsquo;re stuck back in the 1980&rsquo;s \ud83d\udcdf.<\/p>\n<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>"},{"title":"Teardown 2025 Talk: Are we PLM yet?","link":"https:\/\/cge.dev\/posts\/teardown-2025-talk-are-we-plm-yet\/","pubDate":"Mon, 09 Jun 2025 00:00:00 +0000","guid":"https:\/\/cge.dev\/posts\/teardown-2025-talk-are-we-plm-yet\/","description":"<div style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;\">\n      <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>\n    <\/div>\n\n<p>Have you ever wondered how product teams manage BOMs, revisions, releases, and specifications over the lifecycle of a hardware product?<\/p>\n<p>In this talk, you\u2019ll 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>"},{"title":"KiCon 2025 Talk: Are we PLM yet?","link":"https:\/\/cge.dev\/posts\/kicon-na-2025-talk-are-we-plm-yet\/","pubDate":"Fri, 30 May 2025 00:00:00 +0000","guid":"https:\/\/cge.dev\/posts\/kicon-na-2025-talk-are-we-plm-yet\/","description":"<div class=\"notice note\">\n  <div class=\"notice-title\">\n    <i class=\"fa-solid fa-sticky-note\" aria-hidden=\"true\"><\/i>Note\n  <\/div>\n  <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:\/\/cge.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>\n<\/div>\n\n<div style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;\">\n      <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>\n    <\/div>\n\n<p>Have you ever wondered how product teams manage BOMs, revisions, releases, and specifications over the lifecycle of a hardware product?<\/p>"},{"title":"How to run Intel Quartus\u00ae Prime Lite Edition via Parallels on a Mac with Apple Silicon (ARM64)","link":"https:\/\/cge.dev\/posts\/intel-quartus-prime-lite-edition-via-parallels-mac-apple-silicon-arm64\/","pubDate":"Sat, 25 Jan 2025 00:00:00 +0000","guid":"https:\/\/cge.dev\/posts\/intel-quartus-prime-lite-edition-via-parallels-mac-apple-silicon-arm64\/","description":"<p><em>Learn how to run Intel Quartus\u00ae Prime Lite Edition via Parallels on a Mac with Apple Silicon (ARM64).<\/em><\/p>\n<p>\n\n\n\n<a href=\"images\/quartus-parallels.png\">\n  <img src=\"images\/quartus-parallels.png\" alt=\"quartus-parallels\" class=\"center\" \/>\n<\/a>\n\n<\/p>\n<p>Yesterday&rsquo;s post <a href=\"https:\/\/cge.dev\/posts\/intel-quartus-prime-lite-edition-via-remote-desktop\/\"  class=\"external-link\" target=\"_blank\" rel=\"noopener\">How to run Intel Quartus\u00ae 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>\n<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>"},{"title":"How to run Intel Quartus\u00ae Prime Lite Edition via Remote Desktop","link":"https:\/\/cge.dev\/posts\/intel-quartus-prime-lite-edition-via-remote-desktop\/","pubDate":"Fri, 24 Jan 2025 00:00:00 +0000","guid":"https:\/\/cge.dev\/posts\/intel-quartus-prime-lite-edition-via-remote-desktop\/","description":"<div class=\"notice info\">\n  <div class=\"notice-title\">\n    <i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n  <\/div>\n  <div class=\"notice-content\">Make sure to check out the follow up article <a href=\"https:\/\/cge.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\u00ae Prime Lite Edition via Parallels on a Mac with Apple Silicon (ARM64)<\/a><\/div>\n<\/div>\n\n<p><em>Learn how to run Intel Quartus\u00ae Prime Lite Edition via Remote Desktop.<\/em><\/p>\n<p>\n\n\n\n<a href=\"images\/quartus-remote-desktop.png\">\n  <img src=\"images\/quartus-remote-desktop.png\" alt=\"quartus-remote-desktop\" class=\"center\" \/>\n<\/a>\n\n<\/p>\n<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\u00ae Quartus\u00ae Prime Lite Edition<\/a> FPGA design software.<\/p>\n<p>\n\n\n\n<a href=\"images\/de0-cv.png\">\n  <img src=\"images\/de0-cv.png\" alt=\"de0-cv\" class=\"center\" \/>\n<\/a>\n\n<\/p>\n<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>"},{"title":"USB-over-IP in Docker Containers","link":"https:\/\/cge.dev\/posts\/usb-over-ip-in-docker-containers\/","pubDate":"Fri, 06 Dec 2024 00:00:00 +0000","guid":"https:\/\/cge.dev\/posts\/usb-over-ip-in-docker-containers\/","description":"<p>\n\n\n\n<a href=\"images\/usb-docker.webp\">\n  <img src=\"images\/usb-docker.webp\" alt=\"usb-docker\" class=\"center\" \/>\n<\/a>\n\n<\/p>\n<p><strong><a href=\"https:\/\/cge.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>\n<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>"},{"title":"Array initialization with ranges in C","link":"https:\/\/cge.dev\/posts\/array-initialization-with-ranges-in-c\/","pubDate":"Mon, 01 Jul 2024 00:00:00 +0000","guid":"https:\/\/cge.dev\/posts\/array-initialization-with-ranges-in-c\/","description":"<div class=\"notice note\">\n  <div class=\"notice-title\">\n    <i class=\"fa-solid fa-sticky-note\" aria-hidden=\"true\"><\/i>Note\n  <\/div>\n  <div class=\"notice-content\">This post is part of a new series of short-form posts titled <strong><a href=\"https:\/\/cge.dev\/series\/today-i-learned\/\" >Today I learned<\/a><\/strong>. These posts are intended to be short and more informal\u2014my goal is for you to learn one thing quickly.<\/div>\n<\/div>\n\n<p><strong><a href=\"https:\/\/cge.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>\n<p>\n\n\n\n<a href=\"images\/range-example.webp\">\n  <img src=\"images\/range-example.webp\" alt=\"range-example\" class=\"center\" \/>\n<\/a>\n\n<\/p>\n<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>"},{"title":"2024 mid-year retrospective","link":"https:\/\/cge.dev\/posts\/2024-mid-year-retrospective\/","pubDate":"Wed, 26 Jun 2024 00:00:00 +0000","guid":"https:\/\/cge.dev\/posts\/2024-mid-year-retrospective\/","description":"<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>\n<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>\n<h1 id=\"starting-common-ground-electronics\">\n  Starting Common Ground Electronics\n  <a class=\"heading-link\" href=\"#starting-common-ground-electronics\">\n    <i class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"><\/i>\n    <span class=\"sr-only\">Link to heading<\/span>\n  <\/a>\n<\/h1>\n<p>I started <a href=\"https:\/\/cge.dev\/\"  class=\"external-link\" target=\"_blank\" rel=\"noopener\">Common Ground Electronics<\/a> back in November of 2022 as a part-time project.<\/p>"},{"title":"Prototyping a WiFi serial logger with Golioth","link":"https:\/\/cge.dev\/posts\/golioth-wifi-serial-logger-prototype\/","pubDate":"Tue, 18 Jun 2024 00:00:00 +0000","guid":"https:\/\/cge.dev\/posts\/golioth-wifi-serial-logger-prototype\/","description":"<p>\n\n\n\n<a href=\"images\/golioth-wifi-serial-logger.webp\">\n  <img src=\"images\/golioth-wifi-serial-logger.webp\" alt=\"golioth-wifi-serial-logger\" class=\"center\" \/>\n<\/a>\n\n<\/p>\n<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>\n<h2 id=\"requirements\">\n  Requirements\n  <a class=\"heading-link\" href=\"#requirements\">\n    <i class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"><\/i>\n    <span class=\"sr-only\">Link to heading<\/span>\n  <\/a>\n<\/h2>\n<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>"},{"title":"Enforce Zephyr code quality with pre-commit","link":"https:\/\/cge.dev\/posts\/enforce-zephyr-code-quality-pre-commit\/","pubDate":"Sun, 16 Jul 2023 00:00:00 +0000","guid":"https:\/\/cge.dev\/posts\/enforce-zephyr-code-quality-pre-commit\/","description":"<p>\n\n\n\n<a href=\"images\/zephyr_kite.png\">\n  <img src=\"images\/zephyr_kite.png\" alt=\"zephyr_kite\" class=\"center\" \/>\n<\/a>\n\n<\/p>\n<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>\n<div class=\"notice note\">\n  <div class=\"notice-title\">\n    <i class=\"fa-solid fa-sticky-note\" aria-hidden=\"true\"><\/i>Note\n  <\/div>\n  <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>"},{"title":"About","link":"https:\/\/cge.dev\/about\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/cge.dev\/about\/","description":"<p>Common Ground Electronics is a boutique embedded systems engineering services firm.<\/p>\n<p>We specialize in early-stage prototyping and product development with an emphasis on design for manufacturability.<\/p>\n<h1 id=\"chris-wilson\">\n  Chris Wilson\n  <a class=\"heading-link\" href=\"#chris-wilson\">\n    <i class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"><\/i>\n    <span class=\"sr-only\">Link to heading<\/span>\n  <\/a>\n<\/h1>\n<p>\n\n\n\n<a href=\"images\/chris_200_circular.png\">\n  <img src=\"images\/chris_200_circular.png\" alt=\"chris_200\" class=\"center\" \/>\n<\/a>\n\n<\/p>\n<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>\n<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>"},{"title":"Let's chat","link":"https:\/\/cge.dev\/contact\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/cge.dev\/contact\/","description":"<p>We&rsquo;d love to talk with you!  You can get in touch by emailing <a href=\"mailto:hi@cge.dev\" >hi@cge.dev<\/a><\/p>\n<h2 id=\"support\">\n  Support\n  <a class=\"heading-link\" href=\"#support\">\n    <i class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"><\/i>\n    <span class=\"sr-only\">Link to heading<\/span>\n  <\/a>\n<\/h2>\n<p>If you need support for one of our products or services, please email <a href=\"mailto:support@cge.dev\" >support@cge.dev<\/a><\/p>\n<h2 id=\"security-disclosure\">\n  Security Disclosure\n  <a class=\"heading-link\" href=\"#security-disclosure\">\n    <i class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"><\/i>\n    <span class=\"sr-only\">Link to heading<\/span>\n  <\/a>\n<\/h2>\n<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:security@cge.dev\" >security@cge.dev<\/a> with as much information as possible about the potential flaw and how it might be exploited.<\/p>"},{"title":"Portfolio","link":"https:\/\/cge.dev\/portfolio\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/cge.dev\/portfolio\/","description":{}},{"title":"Services","link":"https:\/\/cge.dev\/services\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/cge.dev\/services\/","description":{}}]}}