<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ModemManager &#8211; Managing your Modems Since 2007</title>
	<atom:link href="https://ioncontrol.co/blog/tag/modemmanager/feed/" rel="self" type="application/rss+xml" />
	<link>https://ioncontrol.co/blog</link>
	<description></description>
	<lastBuildDate>Wed, 03 Jun 2026 14:58:49 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://ioncontrol.co/blog/wp-content/uploads/2025/06/logo-150x150.png</url>
	<title>ModemManager &#8211; Managing your Modems Since 2007</title>
	<link>https://ioncontrol.co/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Make a Pluggable USB3-HUB7BC always-on</title>
		<link>https://ioncontrol.co/blog/2025/12/26/make-a-pluggable-usb3-hub7bc-always-on/</link>
		
		<dc:creator><![CDATA[dan]]></dc:creator>
		<pubDate>Fri, 26 Dec 2025 15:15:28 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ModemManager]]></category>
		<guid isPermaLink="false">https://ioncontrol.co/blog/?p=78</guid>

					<description><![CDATA[The Pluggable USB3-HUB7BC is an older USB3 hub with a special property: all seven ports are software controllable with uhubctl. It&#8217;s been replaced by a USB-C version that has fewer controllable ports, but you can still find the OG on eBay. Controllable ports are critical for modem testing to ensure only one of multiple attached [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">The <a href="https://plugable.com/products/usb3-hub7bc/">Pluggable USB3-HUB7BC</a> is an older USB3 hub with a special property: all seven ports are software controllable with <a href="https://github.com/mvp/uhubctl">uhubctl</a>. It&#8217;s been replaced by a USB-C version that has fewer controllable ports, but you can still find the OG on eBay. Controllable ports are critical for modem testing to ensure only one of multiple attached modems is active at a time.</p>



<figure class="wp-block-image aligncenter size-large"><img fetchpriority="high" decoding="async" width="1024" height="452" src="https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6520-1024x452.jpeg" alt="" class="wp-image-79" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6520-1024x452.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6520-300x133.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6520-768x339.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6520-1536x679.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6520-2048x905.jpeg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Unfortunately the hub is powered on by a momentary push-button, but it&#8217;ll be stuck inside an RF shield box and externally power-controlled with a Synaccess IP managed power strip. There is <a href="https://support.plugable.com/t/hub-always-on-mode-is-it-possible/17022/2">no non-physical way</a> to turn the hub on when first powered. Can we change that?</p>



<p class="wp-block-paragraph">Yes we can.</p>



<h4 class="wp-block-heading"><strong>Open it Up</strong></h4>



<p class="wp-block-paragraph">Taking off the four rubber feet reveals four Phillips screws.</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="626" src="https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6515-1024x626.jpeg" alt="" class="wp-image-80" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6515-1024x626.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6515-300x183.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6515-768x470.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6515-1536x939.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6515-2048x1253.jpeg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Removing those lets the bottom come off, revealing the PCB, which easily comes out of the case with a small tilt and a tug.</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="684" src="https://ioncontrol.co/blog/wp-content/uploads/2025/12/board-1024x684.jpeg" alt="" class="wp-image-81" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/12/board-1024x684.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/board-300x201.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/board-768x513.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/board-1536x1027.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/board-2048x1369.jpeg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">I&#8217;ve circled the power switch I need to bypass, so let&#8217;s flip over the board and use a multimeter to figure out whether the switch is normally open (NO) or normally closed (NC) and what pins I need to solder together.</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="714" src="https://ioncontrol.co/blog/wp-content/uploads/2025/12/flipped-board-1024x714.jpeg" alt="" class="wp-image-82" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/12/flipped-board-1024x714.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/flipped-board-300x209.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/flipped-board-768x535.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/flipped-board-1536x1071.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/flipped-board-2048x1428.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading"><strong>Solder Time</strong></h4>



<p class="wp-block-paragraph">Turns out it&#8217;s very simple; the switch is normally open (NO) and pressing the power button continuously doesn&#8217;t seem to put the switch into any kind of debug, reset, or firmware download mode. I just need to connect these two pins together and the hub will automatically turn on every time power is connected.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="732" src="https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6518-1024x732.jpeg" alt="" class="wp-image-83" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6518-1024x732.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6518-300x215.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6518-768x549.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6518-1536x1098.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/12/IMG_6518-2048x1464.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Ugly solder job for sure, but it works.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Nokia FW2IRA -&gt; ?</title>
		<link>https://ioncontrol.co/blog/2025/11/13/nokia-fw2ira/</link>
		
		<dc:creator><![CDATA[dan]]></dc:creator>
		<pubDate>Thu, 13 Nov 2025 03:22:12 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[eNB]]></category>
		<category><![CDATA[LTE]]></category>
		<category><![CDATA[ModemManager]]></category>
		<guid isPermaLink="false">https://ioncontrol.co/blog/?p=62</guid>

					<description><![CDATA[Today I&#8217;m converting my Nokia Flexi Zone Multiband Indoor Pico BTS model FW2IRA to use external antennas. It&#8217;s a 2&#215;2 LTE band 66+46 eNodeB about the size of a couple dinner plates stacked up. I need external antennas because, like my previous conversion of a Nokia FWFF, I&#8217;m going to pipe the radios into a [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="637" src="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6289-1024x637.jpeg" alt="Nokia FW2IRA Pico BTS" class="wp-image-65" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6289-1024x637.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6289-300x187.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6289-768x478.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6289-1536x955.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6289-2048x1274.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Today I&#8217;m converting my Nokia Flexi Zone Multiband Indoor Pico BTS model FW2IRA to use external antennas. It&#8217;s a 2&#215;2 LTE band 66+46 eNodeB about the size of a couple dinner plates stacked up. I need external antennas because, like my <a href="https://ioncontrol.co/blog/2025/09/09/fwff-fwfg-lets-add-external-antennas-to-a-nokia-flexi-pico-bts/">previous conversion</a> of a Nokia FWFF, I&#8217;m going to pipe the radios into a Willtek RF Shield so I don&#8217;t make mobile carriers angry.</p>



<p class="wp-block-paragraph">The Multiband part of the name (and the &#8220;2&#8221; part of the model number) indicate these are second generation Nokia LTE Pico BTSs which support two LTE bands each. The first generation (<a href="https://ioncontrol.co/blog/2025/09/09/fwff-fwfg-lets-add-external-antennas-to-a-nokia-flexi-pico-bts/">like the FWFF</a>) only supports a single band.</p>



<p class="wp-block-paragraph">Here I&#8217;m starting with the top of the unit off, looking at the four antennas that I&#8217;m going to remove.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="914" src="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6088-1024x914.jpeg" alt="Nokia FW2IRA with top case removed, looking at the four integrated antennas." class="wp-image-64" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6088-1024x914.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6088-300x268.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6088-768x685.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6088-1536x1371.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6088-2048x1828.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">The antennas themselves just screw into the huge heatsink, but unfortunately to disconnect their cables we have remove the heatsink because the connectors are far underneath:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="550" src="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6291-1024x550.jpeg" alt="Antenna connector far underneath the huge heatsink." class="wp-image-66" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6291-1024x550.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6291-300x161.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6291-768x413.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6291-1536x825.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6291-2048x1100.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">While I&#8217;ve got the heatsink removed, let&#8217;s take a look inside.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="544" src="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6293-1024x544.jpeg" alt="Main board, RF cards, and huge heatsink of the FW2IRA." class="wp-image-67" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6293-1024x544.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6293-300x159.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6293-768x408.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6293-1536x816.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6293-2048x1088.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Immediately you can see a huge CPU, another big chip that&#8217;s probably an ASIC, a Lattice FPGA, a bunch of DDR3, and two RF cards. Nokia Flexi Zone Picos support a huge number of bands and to manage that the base BTS is the same but the RF cards are changed to support each frequency combination.</p>



<p class="wp-block-paragraph">Now that I have access to the antenna connectors, I&#8217;m going to snap in the SMA pigtails.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="375" src="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6294-1024x375.jpeg" alt="SMA pigtails added in place of the old antennas." class="wp-image-68" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6294-1024x375.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6294-300x110.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6294-768x282.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6294-1536x563.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6294-2048x751.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">And then screw the heatsink back on and route the pigtails around it:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="675" src="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6295-1024x675.jpeg" alt="SMA pigtails routed around the re-installed heatsink." class="wp-image-69" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6295-1024x675.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6295-300x198.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6295-768x506.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6295-1536x1012.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6295-2048x1350.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Next I drilled four holes in the corners of the top case for the SMA connectors to screw into:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1010" height="1024" src="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6296-1010x1024.jpeg" alt="Hole drilled in top case for SMA connector." class="wp-image-70" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6296-1010x1024.jpeg 1010w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6296-296x300.jpeg 296w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6296-768x779.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6296-1515x1536.jpeg 1515w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6296-2020x2048.jpeg 2020w" sizes="auto, (max-width: 1010px) 100vw, 1010px" /></figure>



<p class="wp-block-paragraph">And repeat a couple more times&#8230;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="671" src="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6299-1024x671.jpeg" alt="Two more holes drilled in the top cover for SMA connectors." class="wp-image-71" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6299-1024x671.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6299-300x197.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6299-768x503.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6299-1536x1007.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6299-2048x1343.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">I tightened up the SMA connectors on the outside:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1014" src="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6300-1024x1014.jpeg" alt="Using a pliers to tighten the nut around the SMA connector to keep it in place." class="wp-image-72" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6300-1024x1014.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6300-300x297.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6300-150x150.jpeg 150w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6300-768x760.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6300-1536x1520.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6300-2048x2027.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">And now I have four external antenna connectors on the FW2IRA. It&#8217;s definitely not as elegant as the pre-existing SMA connector holes on the FWFF but it&#8217;ll work.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="622" src="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6302-1024x622.jpeg" alt="Finished project with four SMA connectors installed through two corners of the base station's top cover." class="wp-image-73" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6302-1024x622.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6302-300x182.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6302-768x467.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6302-1536x933.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/11/IMG_6302-2048x1244.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A GPS-synced NTP Server for Small Cells</title>
		<link>https://ioncontrol.co/blog/2025/10/05/a-gps-synced-ntp-server-for-small-cells/</link>
		
		<dc:creator><![CDATA[dan]]></dc:creator>
		<pubDate>Sun, 05 Oct 2025 11:36:21 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[eNB]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[LTE]]></category>
		<category><![CDATA[ModemManager]]></category>
		<guid isPermaLink="false">http://ioncontrol.co/blog/?p=35</guid>

					<description><![CDATA[Base stations need accurate time for framing and synchronization; they&#8217;ll often have GPS antenna ports and provide options for NTP or PTP clock sync. But what if you have a couple base stations and you don&#8217;t want all those GPS antennas hanging near the window? You get a GPS receiver and feed it to an [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Base stations need accurate time for framing and synchronization; they&#8217;ll often have GPS antenna ports and provide options for NTP or PTP clock sync. But what if you have a couple base stations and you don&#8217;t want all those GPS antennas hanging near the window?</p>



<p class="wp-block-paragraph">You get a GPS receiver and feed it to an NTP server, that&#8217;s what. Let&#8217;s do it.</p>



<h4 class="wp-block-heading"><strong>GPS Receiver</strong></h4>



<p class="wp-block-paragraph">The most important choice is which GPS receiver. You want one that provides &#8220;Pulse Per Second&#8221; (PPS) so the time server knows when each second actually starts and can compensate for latency or jitter. That significantly limits your options, but aside from overbuilt marine units like the Garmin 16x you can usually find cheap <a href="https://www.u-blox.com/">u-blox</a> modules like the 7M, M8, or F9. My advice: look at pictures of the board and make sure something says &#8220;PPS&#8221; before you buy it.</p>



<p class="wp-block-paragraph">I&#8217;m going to use USB because the <a href="https://www8.hp.com/h20195/v2/GetPDF.aspx/c06040430.pdf">HP EliteDesk 800 G4 mini</a> that will be my NTP server doesn&#8217;t have a serial port and if I added a serial port then I couldn&#8217;t have two NICs. And while USB PPS is less accurate than serial-based PPS, that doesn&#8217;t really matter for my application.</p>



<p class="wp-block-paragraph">I looked hard for an off-the-shelf USB GPS unit that had PPS capability via USB but those either don&#8217;t exist or are hard to find. So I chose a u-blox NEO-7M based board with a clearly marked PPS pin next to the TX/RX pins. Plus it had an external antenna connector (not shown below, but present at J1 as shipped).</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="572" height="543" src="https://ioncontrol.co/blog/wp-content/uploads/2025/09/Image.jpeg" alt="uBlox NEO-7M GPS board" class="wp-image-37" style="width:438px;height:auto" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/09/Image.jpeg 572w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/Image-300x285.jpeg 300w" sizes="auto, (max-width: 572px) 100vw, 572px" /></figure>



<p class="wp-block-paragraph">The board has a USB-C port already and I hoped the PPS signal would be connected there so I wouldn&#8217;t have to buy an RS-232/USB converter. Spoiler alert: it isn&#8217;t. This is quite silly. So we need a USB serial cable too.</p>



<h4 class="wp-block-heading"><strong>The USB Serial Cable</strong></h4>



<p class="wp-block-paragraph">The PPS signal usually arrives on the host as one of the RS-232 signals like DCD or RI or CTS. So I need a cable that exposes those signals and can just connect to my GPS board&#8217;s serial pins. I found an <a href="https://ftdichip.com/products/c232hd-ddhsp-0/">FTDI C232HD-DDHSP-0</a> with all the required signals broken out.</p>



<p class="wp-block-paragraph">Since it&#8217;s gotta look nice everything is going into a small project box, which means I need to drill a hole for the USB serial cable and its cord grip.</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="712" height="1024" src="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6099-712x1024.jpeg" alt="Drilling a hole in the project box for the USB serial cable cord grip" class="wp-image-38" style="width:397px;height:auto" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6099-712x1024.jpeg 712w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6099-208x300.jpeg 208w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6099-768x1105.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6099-1068x1536.jpeg 1068w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6099-1423x2048.jpeg 1423w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6099-scaled.jpeg 1779w" sizes="auto, (max-width: 712px) 100vw, 712px" /></figure>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="506" src="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6100-1024x506.jpeg" alt="Cord grip installed in the project box" class="wp-image-39" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6100-1024x506.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6100-300x148.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6100-768x379.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6100-1536x759.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6100-2048x1012.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">On to the antenna; it&#8217;s just a male SMA to female SMA bulkhead cable:</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="751" src="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6105-1024x751.jpeg" alt="Everything in the project box with the antenna connector" class="wp-image-40" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6105-1024x751.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6105-300x220.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6105-768x563.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6105-1536x1126.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6105-2048x1501.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Time to hook up the board&#8230; I connected the cable RX to the board&#8217;s TXD, cable TX to board&#8217;s RXD, and VCC and GND.</p>



<p class="wp-block-paragraph">What about PPS? I first tried the Ring Indicator (RI) signal and could not get PPS to be recognized by gpsd, while ppscheck worked fine. It turns out gpsd doesn&#8217;t read the serial signals directly but tries to use the kernel&#8217;s pps_ldisc driver which only supports DCD. Lame.</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="907" height="1024" src="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6107-907x1024.jpeg" alt="Serial cable connected to the GPS board" class="wp-image-41" style="width:489px;height:auto" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6107-907x1024.jpeg 907w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6107-266x300.jpeg 266w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6107-768x867.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6107-1360x1536.jpeg 1360w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6107-1814x2048.jpeg 1814w" sizes="auto, (max-width: 907px) 100vw, 907px" /></figure>



<h4 class="wp-block-heading"><strong>Everything Else</strong></h4>



<p class="wp-block-paragraph">With the board hooked up and tested I added two mounting brackets and insulated the inside with hot glue.</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="801" height="1024" src="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6110-801x1024.jpeg" alt="GPS board fit into the case with hot glue covering the nuts holding the external brackets in place." class="wp-image-42" style="width:548px;height:auto" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6110-801x1024.jpeg 801w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6110-235x300.jpeg 235w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6110-768x982.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6110-1201x1536.jpeg 1201w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6110-1601x2048.jpeg 1601w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6110-scaled.jpeg 2001w" sizes="auto, (max-width: 801px) 100vw, 801px" /></figure>



<p class="wp-block-paragraph">Screw on the top, and we&#8217;re ready to set up the software side of things.</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="740" src="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6111-1024x740.jpeg" alt="The finished GPS box with the USB serial cable." class="wp-image-43" style="width:548px;height:auto" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6111-1024x740.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6111-300x217.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6111-768x555.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6111-1536x1111.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6111-2048x1481.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading"><strong>Double-check</strong></h4>



<p class="wp-block-paragraph">It&#8217;s worth running <code>gpsmon /dev/ttyUSB0</code> to ensure everything (including PPS) is working before getting <code>gpsd</code> running. It should look something like this:</p>



<pre class="wp-block-code alignwide has-small-font-size" style="border-style:none;border-width:0px"><code><code>┌──────────────────────────────────────────────────────────────────────────────┐
│Time: 2025-09-26T01:57:18.000Z   Lat: YY ZZ.046970' N   Lon:  ZZ XX.045530' W │
└───────────────────────────────── Cooked TPV ─────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────────────┐
│ GPRMC GPVTG GPGGA GPGSA GPGSV GPGLL                                          │
└───────────────────────────────── Sentences ──────────────────────────────────┘
┌───────────────────────┌─────────────────────────┌────────────────────────────┐
│ SVID  PRN  Az El SN HU│Time:     015718.00	  │Time:      015718.00        │
│GP  2    2 101 30 26  Y│Latitude:   XXXX.04697 N │Latitude:  XXXX.04697       │
│GP  7    7 113 81 29  Y│Longitude: YYYYY.04553 W │Longitude: YYYYY.04553      │
│GP  8    8  75 48 41  Y│Speed:    0.223          │Altitude:  267.9            │
│GP 27   27  22 17 33  Y│Course:                  │Quality:   1   Sats: 05     │
│GP 30   30 156 65 30  Y│Status:   A        FAA:A │HDOP:      2.42             │
│GP  9    9  67 15 25  N│MagVar:                  │Geoid:     -30.9            │
│                       └───────── RMC ───────────└─────────── GGA ────────────┘
│                       ┌─────────────────────────┌────────────────────────────┐
│                       │Mode: A3 Sats: 2 7 8 27 +│UTC:           RMS:         │
│                       │DOP H=2.42 V=3.44 P=4.21 │MAJ:           MIN:         │
│                       │TOFF: -1.280474680       │ORI:           LAT:         │
│                       │PPS: -1.412210534        │LON:           ALT:         │
└──────── GSV ──────────└────── GSA + PPS ────────└─────────── GST ────────────┘</code></code></pre>



<p class="wp-block-paragraph"><code>gpsmon</code> talks directly to the device so it will read PPS on more RS-232 control signals than the kernel&#8217;s PPS driver supports. Just something to watch out for in case <code>gpsmon</code> shows PPS but <code>gpsd</code> doesn&#8217;t.</p>



<h4 class="wp-block-heading"><strong>gpsd</strong></h4>



<p class="wp-block-paragraph">On the software side the GPS module is managed by <code>gpsd</code>, which autodetects vendor quirks and (as long as you&#8217;re using DCD for PPS) configures the kernel&#8217;s PPS device for you. </p>



<p class="wp-block-paragraph">My simple Fedora <code>gpsd</code> config gets written to <code>/etc/sysconfig/gpsd</code> but other distros use <code>/etc/default/gpsd</code>.</p>



<pre class="wp-block-code"><code># Options for gpsd, including serial devices
OPTIONS="-n"
DEVICES="/dev/ttyUSB0"
# Set to 'true' to add USB devices automatically via udev
USBAUTO="true"</code></pre>



<p class="wp-block-paragraph">Later I&#8217;ll be replacing the <code>/dev/ttyUSB0</code> device path with a more permanent one since there will eventually be 10+ modems connected and USB device names are notoriously unstable.</p>



<p class="wp-block-paragraph">Now I can start <code>gpsd</code>:</p>



<pre class="wp-block-code"><code>systemctl start gpsd</code></pre>



<p class="wp-block-paragraph">and double-check one last time by running <code>gpsmon</code> again, but this time without arguments since it will automatically use data from the running <code>gpsd</code>.</p>



<h4 class="wp-block-heading"><strong>chrony</strong></h4>



<p class="wp-block-paragraph">Now that I have GPS up and running it&#8217;s time for NTP, which was the whole point of this exercise. <code>gpsd</code> writes location and timing data from GPS receivers to a well-known Shared Memory (SHM) segment that other daemons like <code>ntpd</code> or <code>chrony</code> read. I&#8217;m going to use <code>chrony</code>.</p>



<p class="wp-block-paragraph">Here&#8217;s my minimal <code>/etc/chrony.conf</code>:</p>



<pre class="wp-block-code alignwide"><code># Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

# Allow NTP client access from local network.
allow all

# Serve time even if not synchronized to a time source.
local stratum 1

# Set the TAI-UTC offset of the system clock.
leapseclist /usr/share/zoneinfo/leap-seconds.list

# Specify directory for log files.
logdir /var/log/chrony

# Listen to gpsd for reference time
refclock SHM 0 refid GPS precision 1e-1 offset 0.0
refclock SHM 1 refid PPS precision 1e-7
</code></pre>



<p class="wp-block-paragraph">The important bits are the &#8220;<code>allow all</code>&#8220;, &#8220;<code>local stratum 1</code>&#8220;, and both &#8220;<code>refclock</code>&#8221; lines. The NTP server will be on an isolated network so I don&#8217;t care much about limiting access by source IP. The <code>local stratum 1</code> ensures that NTP clients see the server as high-precision (which it is!). The <code>refclock</code> lines are what tells <code>chrony</code> to get timing information from <code>gpsd</code> for both GPS time and PPS high precision adjustment. The <code>SHM 0</code> and <code>SHM 1</code> are <code>gpsd</code>&#8216;s predefined shared memory segments for GPS and PPS info, respectively. Eventually I&#8217;ll do some tests and figure out better timing offsets, but not today.</p>



<p class="wp-block-paragraph">Now I can start <code>chronyd</code>:</p>



<pre class="wp-block-code"><code>systemctl start chronyd</code></pre>



<p class="wp-block-paragraph">and double-check that it&#8217;s working and synced to GPS by running <code>chronyc sources</code> a couple times until it&#8217;s synced up:</p>



<pre class="wp-block-code alignwide"><code>$ chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
#x GPS                           0   4   177    14    +81ms&#91;  +81ms] +/-  100ms
#x PPS                           0   4   177    16    -35ms&#91;  -35ms] +/-   98us
</code></pre>



<p class="wp-block-paragraph">and finally double-check by sending an NTP request to the server:</p>



<pre class="wp-block-code alignwide"><code>$ ntpcheck utils ntpdate -s localhost

Server: localhost:123, Stratum: 1, Requests 3
Last Request:Offset: 0.000000s (0us) | Delay: 0.000058s (58us)
Correct Time is 2025-10-02 19:29:15.287043328 -0500 CDT

Average (3 requests):
Offset: 0.000015s (15us) | Delay: 0.000094s (94us)</code></pre>



<p class="wp-block-paragraph">And now I&#8217;m done! Time to point my base stations to this <code>chronyd</code>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>FWFF-&gt;FWFG: Let&#8217;s add external antennas to a Nokia Flexi Zone Pico BTS</title>
		<link>https://ioncontrol.co/blog/2025/09/09/fwff-fwfg-lets-add-external-antennas-to-a-nokia-flexi-pico-bts/</link>
		
		<dc:creator><![CDATA[dan]]></dc:creator>
		<pubDate>Tue, 09 Sep 2025 16:26:01 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[eNB]]></category>
		<category><![CDATA[LTE]]></category>
		<category><![CDATA[ModemManager]]></category>
		<guid isPermaLink="false">http://ioncontrol.co/blog/?p=19</guid>

					<description><![CDATA[I recently acquired a dirt-cheap Nokia Flexi Zone Pico BTS (model FWFF, LTE band 2) to use for ModemManager automated testing. The problem is that the FWFF has internal antennas, and since Band 2 is licensed spectrum one of the Big Three (Verizon, AT&#38;T, or T-Mobile) might get pretty angry with me. To solve that [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I recently acquired a dirt-cheap Nokia Flexi Zone Pico BTS (model FWFF, LTE band 2) to use for <a href="https://modemmanager.org">ModemManager</a> automated testing. The problem is that the FWFF has internal antennas, and since Band 2 is licensed spectrum one of the Big Three (Verizon, AT&amp;T, or T-Mobile) might get pretty angry with me. To solve that problem I also found two Willtek 4921 RF Shields which are just desktop-size Faraday boxes.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="766" height="1024" src="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6048-766x1024.jpeg" alt="Open Willtek 4921 RF Shield" class="wp-image-20"/><figcaption class="wp-element-caption">You&#8217;ll see more of the Willteks later. No, I haven&#8217;t named them yet.</figcaption></figure>



<p class="wp-block-paragraph">I&#8217;ll be piping the FWFF&#8217;s Band 2 LTE signals into the Willtek later, but that requires getting the RF signals out of the Nokia. How do we do that? SMA pigtails, of course. But first I have to open up some mounting holes. Luckily Nokia did the hard work by milling holes into the aluminum chassis already, and all we have to do is remove some of the heavy-duty faceplate label:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="594" src="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6042-1024x594.jpeg" alt="Cutting holes in the label covering the holes in the aluminum chassis" class="wp-image-22" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6042-1024x594.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6042-300x174.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6042-768x446.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6042-1536x891.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6042-2048x1188.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Now that I&#8217;ve got somewhere to mount the pigtails let&#8217;s take a look inside. I&#8217;ve circled the U.FL connectors on the RF card that I&#8217;ll be replacing. The internal antennas are printed onto PCBs that you can see at the bottom of the picture as a thin gray line that the black ANT2 cable leads to. I&#8217;m going to leave those in place since they&#8217;re taped into the unit.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="768" height="1024" src="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6043-768x1024.jpeg" alt="Antenna connectors on the RF card" class="wp-image-23" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6043-768x1024.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6043-225x300.jpeg 225w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6043-1152x1536.jpeg 1152w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6043-1536x2048.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6043-scaled.jpeg 1920w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>



<p class="wp-block-paragraph">I carefully inserted the SMA connectors through the holes, tightened the retaining bolts and routed the cables back over the RF card&#8217;s heatsink to the antenna connectors. Then since we&#8217;re not removing the internal antennas, and because I don&#8217;t have any Kapton tape, I tucked the old antenna cables into the heatsink to hold them in place.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="616" src="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6046-1024x616.jpeg" alt="New antenna cables routed to the connectors, and old cables tucked into the heatsink." class="wp-image-24" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6046-1024x616.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6046-300x181.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6046-768x462.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6046-1536x925.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6046-2048x1233.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Last thing to do is put the case back on, and we&#8217;ve successfully converted our Nokia Flexi Zone Pico BTS FWFF into an FWFG!</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="578" src="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6047-1024x578.jpeg" alt="FWFF is now an FWFG" class="wp-image-25" srcset="https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6047-1024x578.jpeg 1024w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6047-300x169.jpeg 300w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6047-768x433.jpeg 768w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6047-1536x866.jpeg 1536w, https://ioncontrol.co/blog/wp-content/uploads/2025/09/IMG_6047-2048x1155.jpeg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">It&#8217;s already commissioned to be part of my LTE lab network, but I&#8217;m waiting on putting together a local GPS-synced NTP server since all my eNBs want one, and the Nokia won&#8217;t enable the radios until it has one. (Thanks to Alexander Couzens/@lynxis for that suggestion&#8230;)</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
