<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Esp32 on Notebook</title><link>http://blog.cmac4603.dev/tags/esp32/</link><description>Recent content in Esp32 on Notebook</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 29 Aug 2026 14:28:29 +0100</lastBuildDate><atom:link href="http://blog.cmac4603.dev/tags/esp32/index.xml" rel="self" type="application/rss+xml"/><item><title>Neovim and Rustaceanvim With Esp Toolchain</title><link>http://blog.cmac4603.dev/posts/nvim-and-rustaceanvim-with-esp-toolchain/</link><pubDate>Sat, 29 Aug 2026 14:28:29 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/nvim-and-rustaceanvim-with-esp-toolchain/</guid><description>&lt;p&gt;I was trying to get cargo to use the custom &lt;code&gt;esp&lt;/code&gt; toolchain from Espressif, but use &lt;code&gt;stable&lt;/code&gt; for rust-analyzer because the &lt;code&gt;esp&lt;/code&gt; toolchain does not include a rust-analyzer component.&lt;/p&gt;
&lt;p&gt;Neovim has a built-in option to load user-defined config at the project level called &lt;code&gt;excr&lt;/code&gt;, which can be enabled with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-lua" data-lang="lua"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim.o.exrc &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; &lt;span style="color:#75715e"&gt;-- enable project local config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With this enabled, the following &lt;code&gt;.nvim.lua&lt;/code&gt; will merge the global configuration I have set for &lt;code&gt;vim.g.rustaceanvim&lt;/code&gt; (and this is helpful because I have settings for use with the &lt;code&gt;bacon-lsp&lt;/code&gt; as well):&lt;/p&gt;</description></item><item><title>ESP32-C5 Programmable Usb</title><link>http://blog.cmac4603.dev/posts/esp32-c5-programmable-usb/</link><pubDate>Sun, 23 Aug 2026 13:04:17 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/esp32-c5-programmable-usb/</guid><description>&lt;p&gt;TL;DR: it can&amp;rsquo;t be done.&lt;/p&gt;
&lt;p&gt;The USB peripheral on ESP32-C5 is non-programmable and only supports serial/JTAG (unless they release a new MCU).&lt;/p&gt;</description></item><item><title>ESP32, Embassy &amp; Sockets</title><link>http://blog.cmac4603.dev/posts/esp32-embassy-sockets/</link><pubDate>Sun, 09 Aug 2026 12:02:50 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/esp32-embassy-sockets/</guid><description>&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;I was running a webserver (&lt;a href="https://crates.io/crates/picoserve"&gt;picoserve&lt;/a&gt;), but I was only able to run one worker; somewhere in the picoserve code I was running into a panic from &lt;a href="https://docs.rs/smoltcp/latest/smoltcp/iface/struct.SocketSet.html#method.add"&gt;SocketSet add&lt;/a&gt; function, specifically this panic:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;match&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;mut&lt;/span&gt; self.sockets {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ManagedSlice::Borrowed(_) &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;panic!&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;adding a socket to a full SocketSet&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#[cfg(feature = &lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;alloc&amp;#34;&lt;/span&gt;&lt;span style="color:#75715e"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ManagedSlice::Owned(sockets) &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sockets.push(SocketStorage { inner: None });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; index &lt;span style="color:#f92672"&gt;=&lt;/span&gt; sockets.len() &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; put(index, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;mut&lt;/span&gt; sockets[index], socket)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The problem, I &lt;em&gt;eventually&lt;/em&gt; figured out, was that the network stack created with &lt;a href="https://crates.io/crates/embassy-net"&gt;&lt;code&gt;embassy-net&lt;/code&gt;&lt;/a&gt; was being initialized with 3 sockets: one for DHCP, one for DNS, and one for the rest of the code.&lt;/p&gt;</description></item><item><title>Lily T-Dongle S3 SD Card Pins</title><link>http://blog.cmac4603.dev/posts/lily-t-dongle-s3-sd-card-pins/</link><pubDate>Sun, 19 Jul 2026 10:28:54 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/lily-t-dongle-s3-sd-card-pins/</guid><description>&lt;h2 id="sd-card-pin-numbers-for-use-with-spi"&gt;SD Card pin numbers for use with SPI&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;LilyGo Pin Name&lt;/th&gt;
 &lt;th&gt;GPIO #&lt;/th&gt;
 &lt;th&gt;SPI&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;SDMMC_D0&lt;/td&gt;
 &lt;td&gt;14&lt;/td&gt;
 &lt;td&gt;MISO&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SDMMC_D1&lt;/td&gt;
 &lt;td&gt;17&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SDMMC_D2&lt;/td&gt;
 &lt;td&gt;21&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SDMMC_D3&lt;/td&gt;
 &lt;td&gt;18&lt;/td&gt;
 &lt;td&gt;CS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SDMMC_CLK&lt;/td&gt;
 &lt;td&gt;12&lt;/td&gt;
 &lt;td&gt;SCK&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SDMMC_CMD&lt;/td&gt;
 &lt;td&gt;16&lt;/td&gt;
 &lt;td&gt;MOSI&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="example"&gt;Example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; spi_bus &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Spi::new(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; peripherals.&lt;span style="color:#66d9ef"&gt;SPI2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; spi::master::Config::default()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .with_frequency(Rate::from_khz(&lt;span style="color:#ae81ff"&gt;400&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .with_mode(spi::Mode::_0),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.unwrap()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.with_sck(peripherals.&lt;span style="color:#66d9ef"&gt;GPIO12&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// clk
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.with_mosi(peripherals.&lt;span style="color:#66d9ef"&gt;GPIO16&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// cmd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.with_miso(peripherals.&lt;span style="color:#66d9ef"&gt;GPIO14&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// d0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.into_async();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; sd_cs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Output::new(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; peripherals.&lt;span style="color:#66d9ef"&gt;GPIO18&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// d3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Level::High,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; OutputConfig::default().with_pull(Pull::Up),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; spi_dev &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ExclusiveDevice::new(spi_bus, sd_cs, Delay).unwrap();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; sdcard &lt;span style="color:#f92672"&gt;=&lt;/span&gt; SdCard::new(spi_dev, Delay);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Flashing ESP32 Mini SD Card</title><link>http://blog.cmac4603.dev/posts/flashing-esp32-mini-sd-card/</link><pubDate>Sun, 21 Jun 2026 18:40:16 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/flashing-esp32-mini-sd-card/</guid><description>&lt;p&gt;For most ESP32 projects, a microSD card should be formatted to FAT32.&lt;/p&gt;
&lt;p&gt;FAT32 only supports microSD cards up to 32GB.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# find the sd card with lsblk, then unmount it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo umount /dev/mmcblk0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# format in fat32 command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkfs.vfat -F32 /dev/mmcblk0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Connecting to ESP32</title><link>http://blog.cmac4603.dev/posts/connecting-to-esp32/</link><pubDate>Tue, 09 Jun 2026 08:45:33 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/connecting-to-esp32/</guid><description>&lt;link rel="stylesheet" href="http://blog.cmac4603.dev/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css" integrity="sha256-U82fivqdmorAkJP2aN8Fe8bQ9LvQiG85mRp7mZNKdDI=" crossorigin="anonymous"&gt;
 &lt;div class="admonition note"&gt;
 &lt;div class="admonition-header"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"&gt;&lt;path d="M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z"/&gt;&lt;/svg&gt;
 &lt;span&gt;Note&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="admonition-content"&gt;
 &lt;p&gt;The hardware in this example is the &lt;a href="https://esp-rs.github.io/esp-rust-board/"&gt;&lt;code&gt;ESP32-C3-DevKit-RUST-1&lt;/code&gt;&lt;/a&gt; on Arch&lt;/p&gt;</description></item></channel></rss>