{"id":1895,"date":"2026-07-26T21:57:45","date_gmt":"2026-07-26T21:57:45","guid":{"rendered":"https:\/\/g1lro.uk\/?p=1895"},"modified":"2026-07-26T22:37:04","modified_gmt":"2026-07-26T22:37:04","slug":"introducing-the-aioc-toolkit","status":"publish","type":"post","link":"https:\/\/g1lro.uk\/?p=1895","title":{"rendered":"Introducing the AIOC Toolkit"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"464\" src=\"https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-8-1024x464.png\" alt=\"\" class=\"wp-image-1899\" srcset=\"https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-8-1024x464.png 1024w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-8-300x136.png 300w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-8-768x348.png 768w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-8-600x272.png 600w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-8.png 1469w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Configure and Flash Your AIOC From One Browser Tab<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;ve got an <a href=\"https:\/\/github.com\/skuep\/AIOC\" target=\"_blank\" rel=\"noreferrer noopener\">AIOC<\/a> adapter for your handheld radio, you&#8217;ve probably used a couple of different tools to look after it: one to set PTT sources, audio gain, and GPIO behaviour, and \u2014 separately \u2014 <code>dfu-util<\/code> on the command line whenever new firmware comes out. I&#8217;ve combined both jobs into a single page: the <strong>AIOC Toolkit<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"869\" src=\"https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-6-1024x869.png\" alt=\"\" class=\"wp-image-1897\" srcset=\"https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-6-1024x869.png 1024w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-6-300x255.png 300w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-6-768x652.png 768w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-6-600x509.png 600w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-6.png 1217w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s a static web page \u2014 no install, no drivers beyond what Chrome already has, nothing to compile. Open it, plug in your AIOC, and go.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-20959078 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/g1lro.github.io\/aioc-toolkit\">Try it Here<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Try it here:<\/strong> <a href=\"https:\/\/g1lro.github.io\/aioc-toolkit\/\" target=\"_blank\" rel=\"noreferrer noopener\">g1lro.github.io\/aioc-toolkit<\/a><br><strong>Source code:<\/strong> <a href=\"https:\/\/github.com\/G1LRO\/aioc-toolkit\" target=\"_blank\" rel=\"noreferrer noopener\">github.com\/G1LRO\/aioc-toolkit<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Two tools, one page<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The toolkit is split into two tabs. You only ever need one connected at a time, so they don&#8217;t get in each other&#8217;s way.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Configure<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is the day-to-day tab \u2014 everything you&#8217;d want while setting up an AIOC for a new radio or AllStarLink node:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PTT source selection and manual PTT toggles<\/li>\n\n\n\n<li>CM108 button source mapping<\/li>\n\n\n\n<li>Audio RX gain \/ TX boost<\/li>\n\n\n\n<li>AutoPTT (VPTT) and VCOS threshold tuning<\/li>\n\n\n\n<li>A live GPIO status panel \u2014 the LEDs update in real time as the device reports button and PTT state over USB<\/li>\n\n\n\n<li>Foxhunt CW beacon configuration<\/li>\n\n\n\n<li>USB VID\/PID override, for setups (like AllStarLink\/ASL3) that expect the AIOC to present as a CM108 \u2014 there&#8217;s a<\/li>\n\n\n\n<li>One-click &#8220;Fill CM108 IDs&#8221; button now, so you don&#8217;t have to copy the values in by hand<\/li>\n\n\n\n<li>Raw register dump, for when you want to see exactly what&#8217;s stored on the device<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">It connects over WebHID \u2014 click Connect, pick the AIOC from the browser&#8217;s device picker, done.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"368\" src=\"https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-9-1024x368.png\" alt=\"\" class=\"wp-image-1900\" srcset=\"https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-9-1024x368.png 1024w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-9-300x108.png 300w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-9-768x276.png 768w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-9-600x216.png 600w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-9.png 1163w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Flash Firmware<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The newer half of the toolkit. This one flashes new firmware onto the AIOC directly from the browser over WebUSB, using the same USB DFU protocol <code>dfu-util<\/code> uses \u2014 no command line needed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A few things worth knowing about how it works:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The AIOC has to already be in DFU\/bootloader mode before it&#8217;ll show up \u2014 this page doesn&#8217;t flip it into that mode for you. See the <a href=\"https:\/\/github.com\/skuep\/AIOC#how-to-program\" target=\"_blank\" rel=\"noreferrer noopener\">AIOC hardware docs<\/a> for how, depending on your firmware version.<\/li>\n\n\n\n<li>Once connected, it reads the device&#8217;s memory map straight off the hardware and shows you the flash regions before you commit to anything.<\/li>\n\n\n\n<li>There&#8217;s a built-in &#8220;Latest Firmware&#8221; check that queries GitHub for the newest official AIOC release and links straight to the file, so you don&#8217;t have to go hunting for it.<\/li>\n\n\n\n<li>The AIOC&#8217;s boot ROM is separate from its application flash, so a failed or interrupted flash isn&#8217;t the end of the world \u2014 the manual bootloader-entry procedure gets you back in.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"842\" src=\"https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-10-1024x842.png\" alt=\"\" class=\"wp-image-1901\" srcset=\"https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-10-1024x842.png 1024w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-10-300x247.png 300w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-10-768x632.png 768w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-10-600x493.png 600w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-10.png 1176w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Note: Put the AIOC into DFU Firmware mode by connecting the two outer pins before plugging it in to your USB. This boots STMicro&#8217;s stock bootloader rather than the AIOC&#8217;s own firmware, so it&#8217;ll show up in the browser&#8217;s device picker under ST&#8217;s ID (0483:df11) rather than the AIOC&#8217;s usual one (1209:7388) \u2014 that&#8217;s expected, the toolkit looks for both..<\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-13.png\" alt=\"\" class=\"wp-image-1905\" srcset=\"https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-13.png 1024w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-13-300x169.png 300w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-13-768x432.png 768w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-13-600x338.png 600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Light and dark themes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There&#8217;s a sun\/moon toggle in the header if the default theme isn&#8217;t to your taste \u2014 your choice is remembered for next time.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"838\" height=\"395\" src=\"https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-12.png\" alt=\"\" class=\"wp-image-1904\" srcset=\"https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-12.png 838w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-12-300x141.png 300w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-12-768x362.png 768w, https:\/\/g1lro.uk\/wp-content\/uploads\/2026\/07\/image-12-600x283.png 600w\" sizes=\"auto, (max-width: 838px) 100vw, 838px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Built on other people&#8217;s good work<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I didn&#8217;t start this from a blank page. The Configure tab is based on <a href=\"https:\/\/github.com\/hrafnkelle\/aioc-util\" target=\"_blank\" rel=\"noreferrer noopener\">hrafnkelle\/aioc-util<\/a> by TF3HR, which I&#8217;d already contributed the GPIO panel and multi-device connect support to. The Flash Firmware tab&#8217;s DFU handling comes from <a href=\"https:\/\/github.com\/devanlai\/webdfu\" target=\"_blank\" rel=\"noreferrer noopener\">devanlai\/webdfu<\/a>, a browser port of <code>dfu-util<\/code>&#8216;s protocol logic. Full credit and license details are in the <a href=\"https:\/\/github.com\/G1LRO\/aioc-toolkit#attribution\" target=\"_blank\" rel=\"noreferrer noopener\">repo&#8217;s README<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Give it a go<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s live at <a href=\"https:\/\/g1lro.github.io\/aioc-toolkit\/\" target=\"_blank\" rel=\"noreferrer noopener\">g1lro.github.io\/aioc-toolkit<\/a> right now \u2014 just needs Chrome or Edge. If you hit a device that doesn&#8217;t show up, or firmware that doesn&#8217;t behave, the source is all on <a href=\"https:\/\/github.com\/G1LRO\/aioc-toolkit\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub<\/a> and I&#8217;m happy to hear about it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">73,<br>G1LRO<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Configure and Flash Your AIOC From One Browser Tab If you&#8217;ve got an AIOC adapter for your handheld radio, you&#8217;ve probably used a couple of different tools to look after it: one to set PTT sources, audio gain, and GPIO behaviour, and \u2014 separately \u2014 dfu-util on the command line whenever new firmware comes out. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1899,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1895","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/g1lro.uk\/index.php?rest_route=\/wp\/v2\/posts\/1895","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/g1lro.uk\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/g1lro.uk\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/g1lro.uk\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/g1lro.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1895"}],"version-history":[{"count":4,"href":"https:\/\/g1lro.uk\/index.php?rest_route=\/wp\/v2\/posts\/1895\/revisions"}],"predecessor-version":[{"id":1914,"href":"https:\/\/g1lro.uk\/index.php?rest_route=\/wp\/v2\/posts\/1895\/revisions\/1914"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/g1lro.uk\/index.php?rest_route=\/wp\/v2\/media\/1899"}],"wp:attachment":[{"href":"https:\/\/g1lro.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1895"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/g1lro.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1895"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/g1lro.uk\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1895"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}