<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.iagent.no/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Elias</id>
	<title>iagent - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.iagent.no/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Elias"/>
	<link rel="alternate" type="text/html" href="https://wiki.iagent.no/wiki/Special:Contributions/Elias"/>
	<updated>2026-10-15T02:41:15Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Voron_0.1&amp;diff=1682</id>
		<title>Voron 0.1</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Voron_0.1&amp;diff=1682"/>
		<updated>2026-10-14T16:53:28Z</updated>

		<summary type="html">&lt;p&gt;Elias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Using Recore A8 and Retool A2 in a Voron 0.1. This page is a work in progress.&lt;br /&gt;
&lt;br /&gt;
See also [[Voron 2.4]] for the same boards in a larger Voron.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
* [[Recore A8]] as the main board&lt;br /&gt;
* [[Retool A2]] as the USB toolhead board (extruder, hotend heater and thermistor, fans, accelerometer, Neopixel)&lt;br /&gt;
== Rewire diagram==&lt;br /&gt;
[[https://rewire.iagent.no/#cfg=zH4sIAAAAAAAAA4VVy06kQBTd-xWVuK1k6l0FO51p42QSNWLrkjDd1UqCQADH1sV8-1yqeE5DXDQNt86599wXnP9FlX1PK4sui6Tax_d2V1Q2vjDoLd0jipIGBZJiZSSqigaRs_MTQlMUWXzBHIG1BGoUx5obz4BrZpE9NtXb3lYL_Nrm-57PHV9ohrUMViP-KbKmZwgnEQJSwsgJI2psWdrKIaVHakypDqbaag-KjxPiBjTVTVE6pvJZEYmNFo7J9FoU7bBEkzaMXgrzsRbGeCqjWOrTVK6SPL7MinfwIMjrq2MEjqGZxoFQjgEqfbQyqZr_2AONur7SwMiB17FeiqbtxiHJV9KjfYcpDpj6osM3xednZuMfVfJc5Ifsw3vwPdZUYtWnue7BFmV6tFlcp_kzQJwD6dVLhZXoK3zI0hLRtcrSriswJlKzaczjSp4wSy2DawGDJclSHz_5F0KZnxvKBJYL-xPZXZMWefwrze1r0qS72rO8VqYYFuqUdRdtPcxNC-McUGRhJr9THh_eaq-Eu5obcEmZOXHJGHmM6_e02b14tNsppSWg9Qn62iaN3ce_4cfEoyf4jsAYmpkUh-fhNrqMb7cPBDF3-_NmPBRhpJAMo9Giwk3UIjcRnaI00lMUC68oCsKrmYVBrecm8ETZnHcNJg7XwQRPTtrDFHWzufWSqXT3U800jBjMx9QtBbnsW0ei0PgFkkv9VnT1mJ7x8O7pHiQY9z-aRbil0Dq4zmzE2aauF-nGFbJVJkeoHoxi9CldUcJrPjW1uYcPfBaZtUG2c4Xc2SYKeY9jzlYuDgCiigssYFxoQBXWRnTgsUEAgXmFz0h3MpYdPhCwUoExQ4BpAYAtAqxhgZXkGN4SPWosJ9IMvhc8mJx0RUWawIub6P5kKA0ysGmG8PGgKxASBlaQDwdj-m6DmNBn_wDn8m0-ZAcAAA]]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
The printer runs [[Rebuild]] with Fluidd. The Retool A2 runs Klipper&#039;s stock RP2040 firmware, which Rebuild installs and keeps in step with the host.&lt;br /&gt;
&lt;br /&gt;
==Klipper configuration==&lt;br /&gt;
The Recore A8 uses the reference config that comes with Rebuild (&amp;lt;code&amp;gt;rebuild-reference/generic-recore-a8.cfg&amp;lt;/code&amp;gt;), with the Fluidd config and the toolhead config included from &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[include fluidd.cfg]&lt;br /&gt;
[include Retool_A2.cfg]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Retool A2 is a separate Klipper MCU, found by its serial number:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ls /dev/serial/by-id/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Put the path that shows up for the Retool in &amp;lt;code&amp;gt;[mcu retool]&amp;lt;/code&amp;gt;. The toolhead config is based on the one used in the [[Voron 2.4]]. Its extruder is called &amp;lt;code&amp;gt;extruder3&amp;lt;/code&amp;gt; and its fans have their own names, so it can be included next to the A8 config. The heater, thermistor and PID values still have to be set for the hotend that is fitted, and PID tuned.&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
* Wire diagram and layout&lt;br /&gt;
* Toolhead mount and 3D model&lt;br /&gt;
* Tested configuration and settings&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Recore_A8&amp;diff=1679</id>
		<title>Recore A8</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Recore_A8&amp;diff=1679"/>
		<updated>2026-10-09T12:09:13Z</updated>

		<summary type="html">&lt;p&gt;Elias: OFFSET-T2 is PG2 (GPIO 194), not PG3: PG3 is UC-INT-1 (checked against the schematics&amp;#039; netlists)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Recore header.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Recore is a 3D-printer control board running Linux. It is specifically tailored to be compatible with Klipper and OctoPrint, MainSail or Fluidd. The main features are: &lt;br /&gt;
* Allwinner A64 SoC, quad core CPU running at 1 GHz. &lt;br /&gt;
* 1 GB of DDR3 RAM&lt;br /&gt;
* 8 GB of on board eMMC &lt;br /&gt;
* Gigabit Ethernet&lt;br /&gt;
* 6 TMC2209, 2 A stepper motor drivers&lt;br /&gt;
* 3 heater outputs + high power heated bed&lt;br /&gt;
* 4 USB High Speed ports &lt;br /&gt;
* 4 thermistor/thermocouple inputs (software selectable)&lt;br /&gt;
* Comes with Debian Linux with Klipper and OctoPrint, MainSail or Fluidd installed&lt;br /&gt;
&lt;br /&gt;
This document is for Recore Revision A8. For previous hardware revisions, please see:  &lt;br /&gt;
* [[Recore_A7]]&lt;br /&gt;
* [[Recore_A6]]&lt;br /&gt;
* [[Recore_A5]]&lt;br /&gt;
* [[Recore_A4]]&lt;br /&gt;
* [[Recore_A3]]  &lt;br /&gt;
* [[Recore_A2]]&lt;br /&gt;
&lt;br /&gt;
==Availability==&lt;br /&gt;
Recore A8 can be purchased from the Intelligent Agent web shop [https://www.iagent.no/product/recore/ https://www.iagent.no/product/recore/]&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
Recore is &amp;quot;open schematic&amp;quot;, it is available here: [https://github.com/intelligent-agent/Recore/blob/master/Schematics/Recore_A8.pdf https://github.com/intelligent-agent/Recore/blob/master/Schematics/Recore_A8.pdf]&lt;br /&gt;
&lt;br /&gt;
==3D model==&lt;br /&gt;
A STEP file of the PCB with components is available here: [https://github.com/intelligent-agent/Recore/blob/master/3D-files/Recore_A8.step https://github.com/intelligent-agent/Recore/blob/master/3D-files/Recore_A8.step]&lt;br /&gt;
==CE and FCC==&lt;br /&gt;
Recore has been certified according to 2014/30/EU. The certificate of compliance can be downloaded here: [http://feeds.iagent.no/doc/CE-Recore.pdf CE-Recore.pdf]&amp;lt;br&amp;gt;&lt;br /&gt;
The FCC declaration of conformity can be downloaded here: [http://feeds.iagent.no/doc/FCC-Recore.pdf FCC-Recore.pdf]&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Recore A8 pinout.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A64==&lt;br /&gt;
The Allwinner A64 is a quad core Cortex A53 clocked at 1 GHz. It has an integrated RISC CPU (AR100) clocked at 300 MHz that handles the real time aspect for the 3D-printer. In the following table the pins used for End-stops and stepper control are described. &lt;br /&gt;
The &amp;quot;bank and pin&amp;quot; can be used to specify the pin numbers in klipper. &lt;br /&gt;
The &amp;quot;Number&amp;quot; column is useful for testing things on the command line in conjunction with gpiod.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&lt;br /&gt;
! Name !! Bank and pin !!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number !! Name !! Bank and pin !!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number !! Name !! Bank and pin !! Number&lt;br /&gt;
|-&lt;br /&gt;
| STEP 0 || PL4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 4 || END STOP 0 || PH4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;|228 || OC-ALERT || PF6 || 166&lt;br /&gt;
|-&lt;br /&gt;
| STEP 1 || PL5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 5 || END STOP 1 || PH5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 229 || OC-RESET || PF4 || 164&lt;br /&gt;
|-&lt;br /&gt;
| STEP 2 || PL6 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 6 || END STOP 2 || PH6 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 230 || EN-HP || PF5 || 165&lt;br /&gt;
|-&lt;br /&gt;
| STEP 3 || PL7 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 7 || END STOP 3 || PH7 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 231 || UC-INT-1 || PG3 || 195&lt;br /&gt;
|-&lt;br /&gt;
| STEP 4 || PL8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 8 || END STOP 4 || PH8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 232 || UC-NRST || PG4 || 196&lt;br /&gt;
|-&lt;br /&gt;
| STEP 5 || PL9 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 9 || END STOP 5 || PH9 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 233 || UC-BOOT || PG5 || 197&lt;br /&gt;
|-&lt;br /&gt;
| STEP 6 || PL10 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 10 || GAIN-ENABLE-T0 || PD4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 100 || ES-EN-12V || PF0 || 160&lt;br /&gt;
|-&lt;br /&gt;
| STEP 7 || PL11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 11 || GAIN-ENABLE-T1 || PH11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 235 || EN-THERMISTORS || PF1 || 161&lt;br /&gt;
|-&lt;br /&gt;
| DIR 0 || PE8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 136 || GAIN ENABLE T2 || PE17 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 145 || EN-ENDSTOPS || PF2 || 162&lt;br /&gt;
|-&lt;br /&gt;
| DIR 1 || PE9 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 137 || GAIN ENABLE T3 || PB2 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 34 || USR-BTN || PB3 || 35&lt;br /&gt;
|-&lt;br /&gt;
| DIR 2 || PE10 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 138 || PU-ENABLE-T0 || PG10 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 202 || USR-PIN || PF3 || 163&lt;br /&gt;
|-&lt;br /&gt;
| DIR 3 || PE11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 139 || PU-ENABLE-T1 || PG11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 203 || SBU1 || PC0 || 64&lt;br /&gt;
|-&lt;br /&gt;
| DIR 4 || PE12 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 140 || PU ENABLE T2 || PG12 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 204 || SBU2 || PC2 || 66&lt;br /&gt;
|-&lt;br /&gt;
| DIR 5 || PE13 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 141 || PU ENABLE T3 || PG13 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 205 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| DIR 6 || PE14 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 142 || OFFSET-T0 || PG0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 192 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| DIR 7 || PE15 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 143 || OFFSET-T1 || PG1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 193 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 0 || PE0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 128 || OFFSET-T2 || PG2 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 194 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 1 || PE1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 129 || OFFSET-T3 || PG8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 200 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 2 || PE2 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 130 || STEPPER UART 0-3 || PE16 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 144 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 3 || PE3 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 131 || STEPPER UART 4-5 || PD24 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 120 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 4 || PE4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 132 || STEPPER UART 6 || PD2 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 98 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 5 || PE5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 133 || STEPPER UART 7 || PD3 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 99 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 6 || PD0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 96 || STEPPERS ENABLE || PL12 ||style=&amp;quot;border-right:solid 2px;&amp;quot;|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 7 || PD1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 97 ||  ||  ||style=&amp;quot;border-right:solid 2px;&amp;quot;|  ||  ||  || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==STM32F031==&lt;br /&gt;
The STM32 is a Cortex M0 powered micro controller handling analog inputs and PWM outputs. It does not control any hard real time aspects of the print, that is handled by the AR100 core realized as a separate core in the A64 SoC. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&lt;br /&gt;
! Name !! Bank and pin !!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number !! Name !! Bank and pin !!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number !! Name !! Bank and pin !! Number&lt;br /&gt;
|-&lt;br /&gt;
| HEATER E0 || PA8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 18 || THERMISTOR 0 || PA0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 6 || ES1-DIR || PB3 || 26&lt;br /&gt;
|-&lt;br /&gt;
| HEATER E1 || PA9 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 19 || THERMISTOR 1 || PA1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 7 || ES2-DIR || PB6 || 29&lt;br /&gt;
|-&lt;br /&gt;
| HEATER E2 || PA10 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 20 || THERMISTOR 2 || PA2 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 8 || EXT 1 || PB7 || 30&lt;br /&gt;
|-&lt;br /&gt;
| HEATER BED || PA11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 21 || THERMISTOR 3 || PA3 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 9 || EXT 2 || PB8 || 32&lt;br /&gt;
|-&lt;br /&gt;
| FAN 0 || PF0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 2 || BOARD VOLTAGE || PA4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 10 || EXT 3 || PA13 || 23&lt;br /&gt;
|-&lt;br /&gt;
| FAN 1 || PB1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 15 || BOARD CURRENT || PA5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 11 || EXT 4 || PB2 || 16&lt;br /&gt;
|-&lt;br /&gt;
| FAN 3 || PB4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 27 || BOARD TEMPERATURE || PA6 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 12 || USER LED || PA12 || 22&lt;br /&gt;
|-&lt;br /&gt;
| FAN 2 || PB5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 28 || COLD JUNCTION || PA7 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 13 || FAN_CURRENT || PB0 || 14&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==DBG header==&lt;br /&gt;
The debug header has UART 0 layed out on some of the pins and is used for interacting with u-boot and getting early debug messages from the Linux kernel. It also has a the option to connect a &amp;quot;boot&amp;quot; button so the board can be safely started and shut down from the 3D-printers front panel. The USR pin can be used to light up a an LED or some other custom function. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Pin&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|UART RX&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|UART TX&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|3.3V&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|BOOT&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|USR&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MCU header==&lt;br /&gt;
The MCU header is used for connecting external peripherals to the STM32F031 micro controller on the board. There are 4 pins in total available to use. In addition, there is a ground pin and a 3.3 V pin available. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Pin&lt;br /&gt;
!Function&lt;br /&gt;
!Alt&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|PB7&lt;br /&gt;
|I2C1_SDA&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|PB8&lt;br /&gt;
|I2C1_SCL&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|3.3V&lt;br /&gt;
|0.7-3.3V&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|PA13&lt;br /&gt;
|EXTI 13&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|PB2&lt;br /&gt;
|EXTI 2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==SPI on S6 and S7 headers==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Pin&lt;br /&gt;
!Function&lt;br /&gt;
!Alt&lt;br /&gt;
|-&lt;br /&gt;
|S6-3&lt;br /&gt;
|PD0&lt;br /&gt;
|SPI1_CS&lt;br /&gt;
|-&lt;br /&gt;
|S6-5&lt;br /&gt;
|PD1&lt;br /&gt;
|SPI1_CLK&lt;br /&gt;
|-&lt;br /&gt;
|S7-3&lt;br /&gt;
|PD2&lt;br /&gt;
|SPI1_MOSI&lt;br /&gt;
|-&lt;br /&gt;
|S7-5&lt;br /&gt;
|PD3&lt;br /&gt;
|SPI1_MISO&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===LEDs===&lt;br /&gt;
There are 15 white LEDs on the board. Here is what they mean&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Location&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|D2&lt;br /&gt;
|By PMIC&lt;br /&gt;
|Board powered&lt;br /&gt;
|-&lt;br /&gt;
|D3&lt;br /&gt;
|By heater BED &lt;br /&gt;
|BED output on&lt;br /&gt;
|-&lt;br /&gt;
|D4&lt;br /&gt;
|By fan 0&lt;br /&gt;
|Fan 0 is on&lt;br /&gt;
|-&lt;br /&gt;
|D5&lt;br /&gt;
|By fan 1&lt;br /&gt;
|Fan 1 is on&lt;br /&gt;
|-&lt;br /&gt;
|D6&lt;br /&gt;
|By heater H2&lt;br /&gt;
|Heater H2 is on&lt;br /&gt;
|-&lt;br /&gt;
|D7&lt;br /&gt;
|By fan 2&lt;br /&gt;
|Fan 2 is on&lt;br /&gt;
|-&lt;br /&gt;
|D8&lt;br /&gt;
|By heater H0&lt;br /&gt;
|Heater H0 is on&lt;br /&gt;
|-&lt;br /&gt;
|D9&lt;br /&gt;
|By fan 3&lt;br /&gt;
|Fan 3 is on&lt;br /&gt;
|-&lt;br /&gt;
|D10&lt;br /&gt;
|By heater H1&lt;br /&gt;
|Heater H1 is on&lt;br /&gt;
|-&lt;br /&gt;
|D12&lt;br /&gt;
|By input connector&lt;br /&gt;
|High voltage domain is on&lt;br /&gt;
|-&lt;br /&gt;
|D15&lt;br /&gt;
|By eMMC chip&lt;br /&gt;
|eMMC activity&lt;br /&gt;
|-&lt;br /&gt;
|D17&lt;br /&gt;
|By USB hub chip&lt;br /&gt;
|USB activitiy&lt;br /&gt;
|-&lt;br /&gt;
|D18&lt;br /&gt;
|By the USB C connector&lt;br /&gt;
|Linux Heartbeat&lt;br /&gt;
|-&lt;br /&gt;
|D19&lt;br /&gt;
|By the A64 SoC&lt;br /&gt;
|CPU activity&lt;br /&gt;
|-&lt;br /&gt;
|D20&lt;br /&gt;
|By the STM32&lt;br /&gt;
|Klipper running on STM32&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Buttons===&lt;br /&gt;
There are 3 push buttons on the board. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|FEL&lt;br /&gt;
|Enter FEL-mode of the A64&lt;br /&gt;
|-&lt;br /&gt;
|BOOT&lt;br /&gt;
|Boots or shuts down the board&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|Hard reset of the CPU&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Current limits==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name&lt;br /&gt;
!Limit&lt;br /&gt;
|-&lt;br /&gt;
|5V-ES (endstops)&lt;br /&gt;
|0.75 A&lt;br /&gt;
|-&lt;br /&gt;
|USB host 3 and 4 each (5VP)&lt;br /&gt;
|1.1 A&lt;br /&gt;
|-&lt;br /&gt;
|USB host 1 and 2 each (VSP)&lt;br /&gt;
|0.75 A&lt;br /&gt;
|-&lt;br /&gt;
|Thermistors&lt;br /&gt;
|0.75 A&lt;br /&gt;
|-&lt;br /&gt;
|MCU and DBG connector&lt;br /&gt;
|0.5 A&lt;br /&gt;
|-&lt;br /&gt;
|Fan connectors&lt;br /&gt;
|programmable&lt;br /&gt;
|-&lt;br /&gt;
|Heater connectors&lt;br /&gt;
|programmable&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Wiring=&lt;br /&gt;
Below is a wiring diagram meant to aid in connecting motors, fans, extruders and hot ends to the control board. On the board, there is a small + sign next to output connectors where polarity is important. If passive heating elements are used, polarity is not important, but if those outputs are to be used with SSRs or relays, polarity must be observed. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Recore-wire-diagram-3.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Network connection==&lt;br /&gt;
Recore is designed to be controlled through a browser on a computer, so the board must be connected to the local LAN or wifi network. Connect an ethernet cable between the board and a switch. The ping utility can be used to ensure that the board is discovered on the network.&lt;br /&gt;
&lt;br /&gt;
===LAN setup===&lt;br /&gt;
Recore with Refactor is running avahi and should announce itself on the network once a connection has been established. On a Linux based host computer, it is possible to search for a booted device using the following command: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ping recore.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If the device is present, an SSH connection can be established:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root@recore.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Furthermore, a web interface running OctoPrint can be found using a browser:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
http://recore.local&lt;br /&gt;
&lt;br /&gt;
==Wifi setup==&lt;br /&gt;
Wifi can be set up by connecting a wifi dongle to one of the USB host ports. Once the uSB dongle has been connected, and the board has been booted, access to the terminal command line can be given through a host computer. The board should appear as a TTY ACM device. On a Linux based host computer, the terminal program `screen` can be used to get access. From the host computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen /dev/ttyACM0 115200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the host computer is running Windows, [https://www.putty.org/ Putty] can be used to get access. &lt;br /&gt;
&lt;br /&gt;
Once a connection has been established, the wifi network can be set up using the command nmtui. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nmtui&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Follow the instructions on screen to edit and activate the wifi connection. &lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
If the board is powered through the USB C connector, only the two USB host ports next to the HDMI port is powered. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mating Connectors==&lt;br /&gt;
The power connectors on the board are available either in the web shop as part of a [https://www.iagent.no/product/recore-connector-pack-a8/ connector pack] or directly from Digi-key etc.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt; &lt;br /&gt;
[[File:Connectors A8.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Four pin male: TBP01P1-508-04BE [[https://www.digikey.com/en/products/detail/cui-devices/TBP01P1-508-04BE/10238369 | Digi-key]]&lt;br /&gt;
&lt;br /&gt;
Two pin male: TBP01P1-508-02BE [[https://www.digikey.com/en/products/detail/cui-devices/TBP01P1-508-02BE/10238367 | Digi-key]]&lt;br /&gt;
&lt;br /&gt;
Two pin female housing: PHR-2-BK&lt;br /&gt;
&lt;br /&gt;
Three pin female housing: PHR-3-BK&lt;br /&gt;
&lt;br /&gt;
Four pin female housing: PHR-4-BK&lt;br /&gt;
&lt;br /&gt;
=Klipper Configuration=&lt;br /&gt;
There are no jumpers on Recore and no hard fuses. Everything is software configurable and resettable from software. This gives great power and flexibility without requiring physical access to the board once it has been installed. But with great power comes great responsibility. It is possible to break things if care is not taken during setup. There is one setting in particular that is worth mentioning: ES0 can have either +5V or +12V on the power pin. This is in order to allow a standard industrial inductive sensor to be used on that end stop. If a 5V only peripheral is connected, that could damage the connected peripheral. &lt;br /&gt;
&lt;br /&gt;
The default config file for Recore A8 can be found in the repository: [https://github.com/intelligent-agent/Rebuild/blob/main/userpatches/overlay/klipper/generic-recore-a8.cfg generic-recore-a8.cfg]&lt;br /&gt;
&lt;br /&gt;
===TMC2209===&lt;br /&gt;
The 6 stepper drivers on Recore are of type TMC2209 from Trinamic. Each stepper has a configuration interface with a bidirectional UART port that is connected to a pin on the A64. The GPIO bit-banging functionality of Klipper is used to communicate with the stepper drivers. &lt;br /&gt;
&lt;br /&gt;
Here is a table with pins and addresses for the steppers&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Stepper driver config&lt;br /&gt;
|-&lt;br /&gt;
|Name&lt;br /&gt;
|Pins&lt;br /&gt;
|Address&lt;br /&gt;
|-&lt;br /&gt;
|S0&lt;br /&gt;
|PE16&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|S1&lt;br /&gt;
|PE16&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|S2&lt;br /&gt;
|PE16&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|S3&lt;br /&gt;
|PE16&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|S4&lt;br /&gt;
|PD24&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|S5&lt;br /&gt;
|PD24&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|S6&lt;br /&gt;
|PD2&lt;br /&gt;
|0-3&lt;br /&gt;
|-&lt;br /&gt;
|S7&lt;br /&gt;
|PD3&lt;br /&gt;
|0-3&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== External stepper drivers ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Ext-driver.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
It is possible to connect up to two external stepper drivers to Recore in addition to the 6 divers installed on the board. &lt;br /&gt;
These can be connected using the headers S6 and S7.&lt;br /&gt;
&lt;br /&gt;
See also [[Restep_A1]] for a convenient alternative external stepper driver.&lt;br /&gt;
&lt;br /&gt;
==Temperature inputs==&lt;br /&gt;
4 different temperature devices can be connected to the 4 analog inputs on Recore. Thermistor, Thermocouple, PT100 with INA826 and PT1000 without the use of a pre-amplifier.&lt;br /&gt;
===Thermistor===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Thermistor.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Make sure the pull-up is enabled and the op-amp gain is set to 1.&lt;br /&gt;
&lt;br /&gt;
===Thermocouple===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Thermocouple.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure the pull-up is disabled and the op-amp gain is set to 100.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[recore]&lt;br /&gt;
...&lt;br /&gt;
gain_t0: 100&lt;br /&gt;
pullup_t0: 0&lt;br /&gt;
offset_t0: 1&lt;br /&gt;
&lt;br /&gt;
[Extruder]&lt;br /&gt;
...&lt;br /&gt;
sensor_type: Type K&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===PT100 with INA826===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:PT100.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to use a PT100 sensor, an external amplifier board must be used. There is an example configuration for Klipper that &lt;br /&gt;
uses this. The ADC reference voltage is 5.0 by default, but for Recore it is 3.3 V. Here is an example:  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Extruder]&lt;br /&gt;
...&lt;br /&gt;
sensor_type: PT100 INA826&lt;br /&gt;
adc_voltage: 3.27&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The pull-up must also be disabled.&lt;br /&gt;
&lt;br /&gt;
===PT1000===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:PT1000.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Make sure the pull-up is enabled and the gain is set to 1. In the latest version, the sensor must be prefixed with RECORE. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Extruder]&lt;br /&gt;
...&lt;br /&gt;
sensor_type: PT1000&lt;br /&gt;
pullup_resistor: 4750&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===End stops===&lt;br /&gt;
There are 6 end stop inputs on Recore, some of them server a dual purpose.&lt;br /&gt;
&lt;br /&gt;
=Connecting other sensors=&lt;br /&gt;
The board has been designed to work with a range of 3rd party sensors for automating the print.&lt;br /&gt;
==BLtouch==&lt;br /&gt;
There are two versions of the BLtouch, the difference is the color of one of the GND wires. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Antclabs BLtouch sensor wiring.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The Creality version has a blue GND wire. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Creality BLtouch sensor wiring.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
There have been some cases of bad quality control for the Creality BLTouches, where the pinout on the sensor side have not matched the color coding in the photos/documentation. It might be good to make sure the color codes match up. For the Creality it should be, from left to right: &lt;br /&gt;
Blue, red, yellow, black, white. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When connected per wiring diagram above, setting up BLtouch can be done by adding the following section to printer.cfg.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bltouch]&lt;br /&gt;
sensor_pin: ar100:PH6&lt;br /&gt;
control_pin: !PB3&lt;br /&gt;
speed:15&lt;br /&gt;
samples:1&lt;br /&gt;
pin_move_time: 0.675&lt;br /&gt;
sample_retract_dist: 10&lt;br /&gt;
probe_with_touch_mode: true&lt;br /&gt;
stow_on_each_sample: false&lt;br /&gt;
x_offset:29.2&lt;br /&gt;
y_offset:-34&lt;br /&gt;
z_offset:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Inductive Sensor ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Inductive sensor wiring 2.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Connect the inductive sensor on ES0. You can choose either 5V or 12V output on the voltage pin. Inductive sensors often come with an industry standard voltage input of 6-36 V. For this reason there is a 12 V LDO (Low drop-out) voltage regulator integrated on the board. This voltage regulator can be output on the V+ pin of the connector marked ES0. If the Input to the board is 12 V, the LDO will supply a lower voltage, around 10.6 or so.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
All the end-stops have a permanent 10 K pull-up resistor between the signal pin (pin 2) and the +5V/+12V (pin3). This will work with an NPN-type inductive sensor. If you have a PNP-type inductive sensor, you need to add a pull-down resistor of a lower value, for instance 1 K. The pull-down resistor goes between the signal pin (pin 2) and ground (pin 1). &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is a minimal probe config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[probe]&lt;br /&gt;
pin: ar100:PH4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ADXL345==&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
The ADXL345 seems to cause Klipper to shut down when trying to calibrate at a high rate. A workaround is to use a [https://www.raspberrypi.com/documentation/microcontrollers/pico-series.html Pi Pico] or similar MCU to communicate with the ADXL345, or to lower the rate. It&#039;s been tested working at 400, but not 800 which is the recommended minimum. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
See also [[Remove_A1]], a convenient finished accelerometer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt; &lt;br /&gt;
[[File:Wiring.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A popular accelerometer sensor for doing input shaping with Klipper is the ADXL345. This can be connected to the connectors S6/S7. There is no hardware SPI interface available, but a software implementation in Klipper exists. &lt;br /&gt;
Note: Only experimental support has been tested for this. &lt;br /&gt;
https://learn.adafruit.com/adxl345-digital-accelerometer&lt;br /&gt;
&lt;br /&gt;
Config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[adxl345]&lt;br /&gt;
cs_pin: ar100:PL11&lt;br /&gt;
spi_software_sclk_pin: ar100:PL10&lt;br /&gt;
spi_software_mosi_pin: ar100:PE15&lt;br /&gt;
spi_software_miso_pin: ar100:PE14&lt;br /&gt;
rate: 400&lt;br /&gt;
&lt;br /&gt;
[resonance_tester]&lt;br /&gt;
accel_chip: adxl345&lt;br /&gt;
probe_points:&lt;br /&gt;
    100, 100, 20  # an example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using a Raspberry Pi Pico:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[adxl345]&lt;br /&gt;
cs_pin: pico:gpio17&lt;br /&gt;
spi_bus: spi0c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Neopixels ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;img-res&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Neopixel wiring.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Use endstop ES1 (PH5) or ES2 (PH6).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[neopixel my_neopixel_1]&lt;br /&gt;
pin: ar100:PH5&lt;br /&gt;
&lt;br /&gt;
[neopixel my_neopixel_2]&lt;br /&gt;
pin: ar100:PH6&lt;br /&gt;
&lt;br /&gt;
[static_digital_output es1_direction]&lt;br /&gt;
pins: !PB3&lt;br /&gt;
&lt;br /&gt;
[static_digital_output es2_direction]&lt;br /&gt;
pins: !PB6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also [[Relit_A0]]&lt;br /&gt;
&lt;br /&gt;
==RC Servo==&lt;br /&gt;
&amp;lt;div class=&amp;quot;img-res&amp;quot;&amp;gt;&lt;br /&gt;
[[File:RC-servo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Endstop 1 and 2 can be used as PWM outputs with 5V levels. Rev A6 is the first board with support for this. &lt;br /&gt;
More testing and configuration documentation is needed.&lt;br /&gt;
&lt;br /&gt;
==Filament runout sensor==&lt;br /&gt;
&amp;lt;div class=&amp;quot;img-res&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Filament-runout-sensor.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Any of the 6 end stops can be used for connecting a filament runout sensor&lt;br /&gt;
&lt;br /&gt;
=Software for Recore=&lt;br /&gt;
Recore comes with the Linux distro Rebuild (Armbian) pre-installed on the eMMC. &lt;br /&gt;
For more instructions about software for Recore, see the Rebuild wiki page: &lt;br /&gt;
[[ Rebuild ]]&lt;br /&gt;
&lt;br /&gt;
=== AR100 ===&lt;br /&gt;
Please see: [[AR100]]&lt;br /&gt;
&lt;br /&gt;
=== Manual control and testing ===&lt;br /&gt;
https://wiki.iagent.no/wiki/Manual_control_and_testing&lt;br /&gt;
&lt;br /&gt;
=Performance=&lt;br /&gt;
===Start-up time===&lt;br /&gt;
With a maximum clock for MMC2 of 200 MHz, here is the start-up time: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# systemd-analyze&lt;br /&gt;
Startup finished in 3.011s (kernel) + 12.292s (userspace) = 15.303s &lt;br /&gt;
graphical.target reached after 11.934s in userspace&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===eMMC read and write speed===&lt;br /&gt;
eMMC write speed: 65.2 MB/s&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# dd if=/dev/random of=/dev/mmcblk2 bs=1M count=1000                                                       &lt;br /&gt;
1000+0 records in&lt;br /&gt;
1000+0 records out&lt;br /&gt;
1048576000 bytes (1.0 GB, 1000 MiB) copied, 16.0853 s, 65.2 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eMMC read speed: 111 MB/s&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# dd if=/dev/mmcblk2 of=/dev/null bs=1M count=1000&lt;br /&gt;
1000+0 records in&lt;br /&gt;
1000+0 records out&lt;br /&gt;
1048576000 bytes (1.0 GB, 1000 MiB) copied, 9.42715 s, 111 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===USB read and write speed===&lt;br /&gt;
Software: Reflash v1.0.1&amp;lt;br&amp;gt;&lt;br /&gt;
Disk: WD Elements SE&amp;lt;br&amp;gt;&lt;br /&gt;
USB write speed:  31.0 MB/s&amp;lt;br&amp;gt;&lt;br /&gt;
USB read speed: 33.0 MB/s&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# dd if=/dev/zero of=/mnt/usb/random.bin bs=1M count=1000 conv=fsync&lt;br /&gt;
1000+0 records in&lt;br /&gt;
1000+0 records out&lt;br /&gt;
1048576000 bytes (1.0 GB, 1000 MiB) copied, 33.8744 s, 31.0 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# dd if=/mnt/usb/random.bin of=/dev/null&lt;br /&gt;
2048000+0 records in&lt;br /&gt;
2048000+0 records out&lt;br /&gt;
1048576000 bytes (1.0 GB, 1000 MiB) copied, 31.7393 s, 33.0 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Measured voltages==&lt;br /&gt;
The final stages of Recore manufacturing consists of testing, calibration and flashing of firmware. &lt;br /&gt;
The calibration stage measures a number of voltages on the board and classifies the input stages gain and offset. &lt;br /&gt;
&lt;br /&gt;
====5V Buck converter ripple and noise ====&lt;br /&gt;
The 5V step down/Buck converter is a AOZ2153EQI-30. It can provide 8A and has an input voltage range of 12-28V. &lt;br /&gt;
&lt;br /&gt;
Below is a screenshot of the ripple and noise across the  the 5V rail with a normal kernel running and pulling 4 A from the USB and with 6 Neopixels connected. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:A8 5V ripple.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Input stage===&lt;br /&gt;
When drawing a constant current of 20 A from the bed connector with and without any forced convection. The temperature measured was with the on board thermistor. Using a thermal camera, the temperature displayed matches well with the temperature reported by the camera. The maximum board temperature of 100 degrees C is reached after about 10 minutes with no forced convection. &lt;br /&gt;
Ambient temperature in the room: 20.1 degrees C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Input stage temperature no fan.png|A7 Input stage temperature no fan]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With forced convection (a 92 mm Noctua fan) and a current load of 29 A, the maximum temperature reached after 10 minutes was 87.7 degrees C as measured by the on board thermistor. The thermal camera showed a higher temperature of 98 degrees. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Input stage temperature with fan crop.png|Input stage temperature with fan]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Maximum input voltage ====&lt;br /&gt;
Using 1.5 m test leads and a 26 V bench top PSU (Agilent U8002A) a board has been tested for over voltage issues. This was a problem with Rev A6. No issues were found during testing. &lt;br /&gt;
&lt;br /&gt;
====Inrush current====&lt;br /&gt;
During turn on of the high power stage, there will be an inrush current to charge up the bank of capacitors present on the board. &lt;br /&gt;
If no loads are turned on, the inrush current reaches 28 A at peak, depending on PSU and cables. This is important to consider when setting the current limit with device tree. Below is a trace of the current draw of Recore A7 when the input is enabled. The PSU in use was a PeakTech 6160 (30V/30A) benchtop switchmode PSU. The cables used were Pomona B-24-0 and B-24-2, 24&amp;quot; 18 AWG banana plug test leads.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:A8 inrush current.png|center]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Over current protection====&lt;br /&gt;
There are 3 different sensors present in the input stage for making sure the 12-24 V domain on the board does not overheat during startup and operation. &lt;br /&gt;
# The Fast acting over current protection is to ensure that the high power domain is disabled in the case of a short circuit condition. &lt;br /&gt;
# The current limit set in Klipper monitors the continuous current draw. This is now set at 20 A, but can go up to 30 A and still be within the limits of the connectors and input stage mosfets. &lt;br /&gt;
# The over temperature protection monitors the temperature in the input stage and cuts the power if the temperature goes over 110 degrees. The board should not be kept at this temperature for a prolonged period, but during heated bed heat-up, it can be elevated compared to the rest of the print.&lt;br /&gt;
&lt;br /&gt;
Below is a plot of what the current on the input looks like if there is an over current condition on the high power domain as that domain is turned on. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:A7 over current input turns on.png|center]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a plot of what the current on the input looks like if there is an over current condition after the input has been turned on. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:A7 over current output turns on.png|center]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ADC offset and gain measurements===&lt;br /&gt;
To measure the ADC offset error, measure the voltage on the uC input pin and record when the &lt;br /&gt;
transition from 0 to 1 occurs. It should occur at 0.5 LSB = 3.3/4096/2 = 0.4028 mV. &lt;br /&gt;
Offset: 55.35 mV - 0.4028 mV = 54.95 mV&lt;br /&gt;
&lt;br /&gt;
==Temperature calibration==&lt;br /&gt;
A set of experiments have been carried out to calibrate the different sensors using a dry-well calibrator. &lt;br /&gt;
The reference probe was a Sensing Devices SDL385 PRT. &lt;br /&gt;
The levels of calibration was: room temperature, 50, 100, 150, and 200 degrees C.&lt;br /&gt;
&lt;br /&gt;
===Thermistor===&lt;br /&gt;
The thermistor in use was a standard EPCOS 100K B57560G104F. This thermistor has a resistance tolerance of 2 %. The value of the pull-up resistor as measured during calibration was 4740.17501. This value seemed to work well at all levels of calibration, although a little on the high side compared to the reference. &lt;br /&gt;
&lt;br /&gt;
===PT1000===&lt;br /&gt;
The PT1000 in use was a Heraeus 31500989 [https://www.heraeus.com/media/media/hne/datasheets/sensor_assemblies_1/Heraeus_W-EYK_Sensor_E.pdf] works well. The tolerance class given in the datasheet is &amp;quot;F 0.10 / Class 1/3 B&amp;quot;. There are two different tolerances here: F0.10 and one third of Class B. The accuracy looks good at all temperatures, perhaps a bit on the high side if using the calibrated value for the pull-up. During the testing, 10 ohm was subtracted from the calibrated value.&lt;br /&gt;
&lt;br /&gt;
===PT100===&lt;br /&gt;
The PT100 used in the calibration was the E3D PT100 with the INA826 amplifier board. There is no datasheet available for the PT100 sensor and no mention of what tolerance there is on the reference resistors used. Furthermore Klipper expects the reference voltage to be 5V exactly, and there is no way to supply a measured value. Measurements on Recore has shown that the value is often a bit lower due to the PMIC for the 5V output on the &amp;quot;input&amp;quot; ports. 4.979 V has been measured and is likely an expected value.&lt;br /&gt;
&lt;br /&gt;
===Thermocouple===&lt;br /&gt;
Using the calibration values directly will give a slight offset to the thermocouple measurements. &lt;br /&gt;
The gain and ADC voltage can be used as measured during calibration. It should be in the region of 101 for gain and 3.307 for ADC voltage. As for the offset, that can be increased slightly to compensate for the cold junction temperature difference. For instance, the measured offset for the test board was 0.0032960, but a value of 0.00340 fit the data points well. The measurements were done on T2, so it it possible that the distance from the cold junction caused the offset. The cold junction thermistor is located between T0 and T1.&lt;br /&gt;
&lt;br /&gt;
=FAQ=&lt;br /&gt;
====Where can I ask for help?====&lt;br /&gt;
:You can join the Discord: https://discord.gg/bCnp9H5SB5&lt;br /&gt;
====What comes in the box with the Recore? Specifically, terminal connectors for power, etc?====&lt;br /&gt;
:It&#039;s only the board, no cables or connectors. There is a bag of connectors available to purchase in the web shop.&lt;br /&gt;
====Do I need access to those 4 buttons on the board?====&lt;br /&gt;
:It is not necessary to have access to the 4 buttons for normal use.&lt;br /&gt;
&lt;br /&gt;
====What&#039;s the maximum current draw for heat bed?====&lt;br /&gt;
:This has been tested up to 30 A with good cooling using a fan and a heat sink.&lt;br /&gt;
&lt;br /&gt;
====I have a gadget that I want to connect with SPI. Is that possible?====&lt;br /&gt;
:On Recore A8, there is support for an SPI peripheral. The pins are broken out on header S6/S7.&lt;br /&gt;
&lt;br /&gt;
====What exactly is the role of the AR100 device?====&lt;br /&gt;
:The AR100 handles the fast real-time aspects, mainly the stepper motors and end stops.&lt;br /&gt;
&lt;br /&gt;
====What voltage fans are supported?====&lt;br /&gt;
:The same voltage as the input voltage, either 12 V or 24 V. You can experiment with PWM for running lower voltage fans on 24 V input.&lt;br /&gt;
====Where is the board layout file?====&lt;br /&gt;
:The Layout file will not be available. It is an &amp;quot;open schematic&amp;quot; board, not open source hardware&lt;br /&gt;
====Where are you shipping from?====&lt;br /&gt;
:Boards are shipping from Norway. Eventually shipping will be from a warehouse in the US&lt;br /&gt;
&lt;br /&gt;
= Known hardware issues for rev A8=&lt;br /&gt;
* ENN for steppers does not have a pull-up resistor, so the steppers are enabled once power is applied. (This can be fixed with a software workaround.)&lt;br /&gt;
* Using the boot button to start the board from a shut down state does not always start the board. A workaround is to either shut it off again, press the RST button or remove power and then re-apply power. &lt;br /&gt;
* The USB drivers in u-boot seem to have some trouble with certain boards and emit the error message&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EHCI timed out on TD - token=0xXXXXXXXX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Applying the VIN voltage after the board has been booted via USB can cause an instant shutdown. &lt;br /&gt;
&lt;br /&gt;
==List of changes from A7 to A8==&lt;br /&gt;
* Use JST 2 mm connectors. &lt;br /&gt;
* Add enable pin on stepper motors  &lt;br /&gt;
* 8 layer PCB  &lt;br /&gt;
* Higher current 5V step down (AOZ2153EQI-30 8A)  &lt;br /&gt;
* Reduce clearance from 0.15 to 0.1 on ground layers  &lt;br /&gt;
* Recalculated transmission line impedances for lower Radiated emission  &lt;br /&gt;
* Add more decoupling capacitors on CPUX node  &lt;br /&gt;
* Add USB-button  &lt;br /&gt;
* USB1 and USB2 can now draw much more current&lt;br /&gt;
* Add Mipi VCC  &lt;br /&gt;
* Terminating resistor for CK on DDR3  &lt;br /&gt;
* Move AXP803 to make room for larger HDMI trace distances.  &lt;br /&gt;
* Faster level shifter for using Neopixels. &lt;br /&gt;
* Fatter VREF traces on DDR3&lt;br /&gt;
* Fix FUSB pin usage.&lt;br /&gt;
* Less inrush current&lt;br /&gt;
* Lower minimum current limit to 17.5 A (max: 82.5)&lt;br /&gt;
* SBU pins connected on USB-C connector&lt;br /&gt;
&lt;br /&gt;
= Migrating Klipper config from A7 to A8 =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|[tmc2209 stepper_x]&lt;br /&gt;
|-&lt;br /&gt;
|Before&lt;br /&gt;
|After&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|enable_pin: !ar100:PL12&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Recore_A7&amp;diff=1678</id>
		<title>Recore A7</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Recore_A7&amp;diff=1678"/>
		<updated>2026-10-09T12:09:13Z</updated>

		<summary type="html">&lt;p&gt;Elias: OFFSET-T2 is PG2 (GPIO 194), not PG3: PG3 is UC-INT-1 (checked against the schematics&amp;#039; netlists)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Recore header.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Recore is a 3D-printer control board running Linux. It is specifically tailored to be compatible with Klipper and OctoPrint. The main features are: &lt;br /&gt;
* Allwinner A64 SoC, quad core CPU running at 1 GHz. &lt;br /&gt;
* 1 GB of DDR3 RAM&lt;br /&gt;
* 8 GB of on board eMMC &lt;br /&gt;
* Gigabit Ethernet&lt;br /&gt;
* 6 TMC2209, 2 A stepper motor drivers&lt;br /&gt;
* 3 heater outputs + high power heated bed&lt;br /&gt;
* 4 USB High Speed ports &lt;br /&gt;
* 4 thermistor/thermocouple inputs (software selectable)&lt;br /&gt;
* Comes with Debian Linux with Klipper and OctoPrint or MainSail installed&lt;br /&gt;
&lt;br /&gt;
This document is for Recore Revision A7. For previous hardware revisions, please see:  &lt;br /&gt;
* [[Recore_A6]]&lt;br /&gt;
* [[Recore_A5]]&lt;br /&gt;
* [[Recore_A4]]&lt;br /&gt;
* [[Recore_A3]]  &lt;br /&gt;
* [[Recore_A2]]&lt;br /&gt;
&lt;br /&gt;
==Availability==&lt;br /&gt;
Recore A7 can be purchased from the iagent web shop [https://www.iagent.no/product/recore/ https://www.iagent.no/product/recore/]&lt;br /&gt;
&lt;br /&gt;
Or at Fabreeko [https://www.fabreeko.com/products/recore-a7-by-iagent https://www.fabreeko.com/products/recore-a7-by-iagent]&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
Recore is &amp;quot;open schematic&amp;quot;, it is available here: [https://github.com/intelligent-agent/Recore/blob/master/Schematics/Recore_A7.pdf https://github.com/intelligent-agent/Recore/blob/master/Schematics/Recore_A7.pdf]&lt;br /&gt;
==3D model==&lt;br /&gt;
A STEP file of the PCB with components is available here: [https://github.com/intelligent-agent/Recore/blob/master/3D-files/Recore_A7.step https://github.com/intelligent-agent/Recore/blob/master/3D-files/Recore_A7.step]&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Recore A7 pinout.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A64==&lt;br /&gt;
The Allwinner A64 is a quad core Cortex A53 clocked at 1 GHz. It has an integrated RISC CPU (AR100) clocked at 300 MHz that handles the real time aspect for the 3D-printer. In the following table the pins used for End-stops and stepper control are described. &lt;br /&gt;
The &amp;quot;bank and pin&amp;quot; can be used to specify the pin numbers in klipper. &lt;br /&gt;
The &amp;quot;Number&amp;quot; column is useful for testing things on the command line in conjunction with gpiod.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&lt;br /&gt;
! Name !! Bank and pin !!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number !! Name !! Bank and pin !!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number !! Name !! Bank and pin !! Number&lt;br /&gt;
|-&lt;br /&gt;
| STEP 0 || PL4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 4 || END STOP 0 || PH4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;|228 || OC-ALERT || PF6 || 166&lt;br /&gt;
|-&lt;br /&gt;
| STEP 1 || PL5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 5 || END STOP 1 || PH5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 229 || OC-RESET || PF4 || 164&lt;br /&gt;
|-&lt;br /&gt;
| STEP 2 || PL6 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 6 || END STOP 2 || PH6 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 230 || EN-HP || PF5 || 165&lt;br /&gt;
|-&lt;br /&gt;
| STEP 3 || PL7 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 7 || END STOP 3 || PH7 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 231 || UC-INT-1 || PG3 || 195&lt;br /&gt;
|-&lt;br /&gt;
| STEP 4 || PL8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 8 || END STOP 4 || PH8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 232 || UC-NRST || PG4 || 196&lt;br /&gt;
|-&lt;br /&gt;
| STEP 5 || PL9 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 9 || END STOP 5 || PH9 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 233 || UC-BOOT || PG5 || 197&lt;br /&gt;
|-&lt;br /&gt;
| STEP 6 || PL10 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 10 || GAIN-ENABLE-T0 || PD4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 100 || ES-EN-12V || PF0 || 160&lt;br /&gt;
|-&lt;br /&gt;
| STEP 7 || PL11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 11 || GAIN-ENABLE-T1 || PH11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 235 || EN-THERMISTORS || PF1 || 161&lt;br /&gt;
|-&lt;br /&gt;
| DIR 0 || PE8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 136 || GAIN ENABLE T2 || PE17 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 145 || EN-ENDSTOPS || PF2 || 162&lt;br /&gt;
|-&lt;br /&gt;
| DIR 1 || PE9 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 137 || GAIN ENABLE T3 || PB2 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 34 || USR || PF3 || 163&lt;br /&gt;
|-&lt;br /&gt;
| DIR 2 || PE10 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 138 || PU-ENABLE-T0 || PG10 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 202 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| DIR 3 || PE11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 139 || PU-ENABLE-T1 || PG11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 203 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| DIR 4 || PE12 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 140 || PU ENABLE T2 || PG12 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 204 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| DIR 5 || PE13 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 141 || PU ENABLE T3 || PG13 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 205 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| DIR 6 || PE14 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 142 || OFFSET-T0 || PG0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 192 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| DIR 7 || PE15 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 143 || OFFSET-T1 || PG1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 193 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 0 || PE0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 128 || OFFSET-T2 || PG2 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 194 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 1 || PE1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 129 || OFFSET-T3 || PG8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 200 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 2 || PE2 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 130 || STEPPER UART 0-3 || PE16 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 144 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 3 || PE3 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 131 || STEPPER UART 4-5 || PD24 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 120 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 4 || PE4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 132 || STEPPER UART 6 || PD2 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 98 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 5 || PE5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 133 || STEPPER UART 7 || PD3 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 99 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 6 || PD0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 96 ||  ||  ||style=&amp;quot;border-right:solid 2px;&amp;quot;|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 7 || PD1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 97 ||  ||  ||style=&amp;quot;border-right:solid 2px;&amp;quot;|  ||  ||  || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==STM32F031==&lt;br /&gt;
The STM32 is a Cortex M0 powered micro controller handling analog inputs and PWM outputs. It does not control any hard real time aspects of the print, that is handled by the AR100 core realized as a separate core in the A64 SoC. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&lt;br /&gt;
! Name !! Bank and pin !!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number !! Name !! Bank and pin !!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number !! Name !! Bank and pin !! Number&lt;br /&gt;
|-&lt;br /&gt;
| HEATER E0 || PA8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 18 || THERMISTOR 0 || PA0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 6 || ES1-PWM-OUT || PB3 || 26&lt;br /&gt;
|-&lt;br /&gt;
| HEATER E1 || PA9 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 19 || THERMISTOR 1 || PA1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 7 || PWM-ES2-OUT || PB6 || 29&lt;br /&gt;
|-&lt;br /&gt;
| HEATER E2 || PA10 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 20 || THERMISTOR 2 || PA2 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 8 || EXT 1 || PB7 || 30&lt;br /&gt;
|-&lt;br /&gt;
| HEATER BED || PA11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 21 || THERMISTOR 3 || PA3 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 9 || EXT 2 || PB8 || 32&lt;br /&gt;
|-&lt;br /&gt;
| FAN 0 || PF0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 2 || BOARD VOLTAGE || PA4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 10 || EXT 3 || PA13 || 23&lt;br /&gt;
|-&lt;br /&gt;
| FAN 1 || PB1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 15 || BOARD CURRENT || PA5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 11 || EXT 4 || PB2 || 16&lt;br /&gt;
|-&lt;br /&gt;
| FAN 3 || PB4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 27 || BOARD TEMPERATURE || PA6 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 12 || USER LED || PA12 || 22&lt;br /&gt;
|-&lt;br /&gt;
| FAN 2 || PB5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 28 || COLD JUNCTION || PA7 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 13 || FAN_CURRENT || PB0 || 14&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==DBG header==&lt;br /&gt;
The debug header has UART 0 layed out on some of the pins and is used for interacting with u-boot and getting early debug messages from the Linux kernel. It also has a the option to connect a &amp;quot;boot&amp;quot; button so the board can be safely started and shut down from the 3D-printers front panel. The USR pin can be used to light up a an LED or some other custom function. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Pin&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|UART RX&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|UART TX&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|3.3V&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|BOOT&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|USR&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to wire up a boot button so it is accessible from the outside of the printer. This would be the preferred way to start and stop the board. It works the same way as a boot button on any moderns computer does. Press once to shut down a running board, and press and hold for two seconds in order to boot a board. The button should be wired up between the &amp;quot;NO&amp;quot; and &amp;quot;COM&amp;quot; on the button. The light in the button can be connected between +3.3V and the &amp;quot;USR&amp;quot; on the header. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:DBG header.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==MCU header==&lt;br /&gt;
The MCU header is used for connecting external peripherals to the STM32F031 micro controller on the board. There are 4 pins in total available to use. In addition, there is a ground pin and a 3.3 V pin available. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Pin&lt;br /&gt;
!Function&lt;br /&gt;
!Alt&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|PB7&lt;br /&gt;
|I2C1_SDA&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|PB8&lt;br /&gt;
|I2C1_SCL&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|3.3V&lt;br /&gt;
|0.7-3.3V&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|PA13&lt;br /&gt;
|EXTI 13&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|PB2&lt;br /&gt;
|EXTI 2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==SPI on S6 and S7 headers==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:S6 S7 headers.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Pin&lt;br /&gt;
!Function&lt;br /&gt;
!Alt&lt;br /&gt;
|-&lt;br /&gt;
|S6-3&lt;br /&gt;
|PD0&lt;br /&gt;
|SPI1_CS&lt;br /&gt;
|-&lt;br /&gt;
|S7-3&lt;br /&gt;
|PD1&lt;br /&gt;
|SPI1_CLK&lt;br /&gt;
|-&lt;br /&gt;
|S6-5&lt;br /&gt;
|PD2&lt;br /&gt;
|SPI1_MOSI&lt;br /&gt;
|-&lt;br /&gt;
|S7-5&lt;br /&gt;
|PD3&lt;br /&gt;
|SPI1_MISO&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===LEDs===&lt;br /&gt;
There are 15 white LEDs on the board. Here is what they mean&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Location&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|D2&lt;br /&gt;
|By PMIC&lt;br /&gt;
|Board powered&lt;br /&gt;
|-&lt;br /&gt;
|D3&lt;br /&gt;
|By heater BED &lt;br /&gt;
|BED output on&lt;br /&gt;
|-&lt;br /&gt;
|D4&lt;br /&gt;
|By fan 0&lt;br /&gt;
|Fan 0 is on&lt;br /&gt;
|-&lt;br /&gt;
|D5&lt;br /&gt;
|By fan 1&lt;br /&gt;
|Fan 1 is on&lt;br /&gt;
|-&lt;br /&gt;
|D6&lt;br /&gt;
|By heater H2&lt;br /&gt;
|Heater H2 is on&lt;br /&gt;
|-&lt;br /&gt;
|D7&lt;br /&gt;
|By fan 2&lt;br /&gt;
|Fan 2 is on&lt;br /&gt;
|-&lt;br /&gt;
|D8&lt;br /&gt;
|By heater H0&lt;br /&gt;
|Heater H0 is on&lt;br /&gt;
|-&lt;br /&gt;
|D9&lt;br /&gt;
|By fan 3&lt;br /&gt;
|Fan 3 is on&lt;br /&gt;
|-&lt;br /&gt;
|D10&lt;br /&gt;
|By heater H1&lt;br /&gt;
|Heater H1 is on&lt;br /&gt;
|-&lt;br /&gt;
|D12&lt;br /&gt;
|By input connector&lt;br /&gt;
|High voltage domain is on&lt;br /&gt;
|-&lt;br /&gt;
|D15&lt;br /&gt;
|By eMMC chip&lt;br /&gt;
|eMMC activity&lt;br /&gt;
|-&lt;br /&gt;
|D17&lt;br /&gt;
|By USB hub chip&lt;br /&gt;
|USB activitiy&lt;br /&gt;
|-&lt;br /&gt;
|D18&lt;br /&gt;
|By the USB C connector&lt;br /&gt;
|Linux Heartbeat&lt;br /&gt;
|-&lt;br /&gt;
|D19&lt;br /&gt;
|By the A64 SoC&lt;br /&gt;
|CPU activity&lt;br /&gt;
|-&lt;br /&gt;
|D20&lt;br /&gt;
|By the STM32&lt;br /&gt;
|Klipper running on STM32&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Buttons===&lt;br /&gt;
There are 3 push buttons on the board. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|FEL&lt;br /&gt;
|Enter FEL-mode of the A64&lt;br /&gt;
|-&lt;br /&gt;
|BOOT&lt;br /&gt;
|Boots or shuts down the board&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|Hard reset of the CPU&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Current limits==&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
The amount of current that can be drawn on the two USB host connectors closest to the HDMI connector is not according to spec. The combined current draw for USB 1 and 2 should not exceed 0.4 A. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name&lt;br /&gt;
!Limit&lt;br /&gt;
|-&lt;br /&gt;
|5V-ES (endstops)&lt;br /&gt;
|0.75 A&lt;br /&gt;
|-&lt;br /&gt;
|USB host 3 and 4 each (5VP)&lt;br /&gt;
|1.1 A&lt;br /&gt;
|-&lt;br /&gt;
|USB host 1 and 2 each (VSP)&lt;br /&gt;
|0.75 A&lt;br /&gt;
|-&lt;br /&gt;
|Thermistors&lt;br /&gt;
|0.75 A&lt;br /&gt;
|-&lt;br /&gt;
|MCU connector&lt;br /&gt;
|0.5 A&lt;br /&gt;
|-&lt;br /&gt;
|Fan connectors&lt;br /&gt;
|programmable&lt;br /&gt;
|-&lt;br /&gt;
|Heater connectors&lt;br /&gt;
|programmable&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Wiring=&lt;br /&gt;
Below is a wiring diagram meant to aid in connecting motors, fans, extruders and hot ends to the control board. On the board, there is a small + sign next to output connectors where polarity is important. If passive heating elements are used, polarity is not important, but if those outputs are to be used with SSRs or relays, polarity must be observed. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Rewire-Recore-A7.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Network connection==&lt;br /&gt;
Recore is designed to be controlled through a browser on a computer, so the board must be connected to the local LAN or wifi network. Connect an ethernet cable between the board and a switch. The ping utility can be used to ensure that the board is discovered on the network.&lt;br /&gt;
&lt;br /&gt;
===LAN setup===&lt;br /&gt;
Recore with Refactor is running avahi and should announce itself on the network once a connection has been established. On a Linux based host computer, it is possible to search for a booted device using the following command: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ping recore.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If the device is present, an SSH connection can be established:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh debian@recore.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Furthermore, a web interface running OctoPrint/Mainsail/Fluidd can be found using a browser:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
http://recore.local&lt;br /&gt;
&lt;br /&gt;
For more information on this, look at the Rebuild or Refactor wiki pages.&lt;br /&gt;
&lt;br /&gt;
==Wifi setup==&lt;br /&gt;
Wifi can be set up by connecting a wifi dongle to one of the USB host ports. Once the USB dongle has been connected, and the board has been booted, access to the terminal command line can be given through a host computer. The board should appear as a TTY ACM device. On a Linux based host computer, the terminal program `minicom` can be used to get access. From the host computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
minicom -o -D /dev/ttyACM0 115200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the host computer is running Windows, [https://www.putty.org/ Putty] can be used to get access. &lt;br /&gt;
&lt;br /&gt;
Once a connection has been established, the wifi network can be set up using the command nmtui. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nmtui&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Follow the instructions on screen to edit and activate the wifi connection. &lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
If the board is powered through the USB C connector, only the two USB host ports next to the HDMI port is powered. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mating Connectors==&lt;br /&gt;
The power connectors on the board are available either in the web shop as part of a [https://www.iagent.no/product/connector-pack/ connector pack] or directly from Digi-key etc.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt; &lt;br /&gt;
[[File:Connectors-all.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Four pin male: TBP01P1-508-04BE [[https://www.digikey.com/en/products/detail/cui-devices/TBP01P1-508-04BE/10238369 | Digi-key]]&lt;br /&gt;
&lt;br /&gt;
Two pin male: TBP01P1-508-02BE [[https://www.digikey.com/en/products/detail/cui-devices/TBP01P1-508-02BE/10238367 | Digi-key]]&lt;br /&gt;
&lt;br /&gt;
=Klipper Configuration=&lt;br /&gt;
There are no jumpers on Recore and no hard fuses. Everything is software configurable and resettable from software. This gives great power and flexibility without requiring physical access to the board once it has been installed. But with great power comes great responsibility. It is possible to break things if care is not taken during setup. There is one setting in particular that is worth mentioning: ES0 can have either +5V or +12V on the power pin. This is in order to allow a standard industrial inductive sensor to be used on that end stop. If a 5V only peripheral is connected, that could damage the connected peripheral. &lt;br /&gt;
&lt;br /&gt;
The default config file for Recore A6 can be found in the repository: [https://github.com/intelligent-agent/klipper/blob/master/config/generic-recore-a7.cfg generic-recore-a7.cfg]&lt;br /&gt;
&lt;br /&gt;
===TMC2209===&lt;br /&gt;
The 6 stepper drivers on Recore are of type TMC2209 from Trinamic. Each stepper has a configuration interface with a bidirectional UART port that is connected to a pin on the A64. The GPIO bit-banging functionality of Klipper is used to communicate with the stepper drivers. &lt;br /&gt;
&lt;br /&gt;
Here is a table with pins and addresses for the steppers&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Stepper driver config&lt;br /&gt;
|-&lt;br /&gt;
|Name&lt;br /&gt;
|Pins&lt;br /&gt;
|Address&lt;br /&gt;
|-&lt;br /&gt;
|S0&lt;br /&gt;
|PE16&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|S1&lt;br /&gt;
|PE16&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|S2&lt;br /&gt;
|PE16&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|S3&lt;br /&gt;
|PE16&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|S4&lt;br /&gt;
|PD24&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|S5&lt;br /&gt;
|PD24&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|S6&lt;br /&gt;
|PD2&lt;br /&gt;
|0-3&lt;br /&gt;
|-&lt;br /&gt;
|S7&lt;br /&gt;
|PD3&lt;br /&gt;
|0-3&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== External stepper drivers ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Ext-driver.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
It is possible to connect up to two external stepper drivers to Recore in addition to the 6 divers installed on the board. &lt;br /&gt;
These can be connected using the headers S6 and S7.&lt;br /&gt;
&lt;br /&gt;
See also [[Restep_A1]] for a convenient alternative external stepper driver.&lt;br /&gt;
&lt;br /&gt;
==Temperature inputs==&lt;br /&gt;
4 different temperature devices can be connected to the 4 analog inputs on Recore. Thermistor, Thermocouple, PT100 with INA826 and PT1000 without the use of a pre-amplifier.&lt;br /&gt;
===Thermistor===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Thermistor.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Make sure the pull-up is enabled and the op-amp gain is set to 1.&lt;br /&gt;
&lt;br /&gt;
===Thermocouple===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Thermocouple.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure the pull-up is disabled and the op-amp gain is set to 100.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[recore]&lt;br /&gt;
...&lt;br /&gt;
gain_t0: 100&lt;br /&gt;
pullup_t0: 0&lt;br /&gt;
offset_t0: 1&lt;br /&gt;
&lt;br /&gt;
[Extruder]&lt;br /&gt;
...&lt;br /&gt;
sensor_type: Type K&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===PT100 with INA826===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:PT100.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to use a PT100 sensor, an external amplifier board must be used. There is an example configuration for Klipper that &lt;br /&gt;
uses this. The ADC reference voltage is 5.0 by default, but for Recore it is 3.3 V. Here is an example:  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Extruder]&lt;br /&gt;
...&lt;br /&gt;
sensor_type: PT100 INA826&lt;br /&gt;
adc_voltage: 3.27&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The pull-up must also be disabled.&lt;br /&gt;
&lt;br /&gt;
===PT1000===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:PT1000.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Make sure the pull-up is enabled and the gain is set to 1. In the latest version, the sensor must be prefixed with RECORE. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Extruder]&lt;br /&gt;
...&lt;br /&gt;
sensor_type: PT1000&lt;br /&gt;
pullup_resistor: 4750&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Connecting other sensors=&lt;br /&gt;
The board has been designed to work with a range of 3rd party sensors for automating the print.&lt;br /&gt;
==BLtouch==&lt;br /&gt;
There are two versions of the BLtouch, the difference is the color of one of the GND wires. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Antclabs BLtouch sensor wiring.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The Creality version has a blue GND wire. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Creality BLtouch sensor wiring.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
There have been some cases of bad quality control for the Creality BLTouches, where the pinout on the sensor side have not matched the color coding in the photos/documentation. It might be good to make sure the color codes match up. For the Creality it should be, from left to right: &lt;br /&gt;
Blue, red, yellow, black, white. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When connected per wiring diagram above, setting up BLtouch can be done by adding the following section to printer.cfg.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bltouch]&lt;br /&gt;
sensor_pin: ar100:PH6&lt;br /&gt;
control_pin: !PB3&lt;br /&gt;
speed:15&lt;br /&gt;
samples:1&lt;br /&gt;
pin_move_time: 0.675&lt;br /&gt;
sample_retract_dist: 10&lt;br /&gt;
probe_with_touch_mode: true&lt;br /&gt;
stow_on_each_sample: false&lt;br /&gt;
x_offset:29.2&lt;br /&gt;
y_offset:-34&lt;br /&gt;
z_offset:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Inductive Sensor ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Inductive sensor wiring 2.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Connect the inductive sensor on ES0. You can choose either 5V or 12V output on the voltage pin. Inductive sensors often come with an industry standard voltage input of 6-36 V. For this reason there is a 12 V LDO (Low drop-out) voltage regulator integrated on the board. This voltage regulator can be output on the V+ pin of the connector marked ES0. If the Input to the board is 12 V, the LDO will supply a lower voltage, around 10.6 or so.&lt;br /&gt;
&lt;br /&gt;
==ADXL345==&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
The ADXL345 seems to cause Klipper to shut down when trying to calibrate at a high rate. A workaround is to use a Pi Pico or similar MCU to communicate with the ADXL345, or to lower the rate. It&#039;s been tested working at 400, but not 800 which is the recommended minimum. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
See also [[Remove_A1]], a convenient finished accelerometer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt; &lt;br /&gt;
[[File:Wiring.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A popular accelerometer sensor for doing input shaping with Klipper is the ADXL345. This can be connected to the connectors S6/S7. There is no hardware SPI interface available, but a software implementation in Klipper exists. &lt;br /&gt;
Note: Only experimental support has been tested for this. &lt;br /&gt;
https://learn.adafruit.com/adxl345-digital-accelerometer&lt;br /&gt;
&lt;br /&gt;
Config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[adxl345]&lt;br /&gt;
cs_pin: ar100:PL11&lt;br /&gt;
spi_software_sclk_pin: ar100:PL10&lt;br /&gt;
spi_software_mosi_pin: ar100:PE15&lt;br /&gt;
spi_software_miso_pin: ar100:PE14&lt;br /&gt;
rate: 400&lt;br /&gt;
&lt;br /&gt;
[resonance_tester]&lt;br /&gt;
accel_chip: adxl345&lt;br /&gt;
probe_points:&lt;br /&gt;
    100, 100, 20  # an example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using a Raspberry Pi Pico:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[adxl345]&lt;br /&gt;
cs_pin: pico:gpio17&lt;br /&gt;
spi_bus: spi0c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==MCP2515==&lt;br /&gt;
It&#039;s possible to connect a CAN controller like the MCP2515 to Recore.&lt;br /&gt;
It&#039;s important to keep in mind that the GPIO/SPI pins are 3.3V and not 5V tolerant, so the MCP2515 chip must be run from a 3.3V source, while the TIA1050 chip must be powered with 5V. All headers have pin 1 marked as a square pad, while the others are round. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MCP2515&lt;br /&gt;
!Recore&lt;br /&gt;
|-&lt;br /&gt;
|5V&lt;br /&gt;
|ES1-3&lt;br /&gt;
|-&lt;br /&gt;
|3.3V&lt;br /&gt;
|MCU-3&lt;br /&gt;
|-&lt;br /&gt;
|GND&lt;br /&gt;
|MCU-4&lt;br /&gt;
|-&lt;br /&gt;
|INT&lt;br /&gt;
|S6-1&lt;br /&gt;
|-&lt;br /&gt;
|SPI1_CS&lt;br /&gt;
|S6-3&lt;br /&gt;
|-&lt;br /&gt;
|SPI1_CLK&lt;br /&gt;
|S6-5&lt;br /&gt;
|-&lt;br /&gt;
|SPI1_MOSI&lt;br /&gt;
|S7-3&lt;br /&gt;
|-&lt;br /&gt;
|SPI1_MISO&lt;br /&gt;
|S7-5&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Neopixels ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Neopixels wiring A7.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use endstop ES1 (PB3) or ES2 (PB6). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
Make sure to use a 100 ohm pull-up from pin S (pin 2) to pin 5V (pin 3) &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[neopixel my_neopixel]&lt;br /&gt;
pin: PB3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also [[Relit_A0]]&lt;br /&gt;
&lt;br /&gt;
==RC Servo==&lt;br /&gt;
&amp;lt;div class=&amp;quot;img-res&amp;quot;&amp;gt;&lt;br /&gt;
[[File:RC-servo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Endstop 1 and 2 can be used as PWM outputs with 5V levels. Rev A6 is the first board with support for this. &lt;br /&gt;
More testing and configuration documentation is needed.&lt;br /&gt;
&lt;br /&gt;
==Filament runout sensor==&lt;br /&gt;
&amp;lt;div class=&amp;quot;img-res&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Filament-runout-sensor.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Any of the 6 end stops can be used for connecting a filament runout sensor&lt;br /&gt;
&lt;br /&gt;
=== Enable host mode on the USB-C connector ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mount -o remount,rw /boot&lt;br /&gt;
sudo armbian-add-overlay /boot/overlay-user/sun50i-a64-usb-host.dts&lt;br /&gt;
sudo mount -o remount,ro /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Software for Recore=&lt;br /&gt;
Recore comes with the Linux distro Refactor (Armbian) pre-installed on the eMMC. &lt;br /&gt;
For more instructions about software for Recore, see the Refactor wiki page: &lt;br /&gt;
[[ Refactor ]]&lt;br /&gt;
&lt;br /&gt;
=== AR100 ===&lt;br /&gt;
Please see: [[AR100]]&lt;br /&gt;
&lt;br /&gt;
=== Manual control and testing ===&lt;br /&gt;
https://wiki.iagent.no/wiki/Manual_control_and_testing&lt;br /&gt;
&lt;br /&gt;
=Performance=&lt;br /&gt;
===Start-up time===&lt;br /&gt;
With a maximum clock for MMC2 of 200 MHz, here is the start-up time: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# systemd-analyze&lt;br /&gt;
Startup finished in 3.011s (kernel) + 12.292s (userspace) = 15.303s &lt;br /&gt;
graphical.target reached after 11.934s in userspace&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===eMMC read and write speed===&lt;br /&gt;
eMMC write speed: 28.8 MB/s&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# dd if=/dev/zero of=/mnt/emmc/1GB.bin bs=1M count=1000&lt;br /&gt;
1000+0 records in&lt;br /&gt;
1000+0 records out&lt;br /&gt;
1048576000 bytes (1.0 GB, 1000 MiB) copied, 36.4307 s, 28.8 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eMMC read speed: 112 MB/s&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# dd if=/mnt/emmc/1GB.bin of=/dev/null bs=1M count=1000&lt;br /&gt;
1000+0 records in&lt;br /&gt;
1000+0 records out&lt;br /&gt;
1048576000 bytes (1.0 GB, 1000 MiB) copied, 9.34956 s, 112 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== USB read and write speed (Reflash USB drive)===&lt;br /&gt;
USB write speed: 7.7 MB/s&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# dd if=/dev/zero of=/mnt/usb/1GB.bin bs=1M count=1000&lt;br /&gt;
1000+0 records in&lt;br /&gt;
1000+0 records out&lt;br /&gt;
1048576000 bytes (1.0 GB, 1000 MiB) copied, 135.476 s, 7.7 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# dd if=/mnt/usb/1GB.bin of=/dev/null bs=1M &lt;br /&gt;
1000+0 records in&lt;br /&gt;
1000+0 records out&lt;br /&gt;
1048576000 bytes (1.0 GB, 1000 MiB) copied, 67.613 s, 15.5 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Measured voltages==&lt;br /&gt;
The final stages of Recore manufacturing consists of testing, calibration and flashing of firmware. &lt;br /&gt;
The calibration stage measures a number of voltages on the board and classifies the input stages gain and offset. &lt;br /&gt;
Instruments used: &lt;br /&gt;
* HP 3458A, 8.5 digit multimeter&lt;br /&gt;
* HP 3245A, Universal Source &lt;br /&gt;
&lt;br /&gt;
====Microcontroller voltages====&lt;br /&gt;
VDDA uC: 3.312 V&amp;lt;br&amp;gt;&lt;br /&gt;
VDD uC: 3.312 V&lt;br /&gt;
&lt;br /&gt;
Voltage from the PMIC supplied as bias:&amp;lt;br&amp;gt;&lt;br /&gt;
0.706 V &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====5V Buck converter ripple and noise ====&lt;br /&gt;
The 5V step down/Buck converter is a AOZ2151EQI-30. It can provide 4A and has an input voltage range of 12-28V. &lt;br /&gt;
It is hard wired to be in PWM mode. PFM mode results in a loud whine.&lt;br /&gt;
&lt;br /&gt;
Below is a screenshot of the ripple and noise across the  the 5V rail with a normal kernel running. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:5V ripple A7.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Input stage===&lt;br /&gt;
When drawing a constant current of 20 A from the bed connector with and without any forced convection. The temperature measured was with the on board thermistor. Using a thermal camera, the temperature displayed matches well with the temperature reported by the camera. The maximum board temperature of 100 degrees C is reached after about 10 minutes with no forced convection. &lt;br /&gt;
Ambient temperature in the room: 20.1 degrees C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Input stage temperature no fan.png|A7 Input stage temperature no fan]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With forced convection (a 92 mm Noctua fan) and a current load of 29 A, the maximum temperature reached after 10 minutes was 87.7 degrees C as measured by the on board thermistor. The thermal camera showed a higher temperature of 98 degrees. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Input stage temperature with fan crop.png|Input stage temperature with fan]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Maximum input voltage ====&lt;br /&gt;
Using 1.5 m test leads and a 26 V bench top PSU (Agilent U8002A) a board has been tested for over voltage issues. This was a problem with Rev A6. No issues were found during testing. &lt;br /&gt;
&lt;br /&gt;
====Inrush current====&lt;br /&gt;
During turn on of the high power stage, there will be an inrush current to charge up the bank of capacitors present on the board. &lt;br /&gt;
If no loads are turned on, the inrush current reaches 28 A at peak, depending on PSU and cables. This is important to consider when setting the current limit with device tree. Below is a trace of the current draw of Recore A7 when the input is enabled. The PSU in use was a PeakTech 6160 (30V/30A) benchtop switchmode PSU. The cables used were Pomona B-24-0 and B-24-2, 24&amp;quot; 18 AWG banana plug test leads.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:A7_inrush_current.png|center]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Over current protection====&lt;br /&gt;
There are 3 different sensors present in the input stage for making sure the 12-24 V domain on the board does not overheat during startup and operation. &lt;br /&gt;
# The Fast acting over current protection is to ensure that the high power domain is disabled in the case of a short circuit condition. &lt;br /&gt;
# The current limit set in Klipper monitors the continuous current draw. This is now set at 20 A, but can go up to 30 A and still be within the limits of the connectors and input stage mosfets. &lt;br /&gt;
# The over temperature protection monitors the temperature in the input stage and cuts the power if the temperature goes over 110 degrees. The board should not be kept at this temperature for a prolonged period, but during heated bed heat-up, it can be elevated compared to the rest of the print.&lt;br /&gt;
&lt;br /&gt;
Below is a plot of what the current on the input looks like if there is an over current condition on the high power domain as that domain is turned on. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:A7 over current input turns on.png|center]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a plot of what the current on the input looks like if there is an over current condition after the input has been turned on. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:A7 over current output turns on.png|center]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ADC offset and gain measurements===&lt;br /&gt;
To measure the ADC offset error, measure the voltage on the uC input pin and record when the &lt;br /&gt;
transition from 0 to 1 occurs. It should occur at 0.5 LSB = 3.3/4096/2 = 0.4028 mV. &lt;br /&gt;
Offset: 55.35 mV - 0.4028 mV = 54.95 mV&lt;br /&gt;
&lt;br /&gt;
==Temperature calibration==&lt;br /&gt;
A set of experiments have been carried out to calibrate the different sensors using a dry-well calibrator. &lt;br /&gt;
The reference probe was a Sensing Devices SDL385 PRT. &lt;br /&gt;
The levels of calibration was: room temperature, 50, 100, 150, and 200 degrees C.&lt;br /&gt;
&lt;br /&gt;
===Thermistor===&lt;br /&gt;
The thermistor in use was a standard EPCOS 100K B57560G104F. This thermistor has a resistance tolerance of 2 %. The value of the pull-up resistor as measured during calibration was 4740.17501. This value seemed to work well at all levels of calibration, although a little on the high side compared to the reference. &lt;br /&gt;
&lt;br /&gt;
===PT1000===&lt;br /&gt;
The PT1000 in use was a Heraeus 31500989 [https://www.heraeus.com/media/media/hne/datasheets/sensor_assemblies_1/Heraeus_W-EYK_Sensor_E.pdf] works well. The tolerance class given in the datasheet is &amp;quot;F 0.10 / Class 1/3 B&amp;quot;. There are two different tolerances here: F0.10 and one third of Class B. The accuracy looks good at all temperatures, perhaps a bit on the high side if using the calibrated value for the pull-up. During the testing, 10 ohm was subtracted from the calibrated value.&lt;br /&gt;
&lt;br /&gt;
===PT100===&lt;br /&gt;
The PT100 used in the calibration was the E3D PT100 with the INA826 amplifier board. There is no datasheet available for the PT100 sensor and no mention of what tolerance there is on the reference resistors used. Furthermore Klipper expects the reference voltage to be 5V exactly, and there is no way to supply a measured value. Measurements on Recore has shown that the value is often a bit lower due to the PMIC for the 5V output on the &amp;quot;input&amp;quot; ports. 4.979 V has been measured and is likely an expected value.&lt;br /&gt;
&lt;br /&gt;
===Thermocouple===&lt;br /&gt;
Using the calibration values directly will give a slight offset to the thermocouple measurements. &lt;br /&gt;
The gain and ADC voltage can be used as measured during calibration. It should be in the region of 101 for gain and 3.307 for ADC voltage. As for the offset, that can be increased slightly to compensate for the cold junction temperature difference. For instance, the measured offset for the test board was 0.0032960, but a value of 0.00340 fit the data points well. The measurements were done on T2, so it it possible that the distance from the cold junction caused the offset. The cold junction thermistor is located between T0 and T1.&lt;br /&gt;
&lt;br /&gt;
=FAQ=&lt;br /&gt;
====Where can I ask for help?====&lt;br /&gt;
:You can join the Discord: https://discord.gg/bCnp9H5SB5&lt;br /&gt;
====What comes in the box with the Recore? Specifically, terminal connectors for power, etc?====&lt;br /&gt;
:It&#039;s only the board, no cables or connectors. There is a bag of connectors available to purchase in the web shop.&lt;br /&gt;
====Do I need access to those 3 buttons on the board?====&lt;br /&gt;
:It is not necessary to have access to the three buttons for normal use.&lt;br /&gt;
====What&#039;s the maximum current draw for heat bed?====&lt;br /&gt;
:This has been tested up to 30 A with good cooling using a fan and a heat sink.&lt;br /&gt;
&lt;br /&gt;
====I have a gadget that I want to connect with SPI. Is that possible?====&lt;br /&gt;
:On Recore A7, there is support for an SPI peripheral. The pins are broken out on header S6/S7.&lt;br /&gt;
&lt;br /&gt;
====What exactly is the role of the AR100 device?====&lt;br /&gt;
:The AR100 handles the fast real-time aspects, mainly the stepper motors and end stops.&lt;br /&gt;
&lt;br /&gt;
====What voltage fans are supported?====&lt;br /&gt;
:The same voltage as the input voltage, either 12 V or 24 V. You can experiment with PWM for running lower voltage fans on 24 V input.&lt;br /&gt;
====Where is the board layout file?====&lt;br /&gt;
:The Layout file will not be available. It is an &amp;quot;open schematic&amp;quot; board, not open source hardware&lt;br /&gt;
====Where are you shipping from?====&lt;br /&gt;
:Boards are shipping from Norway. Eventually shipping will be from a warehouse in the US&lt;br /&gt;
&lt;br /&gt;
= Known hardware issues for rev A7=&lt;br /&gt;
=== Neopixels needs a lower value pull-up resistor than the 1K present on the board===&lt;br /&gt;
&lt;br /&gt;
==List of changes to revision A7 from A6==&lt;br /&gt;
# Step down AOZ2151EQI-30, lower dissipation. &lt;br /&gt;
# Separate fan over current protection.&lt;br /&gt;
# Use one of the electrolytic capacitors as input capacitor. &lt;br /&gt;
# Add a 10K pull-down on the USB power lines, so the USB over-current is unambiguous.&lt;br /&gt;
# Make op-amp more symmetric in order to improve the amplifier issue from A6.&lt;br /&gt;
# Add USR pin to the DBG header&lt;br /&gt;
# Add BOOT pin to the DBG header&lt;br /&gt;
# Move the USB activity LED close to the USB hub. &lt;br /&gt;
# Use CY7C65634 USB hub because GL850G-OHY37 is discontinued&lt;br /&gt;
# Change MCU and DBG connectors from 4 to 6 pins.&lt;br /&gt;
# Add SPI to S6/S7&lt;br /&gt;
# Add a guard ring on the edge on all layers. &lt;br /&gt;
# Use Kelvin connection on mosfets for Op-amps.&lt;br /&gt;
# Mitigate inrush current. Consider C214 = 1 nF from G to GND.&lt;br /&gt;
# Make better return paths for eth clock traces.&lt;br /&gt;
&lt;br /&gt;
= Migrating Klipper config from A6 to A7 =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Section [recore]&lt;br /&gt;
|-&lt;br /&gt;
|Before&lt;br /&gt;
|After&lt;br /&gt;
|-&lt;br /&gt;
|revision: A6&lt;br /&gt;
|revision: A7&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|[tmc2209 stepper_x]&lt;br /&gt;
|-&lt;br /&gt;
|Before&lt;br /&gt;
|After&lt;br /&gt;
|-&lt;br /&gt;
|uart_pin: ar100:PB1&lt;br /&gt;
tx_pin: ar100:PB0&lt;br /&gt;
|uart_pin: ar100:PE16&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|[mcu]&lt;br /&gt;
|-&lt;br /&gt;
|Before&lt;br /&gt;
|After&lt;br /&gt;
|-&lt;br /&gt;
|serial: /dev/ttyS4&lt;br /&gt;
|serial: /dev/ttyS2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|[fan]&lt;br /&gt;
|-&lt;br /&gt;
|Before&lt;br /&gt;
|After&lt;br /&gt;
|-&lt;br /&gt;
|pin: PB0&lt;br /&gt;
|pin: PF0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Recore_A6&amp;diff=1677</id>
		<title>Recore A6</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Recore_A6&amp;diff=1677"/>
		<updated>2026-10-09T12:09:12Z</updated>

		<summary type="html">&lt;p&gt;Elias: OFFSET-T2 is PG2 (GPIO 194), not PG3: PG3 is UC-INT-1 (checked against the schematics&amp;#039; netlists)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Recore header.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Recore is a 3D-printer control board running Linux. It is specifically tailored to be compatible with Klipper and OctoPrint. The main features are: &lt;br /&gt;
* Allwinner A64 SoC, quad core CPU running at 1 GHz. &lt;br /&gt;
* 1 GB of DDR3 RAM&lt;br /&gt;
* 8 GB of on board eMMC &lt;br /&gt;
* Gigabit Ethernet&lt;br /&gt;
* 6 TMC2209, 2 A stepper motor drivers&lt;br /&gt;
* 3 heater outputs + high power heated bed&lt;br /&gt;
* 4 USB High Speed ports &lt;br /&gt;
* 4 thermistor/thermocouple inputs (software selectable)&lt;br /&gt;
* Comes with Debian Linux with Klipper and OctoPrint installed&lt;br /&gt;
&lt;br /&gt;
This document is for Recore Revision A6. For previous hardware revisions, please see:  &lt;br /&gt;
* [[Recore_A5]]&lt;br /&gt;
* [[Recore_A4]]&lt;br /&gt;
* [[Recore_A3]]  &lt;br /&gt;
* [[Recore_A2]]&lt;br /&gt;
&lt;br /&gt;
==Availability==&lt;br /&gt;
Recore A6 can no longer be purchased from the Intelligent Agent web shop [https://www.iagent.no/product/recore/ https://www.iagent.no/product/recore/] - instead you will receive the newer [[Recore_A7]] or later batch as they become available.&lt;br /&gt;
&lt;br /&gt;
== Software release notes ==&lt;br /&gt;
&lt;br /&gt;
Currently, the latest version to use to flash a Recore A6 is tested as [https://github.com/intelligent-agent/Reflash/releases/tag/v0.0.8 Reflash 0.0.8]&lt;br /&gt;
&lt;br /&gt;
The latest recommended versions of Refactor to flash on Recore A6 is [https://github.com/intelligent-agent/Refactor/releases/tag/v3.1.3 ReFactor 3.1.3]&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
Recore is &amp;quot;open schematic&amp;quot;, it is available here: [https://github.com/intelligent-agent/Recore/tree/master/Schematics https://github.com/intelligent-agent/Recore/tree/master/Schematics]&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Pinout A6-2.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==A64==&lt;br /&gt;
The Allwinner A64 is a quad core Cortex A53 clocked at 1 GHz. It has an integrated RISC CPU (AR100) clocked at 300 MHz that handles the real time aspect for the 3D-printer. In the following table the pins used for End-stops and stepper control are described. &lt;br /&gt;
The &amp;quot;bank and pin&amp;quot; can be used to specify the pin numbers in klipper. &lt;br /&gt;
The &amp;quot;Number&amp;quot; column is useful for testing things on the command line in conjunction with gpiod.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&lt;br /&gt;
!Name&lt;br /&gt;
!Bank and pin&lt;br /&gt;
!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number&lt;br /&gt;
!Name&lt;br /&gt;
!Bank and pin&lt;br /&gt;
!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number&lt;br /&gt;
!Name&lt;br /&gt;
!Bank and pin&lt;br /&gt;
!Number&lt;br /&gt;
|-&lt;br /&gt;
|END STOP 0&lt;br /&gt;
|PH4&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|228&lt;br /&gt;
|DIR 6&lt;br /&gt;
|PE14&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|142&lt;br /&gt;
|USB-PWR-EN-0&lt;br /&gt;
|PH0&lt;br /&gt;
|224&lt;br /&gt;
|-&lt;br /&gt;
|END STOP 1&lt;br /&gt;
|PH5&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|229&lt;br /&gt;
|DIR 7&lt;br /&gt;
|PE15&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|143&lt;br /&gt;
|USB-PWR-EN-1&lt;br /&gt;
|PH1&lt;br /&gt;
|225&lt;br /&gt;
|-&lt;br /&gt;
|END STOP 2&lt;br /&gt;
|PH6&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|230&lt;br /&gt;
|STEP DIAG 0&lt;br /&gt;
|PE0&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|128&lt;br /&gt;
|USB-PWR-EN-2&lt;br /&gt;
|PH2&lt;br /&gt;
|226&lt;br /&gt;
|-&lt;br /&gt;
|END STOP 3&lt;br /&gt;
|PH7&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|231&lt;br /&gt;
|STEP DIAG 1&lt;br /&gt;
|PE1&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|129&lt;br /&gt;
|USB-PWR-EN-3&lt;br /&gt;
|PH3&lt;br /&gt;
|227&lt;br /&gt;
|-&lt;br /&gt;
|END STOP 4&lt;br /&gt;
|PH8&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|232&lt;br /&gt;
|STEP DIAG 2&lt;br /&gt;
|PE2&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|130&lt;br /&gt;
|GAIN-ENABLE-T0&lt;br /&gt;
|PD4&lt;br /&gt;
|100&lt;br /&gt;
|-&lt;br /&gt;
|END STOP 5&lt;br /&gt;
|PH9&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|233&lt;br /&gt;
|STEP DIAG 3&lt;br /&gt;
|PE3&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|131&lt;br /&gt;
|GAIN-ENABLE-T1&lt;br /&gt;
|PH11&lt;br /&gt;
|235&lt;br /&gt;
|-&lt;br /&gt;
|STEP 0&lt;br /&gt;
|PL4&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|4&lt;br /&gt;
|STEP DIAG 4&lt;br /&gt;
|PE4&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|132&lt;br /&gt;
|GAIN ENABLE T2&lt;br /&gt;
|PE17&lt;br /&gt;
|145&lt;br /&gt;
|-&lt;br /&gt;
|STEP 1&lt;br /&gt;
|PL5&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|5&lt;br /&gt;
|STEP DIAG 5&lt;br /&gt;
|PE5&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|133&lt;br /&gt;
|GAIN ENABLE T3&lt;br /&gt;
|PB2&lt;br /&gt;
|34&lt;br /&gt;
|-&lt;br /&gt;
|STEP 2&lt;br /&gt;
|PL6&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|6&lt;br /&gt;
|STEP DIAG 6&lt;br /&gt;
|PE6&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|134&lt;br /&gt;
|PU-ENABLE-T0&lt;br /&gt;
|PG10&lt;br /&gt;
|202&lt;br /&gt;
|-&lt;br /&gt;
|STEP 3&lt;br /&gt;
|PL7&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|7&lt;br /&gt;
|STEP DIAG 7&lt;br /&gt;
|PE7&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|135&lt;br /&gt;
|PU-ENABLE-T1&lt;br /&gt;
|PG11&lt;br /&gt;
|203&lt;br /&gt;
|-&lt;br /&gt;
|STEP 4&lt;br /&gt;
|PL8&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|8&lt;br /&gt;
|OC-ALERT&lt;br /&gt;
|PF6&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|166&lt;br /&gt;
|PU ENABLE T2&lt;br /&gt;
|PG12&lt;br /&gt;
|204&lt;br /&gt;
|-&lt;br /&gt;
|STEP 5&lt;br /&gt;
|PL9&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|9&lt;br /&gt;
|OC-RESET&lt;br /&gt;
|PF4&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|164&lt;br /&gt;
|PU ENABLE T3&lt;br /&gt;
|PG13&lt;br /&gt;
|205&lt;br /&gt;
|-&lt;br /&gt;
|STEP 6&lt;br /&gt;
|PL10&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|10&lt;br /&gt;
|EN-HP&lt;br /&gt;
|PF5&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|165&lt;br /&gt;
|OFFSET-T0&lt;br /&gt;
|PG0&lt;br /&gt;
|192&lt;br /&gt;
|-&lt;br /&gt;
|STEP 7&lt;br /&gt;
|PL11&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|11&lt;br /&gt;
|UC-INT-1&lt;br /&gt;
|PG3&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|195&lt;br /&gt;
|OFFSET-T1&lt;br /&gt;
|PG1&lt;br /&gt;
|193&lt;br /&gt;
|-&lt;br /&gt;
|DIR 0&lt;br /&gt;
|PE8&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|136&lt;br /&gt;
|UC-NRST&lt;br /&gt;
|PG4&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|196&lt;br /&gt;
|OFFSET-T2&lt;br /&gt;
|PG2&lt;br /&gt;
|194&lt;br /&gt;
|-&lt;br /&gt;
|DIR 1&lt;br /&gt;
|PE9&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|137&lt;br /&gt;
|UC-BOOT&lt;br /&gt;
|PG5&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|197&lt;br /&gt;
|OFFSET-T3&lt;br /&gt;
|PG8&lt;br /&gt;
|200&lt;br /&gt;
|-&lt;br /&gt;
|DIR 2&lt;br /&gt;
|PE10&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|138&lt;br /&gt;
|ES-EN-12V&lt;br /&gt;
|PF0&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|160&lt;br /&gt;
|STEPPER UART 2 TX&lt;br /&gt;
|PB0&lt;br /&gt;
|32&lt;br /&gt;
|-&lt;br /&gt;
|DIR 3&lt;br /&gt;
|PE11&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|139&lt;br /&gt;
|EN-HDMI-PWR&lt;br /&gt;
|PG9&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|201&lt;br /&gt;
|STEPPER UART 2 RX&lt;br /&gt;
|PB1&lt;br /&gt;
|33&lt;br /&gt;
|-&lt;br /&gt;
|DIR 4&lt;br /&gt;
|PE12&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|140&lt;br /&gt;
|EN-THERMISTORS&lt;br /&gt;
|PF1&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|161&lt;br /&gt;
|STEPPER UART 3 TX&lt;br /&gt;
|PD0&lt;br /&gt;
|96&lt;br /&gt;
|-&lt;br /&gt;
|DIR 5&lt;br /&gt;
|PE13&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|141&lt;br /&gt;
|EN-ENDSTOPS&lt;br /&gt;
|PF2&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|162&lt;br /&gt;
|STEPPER UART 3 RX&lt;br /&gt;
|PD1&lt;br /&gt;
|97&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==STM32F031==&lt;br /&gt;
The STM32 is a Cortex M0 powered micro controller handling analog inputs and PWM outputs. It does not control any hard real time aspects of the print, that is handled by the AR100 core realized as a separate core in the A64 SoC. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&lt;br /&gt;
!Name&lt;br /&gt;
!Bank and pin&lt;br /&gt;
!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number&lt;br /&gt;
!Name&lt;br /&gt;
!Bank and pin&lt;br /&gt;
!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number&lt;br /&gt;
!Name&lt;br /&gt;
!Bank and pin&lt;br /&gt;
!Number&lt;br /&gt;
|-&lt;br /&gt;
|THERMISTOR 0&lt;br /&gt;
|PA0&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|6&lt;br /&gt;
|HEATER E0&lt;br /&gt;
|PA8&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|18&lt;br /&gt;
|FAN 0&lt;br /&gt;
|PB0&lt;br /&gt;
|14&lt;br /&gt;
|-&lt;br /&gt;
|THERMISTOR 1&lt;br /&gt;
|PA1&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|7&lt;br /&gt;
|HEATER E1&lt;br /&gt;
|PA9&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|19&lt;br /&gt;
|FAN 1&lt;br /&gt;
|PB1&lt;br /&gt;
|15&lt;br /&gt;
|-&lt;br /&gt;
|THERMISTOR 2&lt;br /&gt;
|PA2&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|8&lt;br /&gt;
|HEATER E2&lt;br /&gt;
|PA10&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|20&lt;br /&gt;
&lt;br /&gt;
|ES1-PWM-OUT&lt;br /&gt;
|PB3&lt;br /&gt;
|26&lt;br /&gt;
|-&lt;br /&gt;
|THERMISTOR 3&lt;br /&gt;
|PA3&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|9&lt;br /&gt;
|HEATER BED&lt;br /&gt;
|PA11&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|21&lt;br /&gt;
|FAN 3&lt;br /&gt;
|PB4&lt;br /&gt;
|27&lt;br /&gt;
|-&lt;br /&gt;
|BOARD VOLTAGE&lt;br /&gt;
|PA4&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|10&lt;br /&gt;
|USER LED&lt;br /&gt;
|PA12&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|22&lt;br /&gt;
|FAN 2&lt;br /&gt;
|PB5&lt;br /&gt;
|28&lt;br /&gt;
|-&lt;br /&gt;
|BOARD CURRENT&lt;br /&gt;
|PA5&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|11&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|&lt;br /&gt;
|PWM-ES2-OUT&lt;br /&gt;
|PB6&lt;br /&gt;
|29&lt;br /&gt;
|-&lt;br /&gt;
|BOARD TEMPERATURE&lt;br /&gt;
|PA6&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|12&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|&lt;br /&gt;
|EXT 1&lt;br /&gt;
|PB7&lt;br /&gt;
|30&lt;br /&gt;
|-&lt;br /&gt;
|COLD JUNCTION&lt;br /&gt;
|PA7&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|13&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;border-right:solid 2px;&amp;quot;|&lt;br /&gt;
|EXT 2&lt;br /&gt;
|PB8&lt;br /&gt;
|32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==DBG header==&lt;br /&gt;
This header is used for interacting with u-boot and getting early debug messages from the Linux kernel&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Pin&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|UART RX&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|UART TX&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|NC&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==MCU header==&lt;br /&gt;
This header is used for connecting additional MCU peripherals. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Pin&lt;br /&gt;
!Function&lt;br /&gt;
!Alt&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|PB7&lt;br /&gt;
|I2C1_SDA&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|PB8&lt;br /&gt;
|I2C1_SCL&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|3.3V&lt;br /&gt;
|0.7-3.3V&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|GND&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===LEDs===&lt;br /&gt;
There are 15 white LEDs on the board. Here is what they mean&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Location&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|D2&lt;br /&gt;
|By PMIC&lt;br /&gt;
|Board powered&lt;br /&gt;
|-&lt;br /&gt;
|D3&lt;br /&gt;
|By heater BED &lt;br /&gt;
|BED output on&lt;br /&gt;
|-&lt;br /&gt;
|D4&lt;br /&gt;
|By fan 0&lt;br /&gt;
|Fan 0 is on&lt;br /&gt;
|-&lt;br /&gt;
|D5&lt;br /&gt;
|By fan 1&lt;br /&gt;
|Fan 1 is on&lt;br /&gt;
|-&lt;br /&gt;
|D6&lt;br /&gt;
|By heater H2&lt;br /&gt;
|Heater H2 is on&lt;br /&gt;
|-&lt;br /&gt;
|D7&lt;br /&gt;
|By fan 2&lt;br /&gt;
|Fan 2 is on&lt;br /&gt;
|-&lt;br /&gt;
|D8&lt;br /&gt;
|By heater H0&lt;br /&gt;
|Heater H0 is on&lt;br /&gt;
|-&lt;br /&gt;
|D9&lt;br /&gt;
|By fan 3&lt;br /&gt;
|Fan 3 is on&lt;br /&gt;
|-&lt;br /&gt;
|D10&lt;br /&gt;
|By heater H1&lt;br /&gt;
|Heater H1 is on&lt;br /&gt;
|-&lt;br /&gt;
|D12&lt;br /&gt;
|By input connector&lt;br /&gt;
|High voltage domain is on&lt;br /&gt;
|-&lt;br /&gt;
|D15&lt;br /&gt;
|By eMMC chip&lt;br /&gt;
|eMMC activity&lt;br /&gt;
|-&lt;br /&gt;
|D17&lt;br /&gt;
|By HDMI connector&lt;br /&gt;
|USB activitiy&lt;br /&gt;
|-&lt;br /&gt;
|D18&lt;br /&gt;
|By the USB C connector&lt;br /&gt;
|Linux Heartbeat&lt;br /&gt;
|-&lt;br /&gt;
|D19&lt;br /&gt;
|By the A64 SoC&lt;br /&gt;
|CPU activity&lt;br /&gt;
|-&lt;br /&gt;
|D20&lt;br /&gt;
|By the STM32&lt;br /&gt;
|Klipper running on STM32&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Buttons===&lt;br /&gt;
There are 3 push buttons on the board. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|FEL&lt;br /&gt;
|Enter FEL-mode of the A64&lt;br /&gt;
|-&lt;br /&gt;
|BOOT&lt;br /&gt;
|Boots or shuts down the board&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|Hard reset of the CPU&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Current limits==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name&lt;br /&gt;
!Limit&lt;br /&gt;
|-&lt;br /&gt;
|5V-ES&lt;br /&gt;
|0.75 A&lt;br /&gt;
|-&lt;br /&gt;
|USB host each&lt;br /&gt;
|1.0 A&lt;br /&gt;
|-&lt;br /&gt;
|Thermistors&lt;br /&gt;
|0.75 A&lt;br /&gt;
|-&lt;br /&gt;
|MCU connector&lt;br /&gt;
|0.5 A&lt;br /&gt;
|-&lt;br /&gt;
|Fan connectors&lt;br /&gt;
|programmable&lt;br /&gt;
|-&lt;br /&gt;
|Heater connectors&lt;br /&gt;
|programmable&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Wiring=&lt;br /&gt;
Below is a wiring diagram meant to aid in connecting motors, fans, extruders and hot ends to the control board. On the board, there is a small + sign next to output connectors where polarity is important. If passive heating elements are used, polarity is not important, but if those outputs are to be used with SSRs or relays, polarity must be observed. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Recore-wire-diagram-2.2.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Network connection==&lt;br /&gt;
Recore is designed to be controlled through a browser on a computer, so the board must be connected to the local LAN or wifi network. Connect an ethernet cable between the board and a switch. The ping utility can be used to ensure that the board is discovered on the network.&lt;br /&gt;
&lt;br /&gt;
===LAN setup===&lt;br /&gt;
Recore with Refactor is running avahi and should announce itself on the network once a connection has been established. On a Linux based host computer, it is possible to search for a booted device using the following command: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ping recore.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If the device is present, an SSH connection can be established:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root@recore.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Furthermore, a web interface running OctoPrint can be found using a browser:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
http://recore.local&lt;br /&gt;
&lt;br /&gt;
==Wifi setup==&lt;br /&gt;
Wifi can be set up by connecting a wifi dongle to one of the USB host ports. Once the uSB dongle has been connected, and the board has been booted, access to the terminal command line can be given through a host computer. The board should appear as a TTY ACM device. On a Linux based host computer, the terminal program `screen` can be used to get access. From the host computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen /dev/ttyACM0 115200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the host computer is running Windows, [https://www.putty.org/ Putty] can be used to get access. &lt;br /&gt;
&lt;br /&gt;
Once a connection has been established, the wifi network can be set up using the command nmtui. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nmtui&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Follow the instructions on screen to edit and activate the wifi connection. &lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
If the board is powered through the USB C connector, only the two USB host ports next to the HDMI port is powered. See also known hardware issues at the [[Recore_A6#USB_connectors_not_discovered_when_powered_by_USB_device|bottom of this page]]. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mating Connectors==&lt;br /&gt;
The power connectors on the board are available either in the web shop as part of a [https://www.iagent.no/product/connector-pack/ connector pack] or directly from Digi-key etc.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt; &lt;br /&gt;
[[File:Connectors-all.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Four pin male: TBP01P1-508-04BE [[https://www.digikey.com/en/products/detail/cui-devices/TBP01P1-508-04BE/10238369 | Digi-key]]&lt;br /&gt;
&lt;br /&gt;
Two pin male: TBP01P1-508-02BE [[https://www.digikey.com/en/products/detail/cui-devices/TBP01P1-508-02BE/10238367 | Digi-key]]&lt;br /&gt;
&lt;br /&gt;
=Klipper Configuration=&lt;br /&gt;
There are no jumpers on Recore and no hard fuses. Everything is software configurable and resettable from software. This gives great power and flexibility without requiring physical access to the board once it has been installed. But with great power comes great responsibility. It is possible to break things if care is not taken during setup. There is one setting in particular that is worth mentioning: ES0 can have either +5V or +12V on the power pin. This is in order to allow a standard industrial inductive sensor to be used on that end stop. If a 5V only peripheral is connected, that could damage the connected peripheral. &lt;br /&gt;
&lt;br /&gt;
The default config file for Recore A6 can be found in the repository: [https://github.com/intelligent-agent/klipper/blob/master/config/generic-recore-a6.cfg generic-recore-a6.cfg]&lt;br /&gt;
&lt;br /&gt;
===TMC2209===&lt;br /&gt;
The 6 stepper drivers on Recore are of type TMC2209 from Trinamic. Each stepper has a configuration interface with a bidirectional UART port that is connected to a peripheral UART on the A64. The peripheral is not in use, but instead the GPIO bit-banging functionality of Klipper is used to communicate with the stepper drivers. &lt;br /&gt;
&lt;br /&gt;
Here is a table with pins and addresses for the steppers&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Stepper driver config&lt;br /&gt;
|-&lt;br /&gt;
|Name&lt;br /&gt;
|Pins&lt;br /&gt;
|Address&lt;br /&gt;
|-&lt;br /&gt;
|S0&lt;br /&gt;
|PB0/PB1&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|S1&lt;br /&gt;
|PB0/PB1&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|S2&lt;br /&gt;
|PB0/PB1&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|S3&lt;br /&gt;
|PB0/PB1&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|S4&lt;br /&gt;
|PD0/PD1&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|S5&lt;br /&gt;
|PD0/PD1&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|S6&lt;br /&gt;
|PD0/PD1&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|S7&lt;br /&gt;
|PD0/PD1&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== External stepper drivers ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Ext-driver.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
It is possible to connect up to two external stepper drivers to Recore in addition to the 6 divers installed on the board. &lt;br /&gt;
These can be connected using the headers S6 and S7.&lt;br /&gt;
&lt;br /&gt;
==Temperature inputs==&lt;br /&gt;
4 different temperature devices can be connected to the 4 analog inputs on Recore. Thermistor, Thermocouple, PT100 with INA826 and PT1000 without the use of a pre-amplifier.&lt;br /&gt;
===Thermistor===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Thermistor.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Make sure the pull-up is enabled and the op-amp gain is set to 1.&lt;br /&gt;
&lt;br /&gt;
===Thermocouple===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Thermocouple.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure the pull-up is disabled and the op-amp gain is set to 100.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[recore]&lt;br /&gt;
...&lt;br /&gt;
gain_t0: 100&lt;br /&gt;
pullup_t0: 0&lt;br /&gt;
offset_t0: 1&lt;br /&gt;
&lt;br /&gt;
[Extruder]&lt;br /&gt;
...&lt;br /&gt;
sensor_type: Type K&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===PT100 with INA826===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:PT100.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to use a PT100 sensor, an external amplifier board must be used. There is an example configuration for Klipper that &lt;br /&gt;
uses this. The ADC reference voltage is 5.0 by default, but for Recore it is 3.3 V. Here is an example:  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Extruder]&lt;br /&gt;
...&lt;br /&gt;
sensor_type: PT100 INA826&lt;br /&gt;
adc_voltage: 3.27&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The pull-up must also be disabled.&lt;br /&gt;
&lt;br /&gt;
===PT1000===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:PT1000.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Make sure the pull-up is enabled and the gain is set to 1. In the latest version, the sensor must be prefixed with RECORE. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Extruder]&lt;br /&gt;
...&lt;br /&gt;
sensor_type: PT1000&lt;br /&gt;
pullup_resistor: 4750&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Connecting other sensors=&lt;br /&gt;
The board has been designed to work with a range of 3rd party sensors for automating the print.&lt;br /&gt;
==BLtouch==&lt;br /&gt;
There are two versions of the BLtouch, the difference is the color of one of the GND wires. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Antclabs BLtouch sensor wiring.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The Creality version has a blue GND wire. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Creality BLtouch sensor wiring.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
There have been some cases of bad quality control for the Creality BLTouches, where the pinout on the sensor side have not matched the color coding in the photos/documentation. It might be good to make sure the color codes match up. For the Creality it should be, from left to right: &lt;br /&gt;
Blue, red, yellow, black, white. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When connected per wiring diagram above, setting up BLtouch can be done by adding the following section to printer.cfg.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bltouch]&lt;br /&gt;
sensor_pin: ar100:PH6&lt;br /&gt;
control_pin: !PB3&lt;br /&gt;
speed:15&lt;br /&gt;
samples:1&lt;br /&gt;
pin_move_time: 0.675&lt;br /&gt;
sample_retract_dist: 10&lt;br /&gt;
probe_with_touch_mode: true&lt;br /&gt;
stow_on_each_sample: false&lt;br /&gt;
x_offset:29.2&lt;br /&gt;
y_offset:-34&lt;br /&gt;
z_offset:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Inductive Sensor ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Inductive sensor wiring 2.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Connect the inductive sensor on ES0. You can choose either 5V or 12V output on the voltage pin. Inductive sensors often come with an industry standard voltage input of 6-36 V. For this reason there is a 12 V LDO (Low drop-out) voltage regulator integrated on the board. This voltage regulator can be output on the V+ pin of the connector marked ES0. If the Input to the board is 12 V, the LDO will supply a lower voltage, around 10.6 or so.&lt;br /&gt;
&lt;br /&gt;
==ADXL345==&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
The ADXL345 seems to cause Klipper to shut down when trying to calibrate at a high rate. A workaround is to use a Pi Pico or similar MCU to communicate with the ADXL345, or to lower the rate. It&#039;s been tested working at 400, but not 800 which is the recommended minimum. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt; &lt;br /&gt;
[[File:Wiring.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A popular accelerometer sensor for doing input shaping with Klipper is the ADXL345. This can be connected to the connectors S6/S7. There is no hardware SPI interface available, but a software implementation in Klipper exists. &lt;br /&gt;
Note: Only experimental support has been tested for this. &lt;br /&gt;
https://learn.adafruit.com/adxl345-digital-accelerometer&lt;br /&gt;
&lt;br /&gt;
Config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[adxl345]&lt;br /&gt;
cs_pin: ar100:PL11&lt;br /&gt;
spi_software_sclk_pin: ar100:PL10&lt;br /&gt;
spi_software_mosi_pin: ar100:PE15&lt;br /&gt;
spi_software_miso_pin: ar100:PE14&lt;br /&gt;
rate: 400&lt;br /&gt;
&lt;br /&gt;
[resonance_tester]&lt;br /&gt;
accel_chip: adxl345&lt;br /&gt;
probe_points:&lt;br /&gt;
    100, 100, 20  # an example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using a Raspberry Pi Pico:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[adxl345]&lt;br /&gt;
cs_pin: pico:gpio17&lt;br /&gt;
spi_bus: spi0c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RC Servo==&lt;br /&gt;
&amp;lt;div class=&amp;quot;img-res&amp;quot;&amp;gt;&lt;br /&gt;
[[File:RC-servo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Endstop 1 and 2 can be used as PWM outputs with 5V levels. Rev A6 is the first board with support for this. &lt;br /&gt;
More testing and configuration documentation is needed.&lt;br /&gt;
&lt;br /&gt;
==Filament runout sensor==&lt;br /&gt;
&amp;lt;div class=&amp;quot;img-res&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Filament-runout-sensor.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Any of the 6 end stops can be used for connecting a filament runout sensor&lt;br /&gt;
&lt;br /&gt;
=Software for Recore=&lt;br /&gt;
Recore comes with the Linux distro Refactor (Armbian) pre-installed on the eMMC. &lt;br /&gt;
For more instructions about software for Recore, see the Refactor wiki page: &lt;br /&gt;
[[ Refactor#Recore ]]&lt;br /&gt;
&lt;br /&gt;
=== AR100 ===&lt;br /&gt;
Please see: [[AR100]]&lt;br /&gt;
&lt;br /&gt;
=== Manual control and testing ===&lt;br /&gt;
https://wiki.iagent.no/wiki/Manual_control_and_testing&lt;br /&gt;
&lt;br /&gt;
=Performance=&lt;br /&gt;
==Start-up time==&lt;br /&gt;
With a maximum clock for MMC2 of 200 MHz, here is the start-up time: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore-3:~# systemd-analyze &lt;br /&gt;
Startup finished in 5.128s (kernel) + 11.567s (userspace) = 16.695s &lt;br /&gt;
graphical.target reached after 11.421s in userspace&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Measured voltages==&lt;br /&gt;
The final stages of Recore manufacturing consists of testing, calibration and flashing of firmware. &lt;br /&gt;
The calibration stage measures a number of voltages on the board and classifies the input stages gain and offset. &lt;br /&gt;
Instruments used: &lt;br /&gt;
* HP 3458A, 8.5 digit multimeter&lt;br /&gt;
* HP 3245A, Universal Source &lt;br /&gt;
&lt;br /&gt;
====Microcontroller voltages====&lt;br /&gt;
VDDA uC: 3.312 V&amp;lt;br&amp;gt;&lt;br /&gt;
VDD uC: 3.312 V&lt;br /&gt;
&lt;br /&gt;
Voltage from the PMIC supplied as bias:&amp;lt;br&amp;gt;&lt;br /&gt;
0.706 V &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====5V Buck converter ripple and noise ====&lt;br /&gt;
The 5V step down/Buck converter is a AOZ2151PQI-10. It can provide 4A and has an input voltage range of 12-28V. &lt;br /&gt;
It is hard wired to be in PWM mode. PFM mode results in a loud whine.&lt;br /&gt;
&lt;br /&gt;
Below is a screenshot of the ripple and noise across the  the 5V rail with a normal kernel running. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:VCC-5V-ripple-A4.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Input stage===&lt;br /&gt;
An experiment with a constant current load drawing 20 A from the bed connector with and without a 92 mm fan on top of the board for forced convection. The temperature measured was with the on board thermistor. Using a thermal camera, the temperature displayed matches well with the temperature reported by the camera. However, in Rev A2, this is not the hottest point on the board. The MOSFET controlling the bed seems to consistently get the highest temperature. The reason for this is probably due to a 3.3 V VGS. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File: Temperature-fan-off.pdf.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Temperature-fan.pdf.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Inrush current====&lt;br /&gt;
During turn on of the high power stage, there will be an inrush current to charge up the bank of capacitors present on the board. &lt;br /&gt;
If no loads are turned on, the inrush current reaches 48 A at peak. This is important to consider when setting the current limit with device tree. Below is a trace of the current draw of Recore A6 when the input is enabled. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Inrush-curent-A6-6-steppers.png|center]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are 3 different sensors present in the input stage for making sure the 12-24 V domain on the board does not overheat during startup and operation. &lt;br /&gt;
# The Fast acting over current protection is to ensure that the high power domain is disabled in the case of a short circuit condition. &lt;br /&gt;
# The current limit set in Klipper monitors the continuous current draw. This is now set at 20 A, but can go up to 30 A and still be within the limits of the connectors and input stage mosfets. &lt;br /&gt;
# The over temperature protection monitors the temperature in the input stage and cuts the power if the temperature goes over 110 degrees. The board should not be kept at this temperature for a prolonged period, but during heated bed heat-up, it can be elevated compared to the rest of the print.&lt;br /&gt;
&lt;br /&gt;
Below is a plot of what the current on the input looks like if there is an over current condition on the high power domain as that domain is turned on. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Over-current-short-circuit-50A.png|center]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ADC offset and gain measurements===&lt;br /&gt;
To measure the ADC offset error, measure the voltage on the uC input pin and record when the &lt;br /&gt;
transition from 0 to 1 occurs. It should occur at 0.5 LSB = 3.3/4096/2 = 0.4028 mV. &lt;br /&gt;
Offset: 55.35 mV - 0.4028 mV = 54.95 mV&lt;br /&gt;
&lt;br /&gt;
==Temperature calibration==&lt;br /&gt;
A set of experiments have been carried out to calibrate the different sensors using a dry-well calibrator. &lt;br /&gt;
The reference probe was a Sensing Devices SDL385 PRT. &lt;br /&gt;
The levels of calibration was: room temperature, 50, 100, 150, and 200 degrees C.&lt;br /&gt;
&lt;br /&gt;
===Thermistor===&lt;br /&gt;
The thermistor in use was a standard EPCOS 100K B57560G104F. This thermistor has a resistance tolerance of 2 %. The value of the pull-up resistor as measured during calibration was 4740.17501. This value seemed to work well at all levels of calibration, although a little on the high side compared to the reference. &lt;br /&gt;
&lt;br /&gt;
===PT1000===&lt;br /&gt;
The PT1000 in use was a Heraeus 31500989 [https://www.heraeus.com/media/media/hne/datasheets/sensor_assemblies_1/Heraeus_W-EYK_Sensor_E.pdf] works well. The tolerance class given in the datasheet is &amp;quot;F 0.10 / Class 1/3 B&amp;quot;. There are two different tolerances here: F0.10 and one third of Class B. The accuracy looks good at all temperatures, perhaps a bit on the high side if using the calibrated value for the pull-up. During the testing, 10 ohm was subtracted from the calibrated value.&lt;br /&gt;
&lt;br /&gt;
===PT100===&lt;br /&gt;
The PT100 used in the calibration was the E3D PT100 with the INA826 amplifier board. There is no datasheet available for the PT100 sensor and no mention of what tolerance there is on the reference resistors used. Furthermore Klipper expects the reference voltage to be 5V exactly, and there is no way to supply a measured value. Measurements on Recore has shown that the value is often a bit lower due to the PMIC for the 5V output on the &amp;quot;input&amp;quot; ports. 4.979 V has been measured and is likely an expected value.&lt;br /&gt;
&lt;br /&gt;
===Thermocouple===&lt;br /&gt;
Using the calibration values directly will give a slight offset to the thermocouple measurements. &lt;br /&gt;
The gain and ADC voltage can be used as measured during calibration. It should be in the region of 101 for gain and 3.307 for ADC voltage. As for the offset, that can be increased slightly to compensate for the cold junction temperature difference. For instance, the measured offset for the test board was 0.0032960, but a value of 0.00340 fit the data points well. The measurements were done on T2, so it it possible that the distance from the cold junction caused the offset. The cold junction thermistor is located between T0 and T1.&lt;br /&gt;
&lt;br /&gt;
=FAQ=&lt;br /&gt;
====Where can I ask for help?====&lt;br /&gt;
:You can join the Discord: https://discord.gg/bCnp9H5SB5&lt;br /&gt;
====What comes in the box with the Recore? Specifically, terminal connectors for power, etc?====&lt;br /&gt;
:It&#039;s only the board, no cables or connectors. There is a bag of connectors available to purchase in the web shop.&lt;br /&gt;
====Do I need access to those 3 buttons on the board?====&lt;br /&gt;
:It is not necessary to have access to the three buttons for normal use.&lt;br /&gt;
====What&#039;s the maximum current draw for heat bed?====&lt;br /&gt;
:This has been tested up to 20 A&lt;br /&gt;
====Why are there unused and unbroken out pins on the STM32 MCU?====&lt;br /&gt;
:The pins that are needed from the MCU have been routed out plus two pins available on an external header.&lt;br /&gt;
====I have a gadget that I want to connect with SPI. Is that possible?====&lt;br /&gt;
:There are 6 pins available from the main SoC that can be used for various things.There is no hardware SPI, but you can make a program that uses soft SPI. There is no dedicated I2C, but perhaps that would be a nice addition.&lt;br /&gt;
&lt;br /&gt;
====What exactly is the role of the AR100 device?====&lt;br /&gt;
:The AR100 handles the fast real-time aspects, mainly the stepper motors and end stops.&lt;br /&gt;
&lt;br /&gt;
====What voltage fans are supported?====&lt;br /&gt;
:The same voltage as the input voltage, either 12 V or 24 V. You can experiment with PWM for running lower voltage fans on 24 V input.&lt;br /&gt;
====Where is the board layout file?====&lt;br /&gt;
:The Layout file will not be available. It is an &amp;quot;open schematic&amp;quot; board, not open source hardware&lt;br /&gt;
====Where are you shipping from?====&lt;br /&gt;
:Boards are shipping from Norway. Eventually shipping will be from a warehouse in the US&lt;br /&gt;
&lt;br /&gt;
= Known hardware issues for rev A6=&lt;br /&gt;
===T1 offset is not consistent===&lt;br /&gt;
:On Rev A6, during calibration it has been discovered that the offset on T1 is often varying around the predetermined set point of 0.33 V. It seems the cause of this is the batch of op-amps used, so it is a hardware issue. The good news is that it seems to be OK to use the values from the calibration document. The gain should be about the same (101). &lt;br /&gt;
&lt;br /&gt;
===Board can not handle 24 V input (fixed)===&lt;br /&gt;
[[File:Connector with capacitor.jpg|thumb|Connector with capacitor]]&lt;br /&gt;
[[File:Board with capacitor.jpg|thumb|Board with capacitor]]&lt;br /&gt;
:The design without alterations can not handle 24 V input. A bare board can only handle about 20 V. A workaround is to add an electrolytic capacitor to the input. This can either be soldered on to the step down converter input MLCC capacitors, or it can be screwed directly on to the input connector. Be aware of the polarity of the capacitor when mounting it. The &amp;quot;minus&amp;quot; should be towards the black wire. The recommended value is a 47 uF capacitor with a voltage rating of 35 V or higher. 33 uF has also been tested and working. 100 uF and higher should also work, but has not been tested specifically.&lt;br /&gt;
&lt;br /&gt;
:The capacitor that will be added to remaining boards from the Rev A6 batch is ESH476M035AE3AA from Kemet: https://www.digikey.com/en/products/detail/kemet/ESH476M035AE3AA/2712504&lt;br /&gt;
&lt;br /&gt;
:It seems the reason for the issue is a combination of long wires with high inductance, too low capacitance on the input of the board and too little headroom on the step down converter. This can cause voltage spikes that makes the input voltage go above the rated input voltage during load changes. Adding a capacitor to the input &amp;quot;buffers&amp;quot; or &amp;quot;decouples&amp;quot; the long inductance wires and limits the voltage spikes.&lt;br /&gt;
&lt;br /&gt;
===USB connectors not discovered when powered by USB device (workaround)===&lt;br /&gt;
:Some boards are not initialized right when powered by only the USB port. The reason for this is that the VBUS/over current input on the USB hub can get an ambiguous value from USB connector 2 and 3 (the two USB host connectors close to the ethernet connector). &lt;br /&gt;
:A workaround is to apply power to the VIN (12-24V) connector first. If FEL-mode is necessary, that button must be pressed as power is applied from the VIN connector. After that the USB connector can be inserted.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.2.0&amp;diff=1676</id>
		<title>Rebuild v1.2.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.2.0&amp;diff=1676"/>
		<updated>2026-10-01T16:37:07Z</updated>

		<summary type="html">&lt;p&gt;Elias: System updates in Fluidd/Mainsail with tested kernel releases; install with Reflash v1.2.0 or newer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOINDEX__&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Draft - Rebuild v1.2.0 has not been released&#039;&#039;&#039;====&lt;br /&gt;
This page collects the documentation for the next release while it is being built. The changes it describes are on development branches and may still change. For the current release, see [[Rebuild v1.1.0]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Rebuild header.png|center]]&lt;br /&gt;
Rebuild is a complete Linux image for [[Recore A8|Recore]] 3D printer controller boards. Rebuild comes with Klipper installed and the choice of either [https://docs.mainsail.xyz/ Mainsail], [https://docs.fluidd.xyz/ Fluidd] or [https://octoprint.org/ OctoPrint].&lt;br /&gt;
&lt;br /&gt;
=What is new in v1.2.0=&lt;br /&gt;
&lt;br /&gt;
==Rebuild&#039;s own files are Debian packages==&lt;br /&gt;
Everything Rebuild adds to the base system is now installed from two packages, rather than copied into the image by the build scripts:&lt;br /&gt;
* &#039;&#039;&#039;rebuild-recore&#039;&#039;&#039;, on every image including barebone: the board tools (&amp;lt;code&amp;gt;get-serial-number&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get-recore-revision&amp;lt;/code&amp;gt; and friends), the USB-C serial console, and the Wi-Fi hotspot fallback.&lt;br /&gt;
* &#039;&#039;&#039;rebuild-printer&#039;&#039;&#039;, on the Fluidd, Mainsail and OctoPrint images: the tools that flash the AR100, STM32 and RP2040 firmware, the configurations that firmware is built from, first boot, SSH auto-disable, the boot splash, and the system settings the printer images share.&lt;br /&gt;
&lt;br /&gt;
This means that a fix to any of these files can reach a board through &amp;lt;code&amp;gt;apt upgrade&amp;lt;/code&amp;gt;, instead of requiring a new image and a reflash.&lt;br /&gt;
&lt;br /&gt;
The tools have moved from &amp;lt;code&amp;gt;/usr/local/bin&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/bin&amp;lt;/code&amp;gt;. On a board that is upgraded in place, the old paths keep working: they become links to the new ones. The files the old image had copied in are kept in &amp;lt;code&amp;gt;/var/backups/rebuild-legacy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==System updates==&lt;br /&gt;
Rebuild v1.2.0 can be updated in place, without reflashing. Updates appear under &#039;&#039;&#039;System&#039;&#039;&#039; in the update section of Fluidd and Mainsail, and install from there:&lt;br /&gt;
* Updates to Debian, including security fixes.&lt;br /&gt;
* Updates to Rebuild&#039;s own packages (&#039;&#039;&#039;rebuild-recore&#039;&#039;&#039; and &#039;&#039;&#039;rebuild-printer&#039;&#039;&#039;).&lt;br /&gt;
* New versions of the Linux kernel and device trees, &#039;&#039;&#039;once they have been tested on Recore hardware&#039;&#039;&#039;. The kernel, device trees, U-Boot and the other Armbian packages are pinned to tested versions by the package &#039;&#039;&#039;rebuild-armbian-tested&#039;&#039;&#039;. A newer version of that package releases a newer kernel.&lt;br /&gt;
&lt;br /&gt;
A kernel release arrives in two steps: the first update installs the new &#039;&#039;&#039;rebuild-armbian-tested&#039;&#039;&#039;, and the next one shows the kernel and its companion packages. Reboot after a kernel update.&lt;br /&gt;
&lt;br /&gt;
The bootloader (U-Boot) is not updated this way. It stays as it was when the board was installed.&lt;br /&gt;
&lt;br /&gt;
Klipper, Moonraker, Fluidd, Mainsail and KlipperScreen are updated in the same place as before, each with its own entry.&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
* The &#039;&#039;&#039;printer&#039;&#039;&#039; account is now a service account. It has no password, is not in the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; group, and cannot log in over SSH. Klipper, Moonraker and KlipperScreen keep working: the rights they need are given to them explicitly. Log in as &#039;&#039;&#039;debian&#039;&#039;&#039;, and use &amp;lt;code&amp;gt;sudo -u printer -i&amp;lt;/code&amp;gt; to work in Klipper&#039;s files, as before.&lt;br /&gt;
&lt;br /&gt;
==Klipper and the AR100==&lt;br /&gt;
* Klipper is updated to &#039;&#039;&#039;v0.13.0-786&#039;&#039;&#039;. This version includes the AR100 improvements made for this release, which are now part of Klipper itself: the timer and message handling rework from Klipper&#039;s maintainer, faster serial handling, and building at &amp;lt;code&amp;gt;-O2&amp;lt;/code&amp;gt; with a correct size check. The AR100 firmware is built from an unmodified Klipper.&lt;br /&gt;
* The AR100 compiler is updated from GCC 15.1.0 to &#039;&#039;&#039;GCC 16.1.0&#039;&#039;&#039;, which includes fixes for code generation errors on OpenRISC (64-bit and 16-bit shifts, and branch placement).&lt;br /&gt;
* Each firmware file in &amp;lt;code&amp;gt;/opt/firmware&amp;lt;/code&amp;gt; now has the exact configuration it was built with next to it (&amp;lt;code&amp;gt;ar100.config&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stm32.config&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stm32-32KB.config&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rp2040.config&amp;lt;/code&amp;gt;), and &amp;lt;code&amp;gt;klipper-version&amp;lt;/code&amp;gt; records the Klipper version they were built from.&lt;br /&gt;
&lt;br /&gt;
===How fast the AR100 can step===&lt;br /&gt;
The AR100 drives the X/Y (A/B) steppers, and the rate at which it can produce step pulses limits the top speed for a given microstep setting. With the improvements above it can step two steppers at the same time about &#039;&#039;&#039;3.4 times faster&#039;&#039;&#039; than before: one step every 247 AR100 clock cycles per stepper instead of every 836, or about 1.2 million steps per second per stepper instead of 360,000.&lt;br /&gt;
&lt;br /&gt;
What that means for speed depends on the number of steps per mm. The figures below are for a &#039;&#039;&#039;Voron 2.4&#039;&#039;&#039; (CoreXY, 1.8° motors, 20-tooth GT2 pulleys, &amp;lt;code&amp;gt;rotation_distance: 40&amp;lt;/code&amp;gt;, so 5 full steps per mm). On CoreXY the worst direction is a 45° diagonal, where one motor turns √2 times faster than the toolhead moves, so the speed column is the top speed in any direction.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Microsteps !! Steps per mm !! Top speed, any direction, before !! Top speed, any direction, now !! Now, with 30% margin&lt;br /&gt;
|-&lt;br /&gt;
| 16 || 80 || 3,200 mm/s || 10,700 mm/s || 7,500 mm/s&lt;br /&gt;
|-&lt;br /&gt;
| 32 || 160 || 1,600 mm/s || 5,400 mm/s || 3,800 mm/s&lt;br /&gt;
|-&lt;br /&gt;
| 64 || 320 || 790 mm/s || 2,700 mm/s || 1,900 mm/s&lt;br /&gt;
|-&lt;br /&gt;
| 128 || 640 || 400 mm/s || 1,300 mm/s || 940 mm/s&lt;br /&gt;
|-&lt;br /&gt;
| 256 || 1,280 || 200 mm/s || 670 mm/s || 470 mm/s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Use the column with margin when choosing settings: the limit is where the AR100 shuts down with &amp;lt;code&amp;gt;Timer too close&amp;lt;/code&amp;gt;, and a real print adds work the measurement does not.&lt;br /&gt;
* For another printer, scale by its steps per mm: halving the steps per mm doubles the top speed.&lt;br /&gt;
* Speed is rarely the only limit. On the Voron 2.4 used for these measurements, the mechanics stopped at 20,000 mm/s² acceleration (25,000 stalled the motors at 2.0 A), well before the AR100 did.&lt;br /&gt;
* TMC drivers interpolate to 256 microsteps internally (&amp;lt;code&amp;gt;interpolate: True&amp;lt;/code&amp;gt;, the default), so 32 or 64 microsteps still run smoothly.&lt;br /&gt;
&lt;br /&gt;
Measured on the Voron 2.4 with the same AR100 changes on test firmware, before they were merged into Klipper, using a load test that streams commands while stepping. With them, the Voron completed 5 of 5 homings at 256 microsteps (upstream failed 2 of 3) and a dry-run Benchy at 32 microsteps, 800 mm/s and 20,000 mm/s² with no retransmissions. The figures will be checked again on the released image.&lt;br /&gt;
&lt;br /&gt;
==Fixes==&lt;br /&gt;
* A reboot shortly after the board has started no longer hangs for 90 seconds. Moonraker is given 10 seconds to stop.&lt;br /&gt;
&lt;br /&gt;
==A smaller image==&lt;br /&gt;
* &#039;&#039;&#039;Input shaper graphs are no longer drawn on the printer by default.&#039;&#039;&#039; &amp;lt;code&amp;gt;python3-matplotlib&amp;lt;/code&amp;gt; is not installed, which saves 242 MB. Klipper itself never used it. See [[#Input shaper graphs|Input shaper graphs]] below.&lt;br /&gt;
* The ARM compiler no longer carries libraries for Cortex-A and Cortex-R processors, which Klipper never builds for, and the firmware package no longer carries firmware for Qualcomm processors. Together these save about 630 MB. Every Cortex-M variant is kept, so firmware for any microcontroller Klipper supports can still be built on the printer, with any options (CAN bus, USB to CAN bridge, and so on).&lt;br /&gt;
&lt;br /&gt;
===Image sizes===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Image !! Download (compressed), v1.1.0 !! Download, v1.2.0 !! Image unpacked, v1.1.0 !! Image unpacked, v1.2.0 !! Used on the Recore, v1.1.0 !! Used on the Recore, v1.2.0&lt;br /&gt;
|-&lt;br /&gt;
| Barebone || 332 MB || &#039;&#039;&#039;224 MB&#039;&#039;&#039; (−33%) || 1.84 GB || 1.45 GB || 1.34 GB || &#039;&#039;&#039;1.02 GB&#039;&#039;&#039; (−24%)&lt;br /&gt;
|-&lt;br /&gt;
| Fluidd || 1.01 GB || &#039;&#039;&#039;751 MB&#039;&#039;&#039; (−25%) || 6.09 GB || 4.67 GB || 4.83 GB || &#039;&#039;&#039;3.66 GB&#039;&#039;&#039; (−24%)&lt;br /&gt;
|-&lt;br /&gt;
| Mainsail || 997 MB || &#039;&#039;&#039;755 MB&#039;&#039;&#039; (−24%) || 6.09 GB || 4.67 GB || 4.83 GB || &#039;&#039;&#039;3.66 GB&#039;&#039;&#039; (−24%)&lt;br /&gt;
|-&lt;br /&gt;
| OctoPrint || 1.01 GB || &#039;&#039;&#039;751 MB&#039;&#039;&#039; (−25%) || 5.96 GB || 4.53 GB || 4.73 GB || &#039;&#039;&#039;3.56 GB&#039;&#039;&#039; (−25%)&lt;br /&gt;
|}&lt;br /&gt;
* &#039;&#039;&#039;Download&#039;&#039;&#039; is the &amp;lt;code&amp;gt;.img.xz&amp;lt;/code&amp;gt; file that Reflash fetches and writes.&lt;br /&gt;
* &#039;&#039;&#039;Image unpacked&#039;&#039;&#039; is the size of the image once decompressed. Reflash writes it to the eMMC and then grows the root partition to fill it, so this is not the space taken on the board.&lt;br /&gt;
* &#039;&#039;&#039;Used on the Recore&#039;&#039;&#039; is the space the installed system takes on the eMMC: the boot and root file systems together, as built. The rest of the 8 GB eMMC is free for your files, logs and G-code. A board shows slightly less in &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt;, which leaves out file system overhead, and slightly more after first boot.&lt;br /&gt;
* v1.2.0 figures are from the development build v1.1.0-26-g2334760, and may change before release.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
&lt;br /&gt;
==Install with Reflash v1.2.0 or newer==&lt;br /&gt;
Install Rebuild v1.2.0 with &#039;&#039;&#039;[[Reflash]] v1.2.0 or newer&#039;&#039;&#039;; older versions of Reflash are not supported for it. They select the board&#039;s device tree with a link that kernel updates replace, and a board on the generic device tree can lose parts of the hardware - on an A6, Klipper could no longer reach the STM32. Rebuild v1.2.0 converts such a board when a kernel update arrives, but only installs from Reflash v1.2.0 are tested.&lt;br /&gt;
&lt;br /&gt;
To check how a board selects its device tree, log in as &#039;&#039;&#039;debian&#039;&#039;&#039; and run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep fdtfile /boot/armbianEnv.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If nothing is printed, set the device tree for the board&#039;s revision once:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo update-recore-revision&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Building firmware on the printer==&lt;br /&gt;
The configurations Rebuild uses for its own firmware are installed with the image, in &amp;lt;code&amp;gt;/usr/share/rebuild/firmware&amp;lt;/code&amp;gt;. To rebuild the STM32 firmware for a Recore A8 (32 KB flash):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -u printer -i&lt;br /&gt;
cd ~/klipper&lt;br /&gt;
cp /usr/share/rebuild/firmware/stm32f031-32KB-serial.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The same directory has &amp;lt;code&amp;gt;stm32f031-serial.config&amp;lt;/code&amp;gt;, for the 16 KB STM32 on earlier boards, and &amp;lt;code&amp;gt;ar100.config&amp;lt;/code&amp;gt;. Flashing works as described in [[Rebuild v1.1.0#Flashing STM32 firmware|v1.1.0]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Use one or two build jobs&#039;&#039;&#039;====&lt;br /&gt;
A Recore without a fan can reach its critical temperature with all four cores compiling, and it then powers itself off. Build with &amp;lt;code&amp;gt;make -j2&amp;lt;/code&amp;gt; or plain &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;make -j4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===AR100 toolchain===&lt;br /&gt;
The AR100 firmware is compiled with an OpenRISC GCC toolchain installed in &amp;lt;code&amp;gt;/opt/or1k-elf&amp;lt;/code&amp;gt;. v1.2.0 uses GCC 16.1.0, binutils 2.46 and newlib 4.6, built for the Recore from OpenRISC&#039;s own build scripts. The build and the changes made for Rebuild are in [https://github.com/intelligent-agent/or1k-toolchain-build/tree/rebuild intelligent-agent/or1k-toolchain-build] (branch &amp;lt;code&amp;gt;rebuild&amp;lt;/code&amp;gt;), and the toolchain is downloaded from http://feeds.iagent.no/toolchains/.&lt;br /&gt;
&lt;br /&gt;
==Input shaper graphs==&lt;br /&gt;
Klipper&#039;s resonance measurement does not need anything extra. &amp;lt;code&amp;gt;SHAPER_CALIBRATE&amp;lt;/code&amp;gt; runs inside Klipper, measures both axes, recommends a shaper for each and saves it with &amp;lt;code&amp;gt;SAVE_CONFIG&amp;lt;/code&amp;gt;. That works on v1.2.0 exactly as before.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;graphs&#039;&#039;&#039; are optional. They are drawn by Klipper&#039;s scripts (&amp;lt;code&amp;gt;scripts/calibrate_shaper.py&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;scripts/graph_accelerometer.py&amp;lt;/code&amp;gt;), which need the Python plotting library &amp;lt;code&amp;gt;matplotlib&amp;lt;/code&amp;gt;. v1.2.0 no longer installs it. There are two ways to get graphs.&lt;br /&gt;
&lt;br /&gt;
===Draw the graphs on your computer (recommended)===&lt;br /&gt;
The picture is looked at on a computer anyway, so draw it there. First measure on the printer, from the console in Fluidd or Mainsail:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TEST_RESONANCES AXIS=X&lt;br /&gt;
TEST_RESONANCES AXIS=Y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Klipper writes the measurements to &amp;lt;code&amp;gt;/tmp/resonances_x_*.csv&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/tmp/resonances_y_*.csv&amp;lt;/code&amp;gt; on the printer. Copy them to your computer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp debian@recore.local:/tmp/resonances_*.csv .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, on the computer, with Python 3 installed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Klipper3d/klipper&lt;br /&gt;
python3 -m pip install numpy matplotlib&lt;br /&gt;
python3 klipper/scripts/calibrate_shaper.py resonances_x_*.csv -o shaper_calibrate_x.png&lt;br /&gt;
python3 klipper/scripts/calibrate_shaper.py resonances_y_*.csv -o shaper_calibrate_y.png&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install matplotlib on the printer===&lt;br /&gt;
If you would rather draw the graphs on the printer, as described in [https://www.klipper3d.org/Measuring_Resonances.html Klipper&#039;s documentation], install matplotlib first, logged in as &#039;&#039;&#039;debian&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install python3-matplotlib&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This takes about 240 MB. Klipper&#039;s scripts then work as described in its documentation.&lt;br /&gt;
&lt;br /&gt;
Plugins that draw these graphs themselves, such as Shake&amp;amp;Tune, install their own copy of matplotlib and do not need either step.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.2.0&amp;diff=1675</id>
		<title>Rebuild v1.2.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.2.0&amp;diff=1675"/>
		<updated>2026-10-01T15:00:07Z</updated>

		<summary type="html">&lt;p&gt;Elias: Image sizes: download, unpacked and used on the Recore, v1.1.0 against the v1.2.0 development build&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOINDEX__&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Draft - Rebuild v1.2.0 has not been released&#039;&#039;&#039;====&lt;br /&gt;
This page collects the documentation for the next release while it is being built. The changes it describes are on development branches and may still change. For the current release, see [[Rebuild v1.1.0]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Rebuild header.png|center]]&lt;br /&gt;
Rebuild is a complete Linux image for [[Recore A8|Recore]] 3D printer controller boards. Rebuild comes with Klipper installed and the choice of either [https://docs.mainsail.xyz/ Mainsail], [https://docs.fluidd.xyz/ Fluidd] or [https://octoprint.org/ OctoPrint].&lt;br /&gt;
&lt;br /&gt;
=What is new in v1.2.0=&lt;br /&gt;
&lt;br /&gt;
==Rebuild&#039;s own files are Debian packages==&lt;br /&gt;
Everything Rebuild adds to the base system is now installed from two packages, rather than copied into the image by the build scripts:&lt;br /&gt;
* &#039;&#039;&#039;rebuild-recore&#039;&#039;&#039;, on every image including barebone: the board tools (&amp;lt;code&amp;gt;get-serial-number&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get-recore-revision&amp;lt;/code&amp;gt; and friends), the USB-C serial console, and the Wi-Fi hotspot fallback.&lt;br /&gt;
* &#039;&#039;&#039;rebuild-printer&#039;&#039;&#039;, on the Fluidd, Mainsail and OctoPrint images: the tools that flash the AR100, STM32 and RP2040 firmware, the configurations that firmware is built from, first boot, SSH auto-disable, the boot splash, and the system settings the printer images share.&lt;br /&gt;
&lt;br /&gt;
This means that a fix to any of these files can reach a board through &amp;lt;code&amp;gt;apt upgrade&amp;lt;/code&amp;gt;, instead of requiring a new image and a reflash.&lt;br /&gt;
&lt;br /&gt;
The tools have moved from &amp;lt;code&amp;gt;/usr/local/bin&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/bin&amp;lt;/code&amp;gt;. On a board that is upgraded in place, the old paths keep working: they become links to the new ones. The files the old image had copied in are kept in &amp;lt;code&amp;gt;/var/backups/rebuild-legacy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
* The &#039;&#039;&#039;printer&#039;&#039;&#039; account is now a service account. It has no password, is not in the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; group, and cannot log in over SSH. Klipper, Moonraker and KlipperScreen keep working: the rights they need are given to them explicitly. Log in as &#039;&#039;&#039;debian&#039;&#039;&#039;, and use &amp;lt;code&amp;gt;sudo -u printer -i&amp;lt;/code&amp;gt; to work in Klipper&#039;s files, as before.&lt;br /&gt;
&lt;br /&gt;
==Klipper and the AR100==&lt;br /&gt;
* Klipper is updated to &#039;&#039;&#039;v0.13.0-786&#039;&#039;&#039;. This version includes the AR100 improvements made for this release, which are now part of Klipper itself: the timer and message handling rework from Klipper&#039;s maintainer, faster serial handling, and building at &amp;lt;code&amp;gt;-O2&amp;lt;/code&amp;gt; with a correct size check. The AR100 firmware is built from an unmodified Klipper.&lt;br /&gt;
* The AR100 compiler is updated from GCC 15.1.0 to &#039;&#039;&#039;GCC 16.1.0&#039;&#039;&#039;, which includes fixes for code generation errors on OpenRISC (64-bit and 16-bit shifts, and branch placement).&lt;br /&gt;
* Each firmware file in &amp;lt;code&amp;gt;/opt/firmware&amp;lt;/code&amp;gt; now has the exact configuration it was built with next to it (&amp;lt;code&amp;gt;ar100.config&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stm32.config&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stm32-32KB.config&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rp2040.config&amp;lt;/code&amp;gt;), and &amp;lt;code&amp;gt;klipper-version&amp;lt;/code&amp;gt; records the Klipper version they were built from.&lt;br /&gt;
&lt;br /&gt;
===How fast the AR100 can step===&lt;br /&gt;
The AR100 drives the X/Y (A/B) steppers, and the rate at which it can produce step pulses limits the top speed for a given microstep setting. With the improvements above it can step two steppers at the same time about &#039;&#039;&#039;3.4 times faster&#039;&#039;&#039; than before: one step every 247 AR100 clock cycles per stepper instead of every 836, or about 1.2 million steps per second per stepper instead of 360,000.&lt;br /&gt;
&lt;br /&gt;
What that means for speed depends on the number of steps per mm. The figures below are for a &#039;&#039;&#039;Voron 2.4&#039;&#039;&#039; (CoreXY, 1.8° motors, 20-tooth GT2 pulleys, &amp;lt;code&amp;gt;rotation_distance: 40&amp;lt;/code&amp;gt;, so 5 full steps per mm). On CoreXY the worst direction is a 45° diagonal, where one motor turns √2 times faster than the toolhead moves, so the speed column is the top speed in any direction.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Microsteps !! Steps per mm !! Top speed, any direction, before !! Top speed, any direction, now !! Now, with 30% margin&lt;br /&gt;
|-&lt;br /&gt;
| 16 || 80 || 3,200 mm/s || 10,700 mm/s || 7,500 mm/s&lt;br /&gt;
|-&lt;br /&gt;
| 32 || 160 || 1,600 mm/s || 5,400 mm/s || 3,800 mm/s&lt;br /&gt;
|-&lt;br /&gt;
| 64 || 320 || 790 mm/s || 2,700 mm/s || 1,900 mm/s&lt;br /&gt;
|-&lt;br /&gt;
| 128 || 640 || 400 mm/s || 1,300 mm/s || 940 mm/s&lt;br /&gt;
|-&lt;br /&gt;
| 256 || 1,280 || 200 mm/s || 670 mm/s || 470 mm/s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Use the column with margin when choosing settings: the limit is where the AR100 shuts down with &amp;lt;code&amp;gt;Timer too close&amp;lt;/code&amp;gt;, and a real print adds work the measurement does not.&lt;br /&gt;
* For another printer, scale by its steps per mm: halving the steps per mm doubles the top speed.&lt;br /&gt;
* Speed is rarely the only limit. On the Voron 2.4 used for these measurements, the mechanics stopped at 20,000 mm/s² acceleration (25,000 stalled the motors at 2.0 A), well before the AR100 did.&lt;br /&gt;
* TMC drivers interpolate to 256 microsteps internally (&amp;lt;code&amp;gt;interpolate: True&amp;lt;/code&amp;gt;, the default), so 32 or 64 microsteps still run smoothly.&lt;br /&gt;
&lt;br /&gt;
Measured on the Voron 2.4 with the same AR100 changes on test firmware, before they were merged into Klipper, using a load test that streams commands while stepping. With them, the Voron completed 5 of 5 homings at 256 microsteps (upstream failed 2 of 3) and a dry-run Benchy at 32 microsteps, 800 mm/s and 20,000 mm/s² with no retransmissions. The figures will be checked again on the released image.&lt;br /&gt;
&lt;br /&gt;
==Fixes==&lt;br /&gt;
* A reboot shortly after the board has started no longer hangs for 90 seconds. Moonraker is given 10 seconds to stop.&lt;br /&gt;
&lt;br /&gt;
==A smaller image==&lt;br /&gt;
* &#039;&#039;&#039;Input shaper graphs are no longer drawn on the printer by default.&#039;&#039;&#039; &amp;lt;code&amp;gt;python3-matplotlib&amp;lt;/code&amp;gt; is not installed, which saves 242 MB. Klipper itself never used it. See [[#Input shaper graphs|Input shaper graphs]] below.&lt;br /&gt;
* The ARM compiler no longer carries libraries for Cortex-A and Cortex-R processors, which Klipper never builds for, and the firmware package no longer carries firmware for Qualcomm processors. Together these save about 630 MB. Every Cortex-M variant is kept, so firmware for any microcontroller Klipper supports can still be built on the printer, with any options (CAN bus, USB to CAN bridge, and so on).&lt;br /&gt;
&lt;br /&gt;
===Image sizes===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Image !! Download (compressed), v1.1.0 !! Download, v1.2.0 !! Image unpacked, v1.1.0 !! Image unpacked, v1.2.0 !! Used on the Recore, v1.1.0 !! Used on the Recore, v1.2.0&lt;br /&gt;
|-&lt;br /&gt;
| Barebone || 332 MB || &#039;&#039;&#039;224 MB&#039;&#039;&#039; (−33%) || 1.84 GB || 1.45 GB || 1.34 GB || &#039;&#039;&#039;1.02 GB&#039;&#039;&#039; (−24%)&lt;br /&gt;
|-&lt;br /&gt;
| Fluidd || 1.01 GB || &#039;&#039;&#039;751 MB&#039;&#039;&#039; (−25%) || 6.09 GB || 4.67 GB || 4.83 GB || &#039;&#039;&#039;3.66 GB&#039;&#039;&#039; (−24%)&lt;br /&gt;
|-&lt;br /&gt;
| Mainsail || 997 MB || &#039;&#039;&#039;755 MB&#039;&#039;&#039; (−24%) || 6.09 GB || 4.67 GB || 4.83 GB || &#039;&#039;&#039;3.66 GB&#039;&#039;&#039; (−24%)&lt;br /&gt;
|-&lt;br /&gt;
| OctoPrint || 1.01 GB || &#039;&#039;&#039;751 MB&#039;&#039;&#039; (−25%) || 5.96 GB || 4.53 GB || 4.73 GB || &#039;&#039;&#039;3.56 GB&#039;&#039;&#039; (−25%)&lt;br /&gt;
|}&lt;br /&gt;
* &#039;&#039;&#039;Download&#039;&#039;&#039; is the &amp;lt;code&amp;gt;.img.xz&amp;lt;/code&amp;gt; file that Reflash fetches and writes.&lt;br /&gt;
* &#039;&#039;&#039;Image unpacked&#039;&#039;&#039; is the size of the image once decompressed. Reflash writes it to the eMMC and then grows the root partition to fill it, so this is not the space taken on the board.&lt;br /&gt;
* &#039;&#039;&#039;Used on the Recore&#039;&#039;&#039; is the space the installed system takes on the eMMC: the boot and root file systems together, as built. The rest of the 8 GB eMMC is free for your files, logs and G-code. A board shows slightly less in &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt;, which leaves out file system overhead, and slightly more after first boot.&lt;br /&gt;
* v1.2.0 figures are from the development build v1.1.0-26-g2334760, and may change before release.&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
&lt;br /&gt;
==Building firmware on the printer==&lt;br /&gt;
The configurations Rebuild uses for its own firmware are installed with the image, in &amp;lt;code&amp;gt;/usr/share/rebuild/firmware&amp;lt;/code&amp;gt;. To rebuild the STM32 firmware for a Recore A8 (32 KB flash):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -u printer -i&lt;br /&gt;
cd ~/klipper&lt;br /&gt;
cp /usr/share/rebuild/firmware/stm32f031-32KB-serial.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The same directory has &amp;lt;code&amp;gt;stm32f031-serial.config&amp;lt;/code&amp;gt;, for the 16 KB STM32 on earlier boards, and &amp;lt;code&amp;gt;ar100.config&amp;lt;/code&amp;gt;. Flashing works as described in [[Rebuild v1.1.0#Flashing STM32 firmware|v1.1.0]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Use one or two build jobs&#039;&#039;&#039;====&lt;br /&gt;
A Recore without a fan can reach its critical temperature with all four cores compiling, and it then powers itself off. Build with &amp;lt;code&amp;gt;make -j2&amp;lt;/code&amp;gt; or plain &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;make -j4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===AR100 toolchain===&lt;br /&gt;
The AR100 firmware is compiled with an OpenRISC GCC toolchain installed in &amp;lt;code&amp;gt;/opt/or1k-elf&amp;lt;/code&amp;gt;. v1.2.0 uses GCC 16.1.0, binutils 2.46 and newlib 4.6, built for the Recore from OpenRISC&#039;s own build scripts. The build and the changes made for Rebuild are in [https://github.com/intelligent-agent/or1k-toolchain-build/tree/rebuild intelligent-agent/or1k-toolchain-build] (branch &amp;lt;code&amp;gt;rebuild&amp;lt;/code&amp;gt;), and the toolchain is downloaded from http://feeds.iagent.no/toolchains/.&lt;br /&gt;
&lt;br /&gt;
==Input shaper graphs==&lt;br /&gt;
Klipper&#039;s resonance measurement does not need anything extra. &amp;lt;code&amp;gt;SHAPER_CALIBRATE&amp;lt;/code&amp;gt; runs inside Klipper, measures both axes, recommends a shaper for each and saves it with &amp;lt;code&amp;gt;SAVE_CONFIG&amp;lt;/code&amp;gt;. That works on v1.2.0 exactly as before.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;graphs&#039;&#039;&#039; are optional. They are drawn by Klipper&#039;s scripts (&amp;lt;code&amp;gt;scripts/calibrate_shaper.py&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;scripts/graph_accelerometer.py&amp;lt;/code&amp;gt;), which need the Python plotting library &amp;lt;code&amp;gt;matplotlib&amp;lt;/code&amp;gt;. v1.2.0 no longer installs it. There are two ways to get graphs.&lt;br /&gt;
&lt;br /&gt;
===Draw the graphs on your computer (recommended)===&lt;br /&gt;
The picture is looked at on a computer anyway, so draw it there. First measure on the printer, from the console in Fluidd or Mainsail:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TEST_RESONANCES AXIS=X&lt;br /&gt;
TEST_RESONANCES AXIS=Y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Klipper writes the measurements to &amp;lt;code&amp;gt;/tmp/resonances_x_*.csv&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/tmp/resonances_y_*.csv&amp;lt;/code&amp;gt; on the printer. Copy them to your computer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp debian@recore.local:/tmp/resonances_*.csv .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, on the computer, with Python 3 installed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Klipper3d/klipper&lt;br /&gt;
python3 -m pip install numpy matplotlib&lt;br /&gt;
python3 klipper/scripts/calibrate_shaper.py resonances_x_*.csv -o shaper_calibrate_x.png&lt;br /&gt;
python3 klipper/scripts/calibrate_shaper.py resonances_y_*.csv -o shaper_calibrate_y.png&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install matplotlib on the printer===&lt;br /&gt;
If you would rather draw the graphs on the printer, as described in [https://www.klipper3d.org/Measuring_Resonances.html Klipper&#039;s documentation], install matplotlib first, logged in as &#039;&#039;&#039;debian&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install python3-matplotlib&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This takes about 240 MB. Klipper&#039;s scripts then work as described in its documentation.&lt;br /&gt;
&lt;br /&gt;
Plugins that draw these graphs themselves, such as Shake&amp;amp;Tune, install their own copy of matplotlib and do not need either step.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.2.0&amp;diff=1674</id>
		<title>Rebuild v1.2.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.2.0&amp;diff=1674"/>
		<updated>2026-10-01T14:55:44Z</updated>

		<summary type="html">&lt;p&gt;Elias: Klipper v0.13.0-786 with the AR100 changes merged; AR100 step rate and top speed per microstep setting on a Voron 2.4&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOINDEX__&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Draft - Rebuild v1.2.0 has not been released&#039;&#039;&#039;====&lt;br /&gt;
This page collects the documentation for the next release while it is being built. The changes it describes are on development branches and may still change. For the current release, see [[Rebuild v1.1.0]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Rebuild header.png|center]]&lt;br /&gt;
Rebuild is a complete Linux image for [[Recore A8|Recore]] 3D printer controller boards. Rebuild comes with Klipper installed and the choice of either [https://docs.mainsail.xyz/ Mainsail], [https://docs.fluidd.xyz/ Fluidd] or [https://octoprint.org/ OctoPrint].&lt;br /&gt;
&lt;br /&gt;
=What is new in v1.2.0=&lt;br /&gt;
&lt;br /&gt;
==Rebuild&#039;s own files are Debian packages==&lt;br /&gt;
Everything Rebuild adds to the base system is now installed from two packages, rather than copied into the image by the build scripts:&lt;br /&gt;
* &#039;&#039;&#039;rebuild-recore&#039;&#039;&#039;, on every image including barebone: the board tools (&amp;lt;code&amp;gt;get-serial-number&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get-recore-revision&amp;lt;/code&amp;gt; and friends), the USB-C serial console, and the Wi-Fi hotspot fallback.&lt;br /&gt;
* &#039;&#039;&#039;rebuild-printer&#039;&#039;&#039;, on the Fluidd, Mainsail and OctoPrint images: the tools that flash the AR100, STM32 and RP2040 firmware, the configurations that firmware is built from, first boot, SSH auto-disable, the boot splash, and the system settings the printer images share.&lt;br /&gt;
&lt;br /&gt;
This means that a fix to any of these files can reach a board through &amp;lt;code&amp;gt;apt upgrade&amp;lt;/code&amp;gt;, instead of requiring a new image and a reflash.&lt;br /&gt;
&lt;br /&gt;
The tools have moved from &amp;lt;code&amp;gt;/usr/local/bin&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/bin&amp;lt;/code&amp;gt;. On a board that is upgraded in place, the old paths keep working: they become links to the new ones. The files the old image had copied in are kept in &amp;lt;code&amp;gt;/var/backups/rebuild-legacy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
* The &#039;&#039;&#039;printer&#039;&#039;&#039; account is now a service account. It has no password, is not in the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; group, and cannot log in over SSH. Klipper, Moonraker and KlipperScreen keep working: the rights they need are given to them explicitly. Log in as &#039;&#039;&#039;debian&#039;&#039;&#039;, and use &amp;lt;code&amp;gt;sudo -u printer -i&amp;lt;/code&amp;gt; to work in Klipper&#039;s files, as before.&lt;br /&gt;
&lt;br /&gt;
==Klipper and the AR100==&lt;br /&gt;
* Klipper is updated to &#039;&#039;&#039;v0.13.0-786&#039;&#039;&#039;. This version includes the AR100 improvements made for this release, which are now part of Klipper itself: the timer and message handling rework from Klipper&#039;s maintainer, faster serial handling, and building at &amp;lt;code&amp;gt;-O2&amp;lt;/code&amp;gt; with a correct size check. The AR100 firmware is built from an unmodified Klipper.&lt;br /&gt;
* The AR100 compiler is updated from GCC 15.1.0 to &#039;&#039;&#039;GCC 16.1.0&#039;&#039;&#039;, which includes fixes for code generation errors on OpenRISC (64-bit and 16-bit shifts, and branch placement).&lt;br /&gt;
* Each firmware file in &amp;lt;code&amp;gt;/opt/firmware&amp;lt;/code&amp;gt; now has the exact configuration it was built with next to it (&amp;lt;code&amp;gt;ar100.config&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stm32.config&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stm32-32KB.config&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rp2040.config&amp;lt;/code&amp;gt;), and &amp;lt;code&amp;gt;klipper-version&amp;lt;/code&amp;gt; records the Klipper version they were built from.&lt;br /&gt;
&lt;br /&gt;
===How fast the AR100 can step===&lt;br /&gt;
The AR100 drives the X/Y (A/B) steppers, and the rate at which it can produce step pulses limits the top speed for a given microstep setting. With the improvements above it can step two steppers at the same time about &#039;&#039;&#039;3.4 times faster&#039;&#039;&#039; than before: one step every 247 AR100 clock cycles per stepper instead of every 836, or about 1.2 million steps per second per stepper instead of 360,000.&lt;br /&gt;
&lt;br /&gt;
What that means for speed depends on the number of steps per mm. The figures below are for a &#039;&#039;&#039;Voron 2.4&#039;&#039;&#039; (CoreXY, 1.8° motors, 20-tooth GT2 pulleys, &amp;lt;code&amp;gt;rotation_distance: 40&amp;lt;/code&amp;gt;, so 5 full steps per mm). On CoreXY the worst direction is a 45° diagonal, where one motor turns √2 times faster than the toolhead moves, so the speed column is the top speed in any direction.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Microsteps !! Steps per mm !! Top speed, any direction, before !! Top speed, any direction, now !! Now, with 30% margin&lt;br /&gt;
|-&lt;br /&gt;
| 16 || 80 || 3,200 mm/s || 10,700 mm/s || 7,500 mm/s&lt;br /&gt;
|-&lt;br /&gt;
| 32 || 160 || 1,600 mm/s || 5,400 mm/s || 3,800 mm/s&lt;br /&gt;
|-&lt;br /&gt;
| 64 || 320 || 790 mm/s || 2,700 mm/s || 1,900 mm/s&lt;br /&gt;
|-&lt;br /&gt;
| 128 || 640 || 400 mm/s || 1,300 mm/s || 940 mm/s&lt;br /&gt;
|-&lt;br /&gt;
| 256 || 1,280 || 200 mm/s || 670 mm/s || 470 mm/s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Use the column with margin when choosing settings: the limit is where the AR100 shuts down with &amp;lt;code&amp;gt;Timer too close&amp;lt;/code&amp;gt;, and a real print adds work the measurement does not.&lt;br /&gt;
* For another printer, scale by its steps per mm: halving the steps per mm doubles the top speed.&lt;br /&gt;
* Speed is rarely the only limit. On the Voron 2.4 used for these measurements, the mechanics stopped at 20,000 mm/s² acceleration (25,000 stalled the motors at 2.0 A), well before the AR100 did.&lt;br /&gt;
* TMC drivers interpolate to 256 microsteps internally (&amp;lt;code&amp;gt;interpolate: True&amp;lt;/code&amp;gt;, the default), so 32 or 64 microsteps still run smoothly.&lt;br /&gt;
&lt;br /&gt;
Measured on the Voron 2.4 with the same AR100 changes on test firmware, before they were merged into Klipper, using a load test that streams commands while stepping. With them, the Voron completed 5 of 5 homings at 256 microsteps (upstream failed 2 of 3) and a dry-run Benchy at 32 microsteps, 800 mm/s and 20,000 mm/s² with no retransmissions. The figures will be checked again on the released image.&lt;br /&gt;
&lt;br /&gt;
==Fixes==&lt;br /&gt;
* A reboot shortly after the board has started no longer hangs for 90 seconds. Moonraker is given 10 seconds to stop.&lt;br /&gt;
&lt;br /&gt;
==A smaller image==&lt;br /&gt;
* &#039;&#039;&#039;Input shaper graphs are no longer drawn on the printer by default.&#039;&#039;&#039; &amp;lt;code&amp;gt;python3-matplotlib&amp;lt;/code&amp;gt; is not installed, which saves 242 MB. Klipper itself never used it. See [[#Input shaper graphs|Input shaper graphs]] below.&lt;br /&gt;
* The ARM compiler no longer carries libraries for Cortex-A and Cortex-R processors, which Klipper never builds for, and the firmware package no longer carries firmware for Qualcomm processors. Together these save about 630 MB. Every Cortex-M variant is kept, so firmware for any microcontroller Klipper supports can still be built on the printer, with any options (CAN bus, USB to CAN bridge, and so on).&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
&lt;br /&gt;
==Building firmware on the printer==&lt;br /&gt;
The configurations Rebuild uses for its own firmware are installed with the image, in &amp;lt;code&amp;gt;/usr/share/rebuild/firmware&amp;lt;/code&amp;gt;. To rebuild the STM32 firmware for a Recore A8 (32 KB flash):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -u printer -i&lt;br /&gt;
cd ~/klipper&lt;br /&gt;
cp /usr/share/rebuild/firmware/stm32f031-32KB-serial.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The same directory has &amp;lt;code&amp;gt;stm32f031-serial.config&amp;lt;/code&amp;gt;, for the 16 KB STM32 on earlier boards, and &amp;lt;code&amp;gt;ar100.config&amp;lt;/code&amp;gt;. Flashing works as described in [[Rebuild v1.1.0#Flashing STM32 firmware|v1.1.0]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Use one or two build jobs&#039;&#039;&#039;====&lt;br /&gt;
A Recore without a fan can reach its critical temperature with all four cores compiling, and it then powers itself off. Build with &amp;lt;code&amp;gt;make -j2&amp;lt;/code&amp;gt; or plain &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;make -j4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===AR100 toolchain===&lt;br /&gt;
The AR100 firmware is compiled with an OpenRISC GCC toolchain installed in &amp;lt;code&amp;gt;/opt/or1k-elf&amp;lt;/code&amp;gt;. v1.2.0 uses GCC 16.1.0, binutils 2.46 and newlib 4.6, built for the Recore from OpenRISC&#039;s own build scripts. The build and the changes made for Rebuild are in [https://github.com/intelligent-agent/or1k-toolchain-build/tree/rebuild intelligent-agent/or1k-toolchain-build] (branch &amp;lt;code&amp;gt;rebuild&amp;lt;/code&amp;gt;), and the toolchain is downloaded from http://feeds.iagent.no/toolchains/.&lt;br /&gt;
&lt;br /&gt;
==Input shaper graphs==&lt;br /&gt;
Klipper&#039;s resonance measurement does not need anything extra. &amp;lt;code&amp;gt;SHAPER_CALIBRATE&amp;lt;/code&amp;gt; runs inside Klipper, measures both axes, recommends a shaper for each and saves it with &amp;lt;code&amp;gt;SAVE_CONFIG&amp;lt;/code&amp;gt;. That works on v1.2.0 exactly as before.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;graphs&#039;&#039;&#039; are optional. They are drawn by Klipper&#039;s scripts (&amp;lt;code&amp;gt;scripts/calibrate_shaper.py&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;scripts/graph_accelerometer.py&amp;lt;/code&amp;gt;), which need the Python plotting library &amp;lt;code&amp;gt;matplotlib&amp;lt;/code&amp;gt;. v1.2.0 no longer installs it. There are two ways to get graphs.&lt;br /&gt;
&lt;br /&gt;
===Draw the graphs on your computer (recommended)===&lt;br /&gt;
The picture is looked at on a computer anyway, so draw it there. First measure on the printer, from the console in Fluidd or Mainsail:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TEST_RESONANCES AXIS=X&lt;br /&gt;
TEST_RESONANCES AXIS=Y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Klipper writes the measurements to &amp;lt;code&amp;gt;/tmp/resonances_x_*.csv&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/tmp/resonances_y_*.csv&amp;lt;/code&amp;gt; on the printer. Copy them to your computer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp debian@recore.local:/tmp/resonances_*.csv .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, on the computer, with Python 3 installed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Klipper3d/klipper&lt;br /&gt;
python3 -m pip install numpy matplotlib&lt;br /&gt;
python3 klipper/scripts/calibrate_shaper.py resonances_x_*.csv -o shaper_calibrate_x.png&lt;br /&gt;
python3 klipper/scripts/calibrate_shaper.py resonances_y_*.csv -o shaper_calibrate_y.png&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install matplotlib on the printer===&lt;br /&gt;
If you would rather draw the graphs on the printer, as described in [https://www.klipper3d.org/Measuring_Resonances.html Klipper&#039;s documentation], install matplotlib first, logged in as &#039;&#039;&#039;debian&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install python3-matplotlib&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This takes about 240 MB. Klipper&#039;s scripts then work as described in its documentation.&lt;br /&gt;
&lt;br /&gt;
Plugins that draw these graphs themselves, such as Shake&amp;amp;Tune, install their own copy of matplotlib and do not need either step.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.2.0&amp;diff=1673</id>
		<title>Rebuild v1.2.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.2.0&amp;diff=1673"/>
		<updated>2026-09-30T14:51:46Z</updated>

		<summary type="html">&lt;p&gt;Elias: Draft: Klipper 777 with the pending AR100 changes, GCC 16.1 toolchain, Moonraker stop fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOINDEX__&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Draft - Rebuild v1.2.0 has not been released&#039;&#039;&#039;====&lt;br /&gt;
This page collects the documentation for the next release while it is being built. The changes it describes are on development branches and may still change. For the current release, see [[Rebuild v1.1.0]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Rebuild header.png|center]]&lt;br /&gt;
Rebuild is a complete Linux image for [[Recore A8|Recore]] 3D printer controller boards. Rebuild comes with Klipper installed and the choice of either [https://docs.mainsail.xyz/ Mainsail], [https://docs.fluidd.xyz/ Fluidd] or [https://octoprint.org/ OctoPrint].&lt;br /&gt;
&lt;br /&gt;
=What is new in v1.2.0=&lt;br /&gt;
&lt;br /&gt;
==Rebuild&#039;s own files are Debian packages==&lt;br /&gt;
Everything Rebuild adds to the base system is now installed from two packages, rather than copied into the image by the build scripts:&lt;br /&gt;
* &#039;&#039;&#039;rebuild-recore&#039;&#039;&#039;, on every image including barebone: the board tools (&amp;lt;code&amp;gt;get-serial-number&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get-recore-revision&amp;lt;/code&amp;gt; and friends), the USB-C serial console, and the Wi-Fi hotspot fallback.&lt;br /&gt;
* &#039;&#039;&#039;rebuild-printer&#039;&#039;&#039;, on the Fluidd, Mainsail and OctoPrint images: the tools that flash the AR100, STM32 and RP2040 firmware, the configurations that firmware is built from, first boot, SSH auto-disable, the boot splash, and the system settings the printer images share.&lt;br /&gt;
&lt;br /&gt;
This means that a fix to any of these files can reach a board through &amp;lt;code&amp;gt;apt upgrade&amp;lt;/code&amp;gt;, instead of requiring a new image and a reflash.&lt;br /&gt;
&lt;br /&gt;
The tools have moved from &amp;lt;code&amp;gt;/usr/local/bin&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/bin&amp;lt;/code&amp;gt;. On a board that is upgraded in place, the old paths keep working: they become links to the new ones. The files the old image had copied in are kept in &amp;lt;code&amp;gt;/var/backups/rebuild-legacy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
* The &#039;&#039;&#039;printer&#039;&#039;&#039; account is now a service account. It has no password, is not in the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; group, and cannot log in over SSH. Klipper, Moonraker and KlipperScreen keep working: the rights they need are given to them explicitly. Log in as &#039;&#039;&#039;debian&#039;&#039;&#039;, and use &amp;lt;code&amp;gt;sudo -u printer -i&amp;lt;/code&amp;gt; to work in Klipper&#039;s files, as before.&lt;br /&gt;
&lt;br /&gt;
==Klipper and the AR100==&lt;br /&gt;
* Klipper is updated to &#039;&#039;&#039;v0.13.0-777&#039;&#039;&#039;.&lt;br /&gt;
* The firmware for the AR100 is built with AR100 improvements that are still on their way into Klipper: the timer and message handling rework from Klipper&#039;s maintainer, and building at &amp;lt;code&amp;gt;-O2&amp;lt;/code&amp;gt; with a correct size check. The changes are kept in &amp;lt;code&amp;gt;/usr/share/rebuild/klipper-patches&amp;lt;/code&amp;gt;, and are dropped from Rebuild as they are merged into Klipper. They only affect the AR100 firmware; Klipper itself on the board is an unmodified upstream checkout.&lt;br /&gt;
* The AR100 compiler is updated from GCC 15.1.0 to &#039;&#039;&#039;GCC 16.1.0&#039;&#039;&#039;, which includes fixes for code generation errors on OpenRISC (64-bit and 16-bit shifts, and branch placement).&lt;br /&gt;
* Each firmware file in &amp;lt;code&amp;gt;/opt/firmware&amp;lt;/code&amp;gt; now has the exact configuration it was built with next to it (&amp;lt;code&amp;gt;ar100.config&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stm32.config&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stm32-32KB.config&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rp2040.config&amp;lt;/code&amp;gt;), and &amp;lt;code&amp;gt;klipper-version&amp;lt;/code&amp;gt; records the Klipper version they were built from.&lt;br /&gt;
&lt;br /&gt;
==Fixes==&lt;br /&gt;
* A reboot shortly after the board has started no longer hangs for 90 seconds. Moonraker is given 10 seconds to stop.&lt;br /&gt;
&lt;br /&gt;
==A smaller image==&lt;br /&gt;
* &#039;&#039;&#039;Input shaper graphs are no longer drawn on the printer by default.&#039;&#039;&#039; &amp;lt;code&amp;gt;python3-matplotlib&amp;lt;/code&amp;gt; is not installed, which saves 242 MB. Klipper itself never used it. See [[#Input shaper graphs|Input shaper graphs]] below.&lt;br /&gt;
* The ARM compiler no longer carries libraries for Cortex-A and Cortex-R processors, which Klipper never builds for, and the firmware package no longer carries firmware for Qualcomm processors. Together these save about 630 MB. Every Cortex-M variant is kept, so firmware for any microcontroller Klipper supports can still be built on the printer, with any options (CAN bus, USB to CAN bridge, and so on).&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
&lt;br /&gt;
==Building firmware on the printer==&lt;br /&gt;
The configurations Rebuild uses for its own firmware are installed with the image, in &amp;lt;code&amp;gt;/usr/share/rebuild/firmware&amp;lt;/code&amp;gt;. To rebuild the STM32 firmware for a Recore A8 (32 KB flash):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -u printer -i&lt;br /&gt;
cd ~/klipper&lt;br /&gt;
cp /usr/share/rebuild/firmware/stm32f031-32KB-serial.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The same directory has &amp;lt;code&amp;gt;stm32f031-serial.config&amp;lt;/code&amp;gt;, for the 16 KB STM32 on earlier boards, and &amp;lt;code&amp;gt;ar100.config&amp;lt;/code&amp;gt;. Flashing works as described in [[Rebuild v1.1.0#Flashing STM32 firmware|v1.1.0]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Use one or two build jobs&#039;&#039;&#039;====&lt;br /&gt;
A Recore without a fan can reach its critical temperature with all four cores compiling, and it then powers itself off. Build with &amp;lt;code&amp;gt;make -j2&amp;lt;/code&amp;gt; or plain &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;make -j4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===AR100 toolchain===&lt;br /&gt;
The AR100 firmware is compiled with an OpenRISC GCC toolchain installed in &amp;lt;code&amp;gt;/opt/or1k-elf&amp;lt;/code&amp;gt;. v1.2.0 uses GCC 16.1.0, binutils 2.46 and newlib 4.6, built for the Recore from OpenRISC&#039;s own build scripts. The build and the changes made for Rebuild are in [https://github.com/intelligent-agent/or1k-toolchain-build/tree/rebuild intelligent-agent/or1k-toolchain-build] (branch &amp;lt;code&amp;gt;rebuild&amp;lt;/code&amp;gt;), and the toolchain is downloaded from http://feeds.iagent.no/toolchains/.&lt;br /&gt;
&lt;br /&gt;
==Input shaper graphs==&lt;br /&gt;
Klipper&#039;s resonance measurement does not need anything extra. &amp;lt;code&amp;gt;SHAPER_CALIBRATE&amp;lt;/code&amp;gt; runs inside Klipper, measures both axes, recommends a shaper for each and saves it with &amp;lt;code&amp;gt;SAVE_CONFIG&amp;lt;/code&amp;gt;. That works on v1.2.0 exactly as before.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;graphs&#039;&#039;&#039; are optional. They are drawn by Klipper&#039;s scripts (&amp;lt;code&amp;gt;scripts/calibrate_shaper.py&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;scripts/graph_accelerometer.py&amp;lt;/code&amp;gt;), which need the Python plotting library &amp;lt;code&amp;gt;matplotlib&amp;lt;/code&amp;gt;. v1.2.0 no longer installs it. There are two ways to get graphs.&lt;br /&gt;
&lt;br /&gt;
===Draw the graphs on your computer (recommended)===&lt;br /&gt;
The picture is looked at on a computer anyway, so draw it there. First measure on the printer, from the console in Fluidd or Mainsail:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TEST_RESONANCES AXIS=X&lt;br /&gt;
TEST_RESONANCES AXIS=Y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Klipper writes the measurements to &amp;lt;code&amp;gt;/tmp/resonances_x_*.csv&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/tmp/resonances_y_*.csv&amp;lt;/code&amp;gt; on the printer. Copy them to your computer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp debian@recore.local:/tmp/resonances_*.csv .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, on the computer, with Python 3 installed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Klipper3d/klipper&lt;br /&gt;
python3 -m pip install numpy matplotlib&lt;br /&gt;
python3 klipper/scripts/calibrate_shaper.py resonances_x_*.csv -o shaper_calibrate_x.png&lt;br /&gt;
python3 klipper/scripts/calibrate_shaper.py resonances_y_*.csv -o shaper_calibrate_y.png&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install matplotlib on the printer===&lt;br /&gt;
If you would rather draw the graphs on the printer, as described in [https://www.klipper3d.org/Measuring_Resonances.html Klipper&#039;s documentation], install matplotlib first, logged in as &#039;&#039;&#039;debian&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install python3-matplotlib&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This takes about 240 MB. Klipper&#039;s scripts then work as described in its documentation.&lt;br /&gt;
&lt;br /&gt;
Plugins that draw these graphs themselves, such as Shake&amp;amp;Tune, install their own copy of matplotlib and do not need either step.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.1.0&amp;diff=1672</id>
		<title>Rebuild v1.1.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.1.0&amp;diff=1672"/>
		<updated>2026-09-30T12:15:09Z</updated>

		<summary type="html">&lt;p&gt;Elias: Pin the STM32 config download to the v1.1.0 tag; the file moves on main&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Rebuild header.png|center]]&lt;br /&gt;
Rebuild is a complete Linux image for [[Recore A8|Recore]] 3D printer controller boards. Rebuild comes with Klipper installed and the choice of either [https://docs.mainsail.xyz/ MainSail], [https://docs.fluidd.xyz/ Fluidd] or [https://octoprint.org/ OctoPrint]. The name Rebuild is a reflection of the [https://www.armbian.com/ Armbian] build system, but adapted for Recore boards. &lt;br /&gt;
&lt;br /&gt;
Rebuild has now been released as v1.1.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;There is no in-place upgrade to v1.1.0&#039;&#039;&#039;====&lt;br /&gt;
The base OS, the kernel and U-Boot have all moved, and U-Boot does not live in the filesystem, so &amp;lt;code&amp;gt;apt upgrade&amp;lt;/code&amp;gt; on a v1.0.x board will not get you here. &#039;&#039;&#039;Flash a fresh image.&#039;&#039;&#039; Save &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt; and anything else you have customised first.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=What is new in v1.1.0=&lt;br /&gt;
&lt;br /&gt;
==A new base==&lt;br /&gt;
* Debian 13 (trixie) on Armbian 26.08, running the &#039;&#039;&#039;6.18.50&#039;&#039;&#039; kernel.&lt;br /&gt;
* Rebuild and [[Reflash v1.1.0|Reflash]] are now built against the same kernel. They had drifted apart across kernel version, branch and Armbian release, which meant a kernel fix landed in one image but not the other.&lt;br /&gt;
* &#039;&#039;&#039;U-Boot 2026.07&#039;&#039;&#039;, replacing 2024.01.&lt;br /&gt;
&lt;br /&gt;
==The display==&lt;br /&gt;
* The panel is driven by &#039;&#039;&#039;simpledrm&#039;&#039;&#039;, adopting the framebuffer U-Boot has already set up from the display&#039;s EDID. The result is one mode from U-Boot through Plymouth to KlipperScreen, with no mode change and no flicker anywhere in the chain.&lt;br /&gt;
* This replaces a path where the HDMI driver could misread hotplug as low for about half a second while its PHY came up, get no EDID inside that window, and invent a 1024x768 mode. The framebuffer is allocated once and cannot grow, so that guess was permanent: the panel could not lock, dropped sync and blanked its own backlight.&lt;br /&gt;
* A redesigned Plymouth splash, and a framebuffer console that can be rotated to match a panel that is mounted rotated.&lt;br /&gt;
* A board with no panel now says &amp;quot;no display detected&amp;quot; rather than reporting a failure, and the barebone image gives you a shell on the panel instead of a frozen splash.&lt;br /&gt;
&lt;br /&gt;
==Booting==&lt;br /&gt;
* U-Boot no longer scans the USB-C port for boot devices, and holds PD7 low so the board never sources VBUS on USB-C.&lt;br /&gt;
* &amp;lt;code&amp;gt;bootm_size&amp;lt;/code&amp;gt; is wide enough for a Reflash initrd to be relocated. On U-Boot 2026.07 the memory map persists for the whole session, so scratch loads earlier in the boot script fragmented it and the initrd had nowhere to go.&lt;br /&gt;
* U-Boot no longer hunts for a netboot server that does not exist, which used to add a delay to every boot.&lt;br /&gt;
* A failed image load no longer results in the kernel being booted anyway.&lt;br /&gt;
&lt;br /&gt;
==Printer and hardware==&lt;br /&gt;
* The Klipper RP2040 binary is built with the image and flashed on first boot, and first boot now verifies that it was actually flashed and that Klipper reached its MCUs, rather than assuming.&lt;br /&gt;
* DRAM frequency scaling is disabled on A5 and A6.&lt;br /&gt;
* udev no longer probes the RP2 bootloader as though it were a disk.&lt;br /&gt;
* ustreamer starts from the camera device, so a camera present at boot is picked up.&lt;br /&gt;
&lt;br /&gt;
==Network and identity==&lt;br /&gt;
* &#039;&#039;&#039;Every board now generates its own SSH host key.&#039;&#039;&#039; v1.0.x shipped one key pair inside the image, so every Recore in the world presented the same host identity.&lt;br /&gt;
* Rebuild tries the configured network for a full two minutes before falling back to the hotspot, instead of giving up early.&lt;br /&gt;
* WiFi profiles apply to whatever dongle is present, and a board with no WiFi device leaves quietly instead of failing every boot.&lt;br /&gt;
* The board can report its own serial number, in every variant including barebone.&lt;br /&gt;
&lt;br /&gt;
==Removed==&lt;br /&gt;
* &#039;&#039;&#039;armbian-config&#039;&#039;&#039; and &#039;&#039;&#039;armbian-install&#039;&#039;&#039; are no longer installed. They defeat the package holds that keep Klipper, the kernel and U-Boot at the versions the image was tested with: &amp;lt;code&amp;gt;armbian-config&amp;lt;/code&amp;gt; runs &amp;lt;code&amp;gt;apt-mark unhold&amp;lt;/code&amp;gt;, and its software installer passes &amp;lt;code&amp;gt;--allow-change-held-packages&amp;lt;/code&amp;gt;. Removing them is what makes the held versions mean something.&lt;br /&gt;
&lt;br /&gt;
=Installing Rebuild on Recore=&lt;br /&gt;
Recore has eMMC (embedded MMC), so in order to install software on the board, a USB drive must be used. For instructions on making a flasher image, have a look at [[Reflash]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
In order to install Rebuild v1.1.0, you need to use Reflash v1.1.0. There is a blog post explaining this new way to install an image on Recore: https://www.iagent.no/2024/05/08/reflash-a-new-way-to-upgrade-firmware/&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Latest images==&lt;br /&gt;
The latest images for Recore are available from github. You can choose to download an image directly from within Reflash, or you can choose to download first and then upload it. Here are the latest images: https://github.com/intelligent-agent/Rebuild/releases&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
[[File:USB-C.png|thumb]]&lt;br /&gt;
[[File:Ethernet.png|thumb]]&lt;br /&gt;
[[File:Blink.png|thumb]]&lt;br /&gt;
[[File:Http.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
It can be a good idea to test the board on the bench before installing it in the printer. Use the USB-C connector or the 24V power plug to power the board and connect the ethernet cable between the board and your local network. &lt;br /&gt;
&lt;br /&gt;
Once power is applied, you should see a white LED light up in the middle of the board. After a few seconds, there should be activity on the eMMC LED, the CPU LED and on the heartbeat LED. &lt;br /&gt;
&lt;br /&gt;
Once the board is powered up, use a computer to access the web interface provided by OctoPrint/MainSail/Fluidd (the UI). &lt;br /&gt;
In order to get access the UI, a network cable must be connected to the board and to a network switch. It is also possible to use a wifi dongle, be please see &amp;quot;Known issues&amp;quot; at the bottom of the page for issues regarding Hotspot/AP.&lt;br /&gt;
If a network cable is used, the board should respond to the address:&lt;br /&gt;
http://recore.local&lt;br /&gt;
If using a wifi dongle, the default wifi network password is 12345678.&lt;br /&gt;
&lt;br /&gt;
For OctoPrint, once the interface is visible, run through the wizard to set up a new printer. &lt;br /&gt;
After the wizard is done, go to the Klipper tab in OctoPrint and edit the Klipper config file. &lt;br /&gt;
This is where the bulk of the work will happen. &lt;br /&gt;
&lt;br /&gt;
On the MainSail or Fluidd image, there should not need to be any configuration necessary. Verify that the web interface comes up and that Klipper is running as expected.&lt;br /&gt;
&lt;br /&gt;
== Klipper configuration ==&lt;br /&gt;
There is a standard klipper configuration file that comes with Refactor/Rebuild. The configuration file is set up &lt;br /&gt;
to work out of the box without anything connected on the pins of the board. The default Klipper config can be used as a starting point for building a custom config file for the printer at hand. &lt;br /&gt;
&lt;br /&gt;
After the Klipper configuration is complete, do a test print to make sure everything is working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Important&#039;&#039;&#039;====&lt;br /&gt;
If you get in a situation where Klipper is unable to start normally, replace the content of the &amp;quot;printer.cfg&amp;quot; file with the default config file that came with Rebuild. The default config file should be available in the &amp;quot;config examples&amp;quot; folder in Fluidd and Mainsail. You might need to do a full reboot of the board after going back to that default config. This is a good way to get back to a known working image. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Config-examples.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wifi on Recore==&lt;br /&gt;
Recore does not have wifi built in, but wifi can be added by using a USB dongle. There is a great dual band wifi dongle that has been tested with Recore and Rebuild and should work out of the box [[Rexfer_A0]]. Wifi can be set up to be either an access point (Hotspot) or to connect to an existing access point (wifi router). If nothing is set, the default will be to create a wifi hotspot called &amp;quot;Recore&amp;quot; with password 12345678.&lt;br /&gt;
&lt;br /&gt;
=== Wifi access point===&lt;br /&gt;
The first time Rebuild boots up, it will set up the wifi as an Access Point (AP). This is done by automatically changing the configuration of NetworkManager. The Wifi AP is called &#039;&#039;&#039;Recore&#039;&#039;&#039; and the password is &#039;&#039;&#039;12345678&#039;&#039;&#039;. This is meant as a temporary setup, so the password should be changed as soon as access is available. The default IP address for the AP is &#039;&#039;&#039;192.168.50.1&#039;&#039;&#039;. Once you have connected to the AP, either with a computer or a phone, it should be possible to gain ssh access. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh debian@192.168.50.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connecting to an external Wifi access point ===&lt;br /&gt;
If you have a Wifi dongle connected, you can connect to a local Wifi access point by using the &#039;&#039;&#039;nmtui&#039;&#039;&#039;  program. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Using nmtui&#039;&#039;&#039;====&lt;br /&gt;
nmtui is a Text UI tool to assist in managing network settings.&lt;br /&gt;
nmtui is mainly navigated using the arrow, space, enter, tab &amp;amp; escape keys.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
# Use SSH or the serial port to log in to the device.&lt;br /&gt;
# Start &#039;&#039;&#039;nmtui&#039;&#039;&#039;&lt;br /&gt;
# Select Activate connection&lt;br /&gt;
# Select wifi network and enter credentials&lt;br /&gt;
# Exit nmtui and verify connection to the wifi network with &#039;&#039;&#039;ip addr&#039;&#039;&#039; (If you connect via wifi hotspot, you will be disconnected)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Nmtui.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SSH access==&lt;br /&gt;
Most of the configuration for Klipper can be handled via the UI, but sometimes it is necessary to have SSH access to the board. By default, the SSH access is disabled, but it can be enabled in three ways.&lt;br /&gt;
# You can choose &amp;quot;enable SSH on new image&amp;quot; in the Reflash user interface&lt;br /&gt;
# You can start the SSH service from Mainsail/Fluidd&lt;br /&gt;
# You can start the ssh service from the serial port. The ssh service will then be persistent on next boot. &amp;lt;pre&amp;gt;systemctl start ssh&amp;lt;/pre&amp;gt;. &lt;br /&gt;
SSH access is only enabled for user &#039;&#039;&#039;debian&#039;&#039;&#039; using the password &#039;&#039;&#039;temppwd&#039;&#039;&#039;.&lt;br /&gt;
The first time you log in, you will be prompted to change the password. After the password has been changed, you will need to log in again. If you do not log in within an hour of enabling SSH, &#039;&#039;&#039;the SSH access will be disabled&#039;&#039;&#039;. This is for security reasons, it&#039;s not good to have an open SSH port with the default password. If the SSH access is disabled, it can be enabled again from the user interface.&lt;br /&gt;
&lt;br /&gt;
===Two users: debian and printer===&lt;br /&gt;
Since v1.1.0 Rebuild has two users, for security:&lt;br /&gt;
* &#039;&#039;&#039;debian&#039;&#039;&#039; is the account you log in as, over SSH or the serial port. The first login forces you to change its default password.&lt;br /&gt;
* &#039;&#039;&#039;printer&#039;&#039;&#039; runs Klipper, Moonraker and KlipperScreen. Klipper is in &amp;lt;code&amp;gt;/home/printer/klipper&amp;lt;/code&amp;gt; and the configuration in &amp;lt;code&amp;gt;/home/printer/printer_data/config&amp;lt;/code&amp;gt;.&lt;br /&gt;
The printer software runs under its own account because a service cannot run under an account whose password has expired: Moonraker restarts services through &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; refuses an expired account. The separate account is what makes the forced password change on &#039;&#039;&#039;debian&#039;&#039;&#039; possible.&lt;br /&gt;
&lt;br /&gt;
To work in Klipper&#039;s files, for example to install a Klipper plugin, log in as &#039;&#039;&#039;debian&#039;&#039;&#039; and switch to &#039;&#039;&#039;printer&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -u printer -i&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Run the plugin&#039;s own commands there. Anything that needs &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, such as &amp;lt;code&amp;gt;apt install&amp;lt;/code&amp;gt; or restarting Klipper, is run as &#039;&#039;&#039;debian&#039;&#039;&#039;: type &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt; to get back.&lt;br /&gt;
&lt;br /&gt;
====Recommended hardening on v1.1.0====&lt;br /&gt;
In v1.1.0 the &#039;&#039;&#039;printer&#039;&#039;&#039; account can still log in with a password and belongs to the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; group. It does not need either. Remove both once, logged in as &#039;&#039;&#039;debian&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo gpasswd -d printer sudo&lt;br /&gt;
sudo passwd -l printer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Klipper, Moonraker and KlipperScreen keep working: the rights they need do not depend on either. The next release of Rebuild will be built this way.&lt;br /&gt;
&lt;br /&gt;
==Serial port acccess==&lt;br /&gt;
The USB-C port can be used to get a serial port interface to the board. Once the board is connected and booted, you should be able to see the board show up as a USB device. The serial interface can be used with Minicom on Linux, and PuTTY on Windows. &lt;br /&gt;
&lt;br /&gt;
===Upgrading Debian via apt upgrade===&lt;br /&gt;
The /boot partition of Rebuild is mounted &amp;quot;read only&amp;quot;, so it will have to be remounted as Read Write before running an upgrade. This is handled automatically by apt in this version: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable host mode on the USB-C connector ===&lt;br /&gt;
On Recore A7, the host mode for the USB C connector is activated using a device tree overlay. On A8, this is handled automatically.&lt;br /&gt;
To enable the host mode on Recore A7 write the following on the command line. First SSH into the board. Recore A6 and A5 can not operate in host mode with +5V output. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mount -o remount,rw /boot&lt;br /&gt;
sudo armbian-add-overlay /boot/overlay-user/sun50i-a64-usb-host.dts&lt;br /&gt;
sudo mount -o remount,ro /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using Moonraker and Mainsail==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Mainsail.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using KlipperScreen==&lt;br /&gt;
KlipperScreen is running on X, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /usr/share/X11/xorg.conf.d/90-monitor.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
    Identifier &amp;quot;None-1&amp;quot;&lt;br /&gt;
    Option &amp;quot;Rotate&amp;quot; &amp;quot;left&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;The connector name changed in v1.1.0&#039;&#039;&#039;====&lt;br /&gt;
Because the panel is now driven by simpledrm, the connector reports as &#039;&#039;Unknown&#039;&#039; rather than HDMI: it is &#039;&#039;&#039;Unknown-1&#039;&#039;&#039; to the kernel and &#039;&#039;&#039;None-1&#039;&#039;&#039; to Xorg, where v1.0.x had HDMI-A-1 and HDMI-1. Anything that matches on the connector name - a monitor section, a &amp;lt;code&amp;gt;video=&amp;lt;/code&amp;gt; argument, a Weston output - has to use the new name. The shipped configuration carries both, so it keeps working either way.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After that, KlipperScreen can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart KlipperScreen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it is necessary to rotate the touch panel as well, here is a useful section that can be added to the bottom of that same file. Uncomment the rotation that matches your setup.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;InputClass&amp;quot;&lt;br /&gt;
            Identifier &amp;quot;Coordinate Transformation Matrix&amp;quot;&lt;br /&gt;
            MatchIsTouchscreen &amp;quot;on&amp;quot;&lt;br /&gt;
            MatchDevicePath &amp;quot;/dev/input/event*&amp;quot;&lt;br /&gt;
            MatchDriver &amp;quot;libinput&amp;quot;&lt;br /&gt;
            Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;1 0 0 0 1 0 0 0 1&amp;quot;    # 0 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 1 0 -1 0 1 0 0 1&amp;quot;  # 90 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;-1 0 1 0 -1 1 0 0 1&amp;quot; # 180 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 -1 1 1 0 0 0 0 1&amp;quot;  # 270 degrees&lt;br /&gt;
&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Recompiling and installing binaries==&lt;br /&gt;
===Update u-boot on Recore===&lt;br /&gt;
This is not something the regular user would need to do, but documented here for convenience. &lt;br /&gt;
Place u-boot-sunxi-with-spl.bin in sector 15 (8KB offset)  &lt;br /&gt;
Flash the binary &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk2 bs=1024 seek=8 conv=notrunc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AR100 firmware===&lt;br /&gt;
The AR100 CPU needs a binary file that is loaded on startup by the systemd file klipper.service&lt;br /&gt;
The AR100 binary file comes pre-compiled in Refactor, so most users should not have to re-compile it. &lt;br /&gt;
For experiments the AR100 binary can be recompiled on Recore (architecture aarch64) or on a host computer (amd64 or similar).  &lt;br /&gt;
&lt;br /&gt;
====Compiling the ar100 binary====&lt;br /&gt;
To configure klipper for AR100 and build the binary:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -u printer -i&lt;br /&gt;
cd ~/klipper&lt;br /&gt;
cp test/configs/ar100.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will produce a bin file located in out/ar100.bin, so it should be copied to /opt/firmware&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo cp /home/printer/klipper/out/ar100.bin /opt/firmware/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Once the AR100 binary has been updated, klipper.service can be restarted which then loads the new AR100 binary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for ARM64====&lt;br /&gt;
The AR100 needs a cross compilation toolchain. For ARM64, it can be downloaded from feeds.iagent.no:&lt;br /&gt;
&lt;br /&gt;
http://feeds.iagent.no/toolchains/  &lt;br /&gt;
&lt;br /&gt;
The toolchain has been built with  &lt;br /&gt;
&lt;br /&gt;
https://github.com/richfelker/musl-cross-make&lt;br /&gt;
&lt;br /&gt;
GCC version: 11.2.0&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for x86_64====&lt;br /&gt;
The toolchain used during automatic testing and is the same used for the CRUST firmware project: &lt;br /&gt;
&lt;br /&gt;
https://github.com/crust-firmware/crust#building-the-firmware&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===STM32 firmware===&lt;br /&gt;
&lt;br /&gt;
The firmware for the stm32f031 mcu that is responsible for ADC &lt;br /&gt;
conversions and PWM for heaters and fans comes pre-installed in the flash of the MCU. &lt;br /&gt;
It can be recreated on the board using the Klipper build system.&lt;br /&gt;
&lt;br /&gt;
In the olden days, we used to do it manually.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -u printer -i&lt;br /&gt;
cd ~/klipper&lt;br /&gt;
cp test/configs/stm32f031.config .config&lt;br /&gt;
make menuconfig&lt;br /&gt;
-&amp;gt; Enable extra low-level configuration options&lt;br /&gt;
-&amp;gt; Processor model (STM32F031)&lt;br /&gt;
-&amp;gt; Bootloader offset (No bootloader)&lt;br /&gt;
-&amp;gt; Clock Reference (Internal clock)&lt;br /&gt;
-&amp;gt; (16) Internal clock trim override&lt;br /&gt;
-&amp;gt; Communication interface (Serial (on USART2 PA15/PA14))&lt;br /&gt;
-&amp;gt; Baud rate for serial port: 250000&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the newer days, you can copy the config that is used by Rebuild. Please note that this is for Recore A8, which has the 32 KB flash version of the STM32.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -u printer -i&lt;br /&gt;
cd ~/klipper&lt;br /&gt;
wget https://raw.githubusercontent.com/intelligent-agent/Rebuild/refs/tags/v1.1.0/userpatches/overlay/klipper/stm32f031-32KB-serial.config&lt;br /&gt;
cp stm32f031-32KB-serial.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Flashing STM32 firmware====&lt;br /&gt;
To flash the STM32 firmware, type &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt; to get back to &#039;&#039;&#039;debian&#039;&#039;&#039; first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mv /opt/firmware/stm32-32KB.bin /opt/firmware/stm32-32KB_old.bin&lt;br /&gt;
sudo cp /home/printer/klipper/out/klipper.bin /opt/firmware/stm32-32KB.bin&lt;br /&gt;
sudo flash-stm32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Klipper===&lt;br /&gt;
Klipper is run as a systemd service. It should not normally need to be restarted from the command line, but during development it can be necessary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The log for Klipper is located in /tmp. It can be viewed as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tail -f /tmp/klippy.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Klipper can also be restarted from the OctoPrint interface. On the &amp;quot;Klipper&amp;quot; tab, press &amp;quot;Firmware&amp;quot; to restart the Klipper firmware. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Klipper-firmware-press.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Toggle===&lt;br /&gt;
Toggle is started automatically by the systemd service toggle.service. A user is created for Toggle on first boot, but the credentials are not set until a user is created in OctoPrint. Once the wizard has been completed, the Toggle user is active, but the credentials will not be valid until OctoPrint is restarted. Therefore, if Toggle is needed, restart OctoPrint after the wizard is complete.&lt;br /&gt;
&lt;br /&gt;
Toggle is running on Weston, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/xdg/weston/weston.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Edit the section about rotation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[output]&lt;br /&gt;
name=HDMI-A-1&lt;br /&gt;
transform=rotate-90&lt;br /&gt;
&lt;br /&gt;
[output]&lt;br /&gt;
name=Unknown-1&lt;br /&gt;
transform=rotate-90&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Both sections are given deliberately: the output is &#039;&#039;&#039;Unknown-1&#039;&#039;&#039; under simpledrm, which is what v1.1.0 ships, and &#039;&#039;&#039;HDMI-A-1&#039;&#039;&#039; on the older driver. Weston applies whichever one matches and ignores the other, so a single file works on both.&lt;br /&gt;
&lt;br /&gt;
After that, Weston can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart weston&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See the Ubuntu documentation for valid rotations: [https://manpages.ubuntu.com/manpages/jammy/man5/weston.ini.5.html weston.ini]&lt;br /&gt;
== Recore booting ==&lt;br /&gt;
There are several stages to booting Recore, and depending on which media is installed, the boot process will &lt;br /&gt;
try and boot either from eMMC, USB host or USB device (FEL).&lt;br /&gt;
&lt;br /&gt;
The board can be booted by either pressing the &amp;quot;BOOT&amp;quot; button for 2 seconds or by applying power to either the 24V connector or the USB C connector. To shut down the board, either use the &amp;quot;shutdown&amp;quot; button from the UI or press the &amp;quot;BOOT&amp;quot; button once. It&#039;s not ideal to shut off the board by removing power directly as this can cause a corrupted file system. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From eMMC&amp;quot;&amp;gt;&lt;br /&gt;
===Booting Recore from eMMC (the normal way)===&lt;br /&gt;
# Turn on power&lt;br /&gt;
# The BROM will load u-boot SPL from eMMC&lt;br /&gt;
# The u-boot SPL will load u-boot&lt;br /&gt;
# u-boot will load Linux&lt;br /&gt;
# Linux will load the rootfs from eMMC.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From USB&amp;quot;&amp;gt;&lt;br /&gt;
===Loading u-boot from eMMC but load kernel and rootfs from USB===&lt;br /&gt;
Starting with Rebuild v1.0.0, u-boot will do a scan for a USB mass storage device and if a working version of Reflash or Rebuild or Refactor is found, it will boot to that image.&lt;br /&gt;
# Download Refactor/Rebuild/Reflash and flash it to a USB drive.&lt;br /&gt;
# Insert the USB drive in the board. &lt;br /&gt;
# Boot the board normally (Use the Boot button/apply power)&lt;br /&gt;
The board should now be have the kernel/rootfs from the USB drive.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From FEL&amp;quot;&amp;gt;&lt;br /&gt;
===Boot Recore from a USB stick using the FEL button===&lt;br /&gt;
If u-boot should be loaded from a host computer and kernel and rootfs is loaded from a USB drive:&lt;br /&gt;
# Flash the [[Reflash]] Linux distro to a USB drive. &lt;br /&gt;
# Insert the USB drive in the Recore board in one of the two host connectors close to the HDMI.&lt;br /&gt;
# Hold down the FEL button while applying power to the board via the USB-C connector.&lt;br /&gt;
# Download the Recore repository https://github.com/intelligent-agent/Recore&lt;br /&gt;
# Install the sunxi-tools program&lt;br /&gt;
# Run the fel command (&#039;&#039;&#039;make fel&#039;&#039;&#039;) from the host computer. All the necessary binarys are in the Recore repository:&lt;br /&gt;
You can read more about the steps needed to boot aboard in FEL mode on the Sunxi wiki: https://linux-sunxi.org/FEL&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Depending on what linux platform you&#039;re running from, sunxi-tools will require the following dependencies to compile properly:&lt;br /&gt;
* libftd-dev&lt;br /&gt;
* libusbx-dev&lt;br /&gt;
* libudev-dev&lt;br /&gt;
(These are Debian/ubuntu names. For Fedora, change -dev to -devel)&lt;br /&gt;
&lt;br /&gt;
This should upload u-boot from the host computer to the board via the USB cable. u-boot will then boot from the connected USB drive. &lt;br /&gt;
Please note that in some instances, the USB drive is not detected as a mass storage device without also having the VIN power connector inserted. See more in [[Recore_A6#USB_connectors_not_discovered_when_powered_by_USB_device|in the &amp;quot;known errors&amp;quot; section of Recore A6]]&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running OctoPrint===&lt;br /&gt;
OctoPrint is stated on boot. If there is a need to restart the daemon, use this command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart octoprint&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues==&lt;br /&gt;
===A display connected after boot is not detected===&lt;br /&gt;
The panel is driven from the framebuffer U-Boot set up, so the mode is whatever U-Boot read from the display&#039;s EDID at power-on. A display plugged in while the board is running will not be picked up - reboot with it connected. A different panel that is present at boot works normally, because U-Boot reads its EDID too. This is the trade for a flicker-free boot: there is no KMS and no runtime hotplug on this path.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.2.0&amp;diff=1671</id>
		<title>Rebuild v1.2.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.2.0&amp;diff=1671"/>
		<updated>2026-09-30T11:45:49Z</updated>

		<summary type="html">&lt;p&gt;Elias: Draft of the v1.2.0 release page (not released; unlinked)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOINDEX__&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Draft - Rebuild v1.2.0 has not been released&#039;&#039;&#039;====&lt;br /&gt;
This page collects the documentation for the next release while it is being built. The changes it describes are on development branches and may still change. For the current release, see [[Rebuild v1.1.0]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Rebuild header.png|center]]&lt;br /&gt;
Rebuild is a complete Linux image for [[Recore A8|Recore]] 3D printer controller boards. Rebuild comes with Klipper installed and the choice of either [https://docs.mainsail.xyz/ Mainsail], [https://docs.fluidd.xyz/ Fluidd] or [https://octoprint.org/ OctoPrint].&lt;br /&gt;
&lt;br /&gt;
=What is new in v1.2.0=&lt;br /&gt;
&lt;br /&gt;
==Rebuild&#039;s own files are Debian packages==&lt;br /&gt;
Everything Rebuild adds to the base system is now installed from two packages, rather than copied into the image by the build scripts:&lt;br /&gt;
* &#039;&#039;&#039;rebuild-recore&#039;&#039;&#039;, on every image including barebone: the board tools (&amp;lt;code&amp;gt;get-serial-number&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get-recore-revision&amp;lt;/code&amp;gt; and friends), the USB-C serial console, and the Wi-Fi hotspot fallback.&lt;br /&gt;
* &#039;&#039;&#039;rebuild-printer&#039;&#039;&#039;, on the Fluidd, Mainsail and OctoPrint images: the tools that flash the AR100, STM32 and RP2040 firmware, the configurations that firmware is built from, first boot, SSH auto-disable, the boot splash, and the system settings the printer images share.&lt;br /&gt;
&lt;br /&gt;
This means that a fix to any of these files can reach a board through &amp;lt;code&amp;gt;apt upgrade&amp;lt;/code&amp;gt;, instead of requiring a new image and a reflash.&lt;br /&gt;
&lt;br /&gt;
The tools have moved from &amp;lt;code&amp;gt;/usr/local/bin&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/bin&amp;lt;/code&amp;gt;. On a board that is upgraded in place, the old paths keep working: they become links to the new ones. The files the old image had copied in are kept in &amp;lt;code&amp;gt;/var/backups/rebuild-legacy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
* The &#039;&#039;&#039;printer&#039;&#039;&#039; account is now a service account. It has no password, is not in the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; group, and cannot log in over SSH. Klipper, Moonraker and KlipperScreen keep working: the rights they need are given to them explicitly. Log in as &#039;&#039;&#039;debian&#039;&#039;&#039;, and use &amp;lt;code&amp;gt;sudo -u printer -i&amp;lt;/code&amp;gt; to work in Klipper&#039;s files, as before.&lt;br /&gt;
&lt;br /&gt;
==A smaller image==&lt;br /&gt;
* &#039;&#039;&#039;Input shaper graphs are no longer drawn on the printer by default.&#039;&#039;&#039; &amp;lt;code&amp;gt;python3-matplotlib&amp;lt;/code&amp;gt; is not installed, which saves 242 MB. Klipper itself never used it. See [[#Input shaper graphs|Input shaper graphs]] below.&lt;br /&gt;
* The ARM compiler no longer carries libraries for Cortex-A and Cortex-R processors, which Klipper never builds for, and the firmware package no longer carries firmware for Qualcomm processors. Together these save about 630 MB. Every Cortex-M variant is kept, so firmware for any microcontroller Klipper supports can still be built on the printer, with any options (CAN bus, USB to CAN bridge, and so on).&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
&lt;br /&gt;
==Building firmware on the printer==&lt;br /&gt;
The configurations Rebuild uses for its own firmware are installed with the image, in &amp;lt;code&amp;gt;/usr/share/rebuild/firmware&amp;lt;/code&amp;gt;. To rebuild the STM32 firmware for a Recore A8 (32 KB flash):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -u printer -i&lt;br /&gt;
cd ~/klipper&lt;br /&gt;
cp /usr/share/rebuild/firmware/stm32f031-32KB-serial.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The same directory has &amp;lt;code&amp;gt;stm32f031-serial.config&amp;lt;/code&amp;gt;, for the 16 KB STM32 on earlier boards, and &amp;lt;code&amp;gt;ar100.config&amp;lt;/code&amp;gt;. Flashing works as described in [[Rebuild v1.1.0#Flashing STM32 firmware|v1.1.0]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Use one or two build jobs&#039;&#039;&#039;====&lt;br /&gt;
A Recore without a fan can reach its critical temperature with all four cores compiling, and it then powers itself off. Build with &amp;lt;code&amp;gt;make -j2&amp;lt;/code&amp;gt; or plain &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;make -j4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Input shaper graphs==&lt;br /&gt;
Klipper&#039;s resonance measurement does not need anything extra. &amp;lt;code&amp;gt;SHAPER_CALIBRATE&amp;lt;/code&amp;gt; runs inside Klipper, measures both axes, recommends a shaper for each and saves it with &amp;lt;code&amp;gt;SAVE_CONFIG&amp;lt;/code&amp;gt;. That works on v1.2.0 exactly as before.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;graphs&#039;&#039;&#039; are optional. They are drawn by Klipper&#039;s scripts (&amp;lt;code&amp;gt;scripts/calibrate_shaper.py&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;scripts/graph_accelerometer.py&amp;lt;/code&amp;gt;), which need the Python plotting library &amp;lt;code&amp;gt;matplotlib&amp;lt;/code&amp;gt;. v1.2.0 no longer installs it. There are two ways to get graphs.&lt;br /&gt;
&lt;br /&gt;
===Draw the graphs on your computer (recommended)===&lt;br /&gt;
The picture is looked at on a computer anyway, so draw it there. First measure on the printer, from the console in Fluidd or Mainsail:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TEST_RESONANCES AXIS=X&lt;br /&gt;
TEST_RESONANCES AXIS=Y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Klipper writes the measurements to &amp;lt;code&amp;gt;/tmp/resonances_x_*.csv&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/tmp/resonances_y_*.csv&amp;lt;/code&amp;gt; on the printer. Copy them to your computer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp debian@recore.local:/tmp/resonances_*.csv .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then, on the computer, with Python 3 installed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Klipper3d/klipper&lt;br /&gt;
python3 -m pip install numpy matplotlib&lt;br /&gt;
python3 klipper/scripts/calibrate_shaper.py resonances_x_*.csv -o shaper_calibrate_x.png&lt;br /&gt;
python3 klipper/scripts/calibrate_shaper.py resonances_y_*.csv -o shaper_calibrate_y.png&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install matplotlib on the printer===&lt;br /&gt;
If you would rather draw the graphs on the printer, as described in [https://www.klipper3d.org/Measuring_Resonances.html Klipper&#039;s documentation], install matplotlib first, logged in as &#039;&#039;&#039;debian&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install python3-matplotlib&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This takes about 240 MB. Klipper&#039;s scripts then work as described in its documentation.&lt;br /&gt;
&lt;br /&gt;
Plugins that draw these graphs themselves, such as Shake&amp;amp;Tune, install their own copy of matplotlib and do not need either step.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.1.0&amp;diff=1670</id>
		<title>Rebuild v1.1.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.1.0&amp;diff=1670"/>
		<updated>2026-09-29T20:47:13Z</updated>

		<summary type="html">&lt;p&gt;Elias: Explain the debian and printer users, add hardening for v1.1.0, and use /home/printer/klipper in the build instructions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Rebuild header.png|center]]&lt;br /&gt;
Rebuild is a complete Linux image for [[Recore A8|Recore]] 3D printer controller boards. Rebuild comes with Klipper installed and the choice of either [https://docs.mainsail.xyz/ MainSail], [https://docs.fluidd.xyz/ Fluidd] or [https://octoprint.org/ OctoPrint]. The name Rebuild is a reflection of the [https://www.armbian.com/ Armbian] build system, but adapted for Recore boards. &lt;br /&gt;
&lt;br /&gt;
Rebuild has now been released as v1.1.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;There is no in-place upgrade to v1.1.0&#039;&#039;&#039;====&lt;br /&gt;
The base OS, the kernel and U-Boot have all moved, and U-Boot does not live in the filesystem, so &amp;lt;code&amp;gt;apt upgrade&amp;lt;/code&amp;gt; on a v1.0.x board will not get you here. &#039;&#039;&#039;Flash a fresh image.&#039;&#039;&#039; Save &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt; and anything else you have customised first.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=What is new in v1.1.0=&lt;br /&gt;
&lt;br /&gt;
==A new base==&lt;br /&gt;
* Debian 13 (trixie) on Armbian 26.08, running the &#039;&#039;&#039;6.18.50&#039;&#039;&#039; kernel.&lt;br /&gt;
* Rebuild and [[Reflash v1.1.0|Reflash]] are now built against the same kernel. They had drifted apart across kernel version, branch and Armbian release, which meant a kernel fix landed in one image but not the other.&lt;br /&gt;
* &#039;&#039;&#039;U-Boot 2026.07&#039;&#039;&#039;, replacing 2024.01.&lt;br /&gt;
&lt;br /&gt;
==The display==&lt;br /&gt;
* The panel is driven by &#039;&#039;&#039;simpledrm&#039;&#039;&#039;, adopting the framebuffer U-Boot has already set up from the display&#039;s EDID. The result is one mode from U-Boot through Plymouth to KlipperScreen, with no mode change and no flicker anywhere in the chain.&lt;br /&gt;
* This replaces a path where the HDMI driver could misread hotplug as low for about half a second while its PHY came up, get no EDID inside that window, and invent a 1024x768 mode. The framebuffer is allocated once and cannot grow, so that guess was permanent: the panel could not lock, dropped sync and blanked its own backlight.&lt;br /&gt;
* A redesigned Plymouth splash, and a framebuffer console that can be rotated to match a panel that is mounted rotated.&lt;br /&gt;
* A board with no panel now says &amp;quot;no display detected&amp;quot; rather than reporting a failure, and the barebone image gives you a shell on the panel instead of a frozen splash.&lt;br /&gt;
&lt;br /&gt;
==Booting==&lt;br /&gt;
* U-Boot no longer scans the USB-C port for boot devices, and holds PD7 low so the board never sources VBUS on USB-C.&lt;br /&gt;
* &amp;lt;code&amp;gt;bootm_size&amp;lt;/code&amp;gt; is wide enough for a Reflash initrd to be relocated. On U-Boot 2026.07 the memory map persists for the whole session, so scratch loads earlier in the boot script fragmented it and the initrd had nowhere to go.&lt;br /&gt;
* U-Boot no longer hunts for a netboot server that does not exist, which used to add a delay to every boot.&lt;br /&gt;
* A failed image load no longer results in the kernel being booted anyway.&lt;br /&gt;
&lt;br /&gt;
==Printer and hardware==&lt;br /&gt;
* The Klipper RP2040 binary is built with the image and flashed on first boot, and first boot now verifies that it was actually flashed and that Klipper reached its MCUs, rather than assuming.&lt;br /&gt;
* DRAM frequency scaling is disabled on A5 and A6.&lt;br /&gt;
* udev no longer probes the RP2 bootloader as though it were a disk.&lt;br /&gt;
* ustreamer starts from the camera device, so a camera present at boot is picked up.&lt;br /&gt;
&lt;br /&gt;
==Network and identity==&lt;br /&gt;
* &#039;&#039;&#039;Every board now generates its own SSH host key.&#039;&#039;&#039; v1.0.x shipped one key pair inside the image, so every Recore in the world presented the same host identity.&lt;br /&gt;
* Rebuild tries the configured network for a full two minutes before falling back to the hotspot, instead of giving up early.&lt;br /&gt;
* WiFi profiles apply to whatever dongle is present, and a board with no WiFi device leaves quietly instead of failing every boot.&lt;br /&gt;
* The board can report its own serial number, in every variant including barebone.&lt;br /&gt;
&lt;br /&gt;
==Removed==&lt;br /&gt;
* &#039;&#039;&#039;armbian-config&#039;&#039;&#039; and &#039;&#039;&#039;armbian-install&#039;&#039;&#039; are no longer installed. They defeat the package holds that keep Klipper, the kernel and U-Boot at the versions the image was tested with: &amp;lt;code&amp;gt;armbian-config&amp;lt;/code&amp;gt; runs &amp;lt;code&amp;gt;apt-mark unhold&amp;lt;/code&amp;gt;, and its software installer passes &amp;lt;code&amp;gt;--allow-change-held-packages&amp;lt;/code&amp;gt;. Removing them is what makes the held versions mean something.&lt;br /&gt;
&lt;br /&gt;
=Installing Rebuild on Recore=&lt;br /&gt;
Recore has eMMC (embedded MMC), so in order to install software on the board, a USB drive must be used. For instructions on making a flasher image, have a look at [[Reflash]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
In order to install Rebuild v1.1.0, you need to use Reflash v1.1.0. There is a blog post explaining this new way to install an image on Recore: https://www.iagent.no/2024/05/08/reflash-a-new-way-to-upgrade-firmware/&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Latest images==&lt;br /&gt;
The latest images for Recore are available from github. You can choose to download an image directly from within Reflash, or you can choose to download first and then upload it. Here are the latest images: https://github.com/intelligent-agent/Rebuild/releases&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
[[File:USB-C.png|thumb]]&lt;br /&gt;
[[File:Ethernet.png|thumb]]&lt;br /&gt;
[[File:Blink.png|thumb]]&lt;br /&gt;
[[File:Http.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
It can be a good idea to test the board on the bench before installing it in the printer. Use the USB-C connector or the 24V power plug to power the board and connect the ethernet cable between the board and your local network. &lt;br /&gt;
&lt;br /&gt;
Once power is applied, you should see a white LED light up in the middle of the board. After a few seconds, there should be activity on the eMMC LED, the CPU LED and on the heartbeat LED. &lt;br /&gt;
&lt;br /&gt;
Once the board is powered up, use a computer to access the web interface provided by OctoPrint/MainSail/Fluidd (the UI). &lt;br /&gt;
In order to get access the UI, a network cable must be connected to the board and to a network switch. It is also possible to use a wifi dongle, be please see &amp;quot;Known issues&amp;quot; at the bottom of the page for issues regarding Hotspot/AP.&lt;br /&gt;
If a network cable is used, the board should respond to the address:&lt;br /&gt;
http://recore.local&lt;br /&gt;
If using a wifi dongle, the default wifi network password is 12345678.&lt;br /&gt;
&lt;br /&gt;
For OctoPrint, once the interface is visible, run through the wizard to set up a new printer. &lt;br /&gt;
After the wizard is done, go to the Klipper tab in OctoPrint and edit the Klipper config file. &lt;br /&gt;
This is where the bulk of the work will happen. &lt;br /&gt;
&lt;br /&gt;
On the MainSail or Fluidd image, there should not need to be any configuration necessary. Verify that the web interface comes up and that Klipper is running as expected.&lt;br /&gt;
&lt;br /&gt;
== Klipper configuration ==&lt;br /&gt;
There is a standard klipper configuration file that comes with Refactor/Rebuild. The configuration file is set up &lt;br /&gt;
to work out of the box without anything connected on the pins of the board. The default Klipper config can be used as a starting point for building a custom config file for the printer at hand. &lt;br /&gt;
&lt;br /&gt;
After the Klipper configuration is complete, do a test print to make sure everything is working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Important&#039;&#039;&#039;====&lt;br /&gt;
If you get in a situation where Klipper is unable to start normally, replace the content of the &amp;quot;printer.cfg&amp;quot; file with the default config file that came with Rebuild. The default config file should be available in the &amp;quot;config examples&amp;quot; folder in Fluidd and Mainsail. You might need to do a full reboot of the board after going back to that default config. This is a good way to get back to a known working image. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Config-examples.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wifi on Recore==&lt;br /&gt;
Recore does not have wifi built in, but wifi can be added by using a USB dongle. There is a great dual band wifi dongle that has been tested with Recore and Rebuild and should work out of the box [[Rexfer_A0]]. Wifi can be set up to be either an access point (Hotspot) or to connect to an existing access point (wifi router). If nothing is set, the default will be to create a wifi hotspot called &amp;quot;Recore&amp;quot; with password 12345678.&lt;br /&gt;
&lt;br /&gt;
=== Wifi access point===&lt;br /&gt;
The first time Rebuild boots up, it will set up the wifi as an Access Point (AP). This is done by automatically changing the configuration of NetworkManager. The Wifi AP is called &#039;&#039;&#039;Recore&#039;&#039;&#039; and the password is &#039;&#039;&#039;12345678&#039;&#039;&#039;. This is meant as a temporary setup, so the password should be changed as soon as access is available. The default IP address for the AP is &#039;&#039;&#039;192.168.50.1&#039;&#039;&#039;. Once you have connected to the AP, either with a computer or a phone, it should be possible to gain ssh access. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh debian@192.168.50.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connecting to an external Wifi access point ===&lt;br /&gt;
If you have a Wifi dongle connected, you can connect to a local Wifi access point by using the &#039;&#039;&#039;nmtui&#039;&#039;&#039;  program. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Using nmtui&#039;&#039;&#039;====&lt;br /&gt;
nmtui is a Text UI tool to assist in managing network settings.&lt;br /&gt;
nmtui is mainly navigated using the arrow, space, enter, tab &amp;amp; escape keys.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
# Use SSH or the serial port to log in to the device.&lt;br /&gt;
# Start &#039;&#039;&#039;nmtui&#039;&#039;&#039;&lt;br /&gt;
# Select Activate connection&lt;br /&gt;
# Select wifi network and enter credentials&lt;br /&gt;
# Exit nmtui and verify connection to the wifi network with &#039;&#039;&#039;ip addr&#039;&#039;&#039; (If you connect via wifi hotspot, you will be disconnected)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Nmtui.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SSH access==&lt;br /&gt;
Most of the configuration for Klipper can be handled via the UI, but sometimes it is necessary to have SSH access to the board. By default, the SSH access is disabled, but it can be enabled in three ways.&lt;br /&gt;
# You can choose &amp;quot;enable SSH on new image&amp;quot; in the Reflash user interface&lt;br /&gt;
# You can start the SSH service from Mainsail/Fluidd&lt;br /&gt;
# You can start the ssh service from the serial port. The ssh service will then be persistent on next boot. &amp;lt;pre&amp;gt;systemctl start ssh&amp;lt;/pre&amp;gt;. &lt;br /&gt;
SSH access is only enabled for user &#039;&#039;&#039;debian&#039;&#039;&#039; using the password &#039;&#039;&#039;temppwd&#039;&#039;&#039;.&lt;br /&gt;
The first time you log in, you will be prompted to change the password. After the password has been changed, you will need to log in again. If you do not log in within an hour of enabling SSH, &#039;&#039;&#039;the SSH access will be disabled&#039;&#039;&#039;. This is for security reasons, it&#039;s not good to have an open SSH port with the default password. If the SSH access is disabled, it can be enabled again from the user interface.&lt;br /&gt;
&lt;br /&gt;
===Two users: debian and printer===&lt;br /&gt;
Since v1.1.0 Rebuild has two users, for security:&lt;br /&gt;
* &#039;&#039;&#039;debian&#039;&#039;&#039; is the account you log in as, over SSH or the serial port. The first login forces you to change its default password.&lt;br /&gt;
* &#039;&#039;&#039;printer&#039;&#039;&#039; runs Klipper, Moonraker and KlipperScreen. Klipper is in &amp;lt;code&amp;gt;/home/printer/klipper&amp;lt;/code&amp;gt; and the configuration in &amp;lt;code&amp;gt;/home/printer/printer_data/config&amp;lt;/code&amp;gt;.&lt;br /&gt;
The printer software runs under its own account because a service cannot run under an account whose password has expired: Moonraker restarts services through &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; refuses an expired account. The separate account is what makes the forced password change on &#039;&#039;&#039;debian&#039;&#039;&#039; possible.&lt;br /&gt;
&lt;br /&gt;
To work in Klipper&#039;s files, for example to install a Klipper plugin, log in as &#039;&#039;&#039;debian&#039;&#039;&#039; and switch to &#039;&#039;&#039;printer&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -u printer -i&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Run the plugin&#039;s own commands there. Anything that needs &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, such as &amp;lt;code&amp;gt;apt install&amp;lt;/code&amp;gt; or restarting Klipper, is run as &#039;&#039;&#039;debian&#039;&#039;&#039;: type &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt; to get back.&lt;br /&gt;
&lt;br /&gt;
====Recommended hardening on v1.1.0====&lt;br /&gt;
In v1.1.0 the &#039;&#039;&#039;printer&#039;&#039;&#039; account can still log in with a password and belongs to the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; group. It does not need either. Remove both once, logged in as &#039;&#039;&#039;debian&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo gpasswd -d printer sudo&lt;br /&gt;
sudo passwd -l printer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Klipper, Moonraker and KlipperScreen keep working: the rights they need do not depend on either. The next release of Rebuild will be built this way.&lt;br /&gt;
&lt;br /&gt;
==Serial port acccess==&lt;br /&gt;
The USB-C port can be used to get a serial port interface to the board. Once the board is connected and booted, you should be able to see the board show up as a USB device. The serial interface can be used with Minicom on Linux, and PuTTY on Windows. &lt;br /&gt;
&lt;br /&gt;
===Upgrading Debian via apt upgrade===&lt;br /&gt;
The /boot partition of Rebuild is mounted &amp;quot;read only&amp;quot;, so it will have to be remounted as Read Write before running an upgrade. This is handled automatically by apt in this version: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable host mode on the USB-C connector ===&lt;br /&gt;
On Recore A7, the host mode for the USB C connector is activated using a device tree overlay. On A8, this is handled automatically.&lt;br /&gt;
To enable the host mode on Recore A7 write the following on the command line. First SSH into the board. Recore A6 and A5 can not operate in host mode with +5V output. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mount -o remount,rw /boot&lt;br /&gt;
sudo armbian-add-overlay /boot/overlay-user/sun50i-a64-usb-host.dts&lt;br /&gt;
sudo mount -o remount,ro /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using Moonraker and Mainsail==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Mainsail.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using KlipperScreen==&lt;br /&gt;
KlipperScreen is running on X, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /usr/share/X11/xorg.conf.d/90-monitor.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
    Identifier &amp;quot;None-1&amp;quot;&lt;br /&gt;
    Option &amp;quot;Rotate&amp;quot; &amp;quot;left&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;The connector name changed in v1.1.0&#039;&#039;&#039;====&lt;br /&gt;
Because the panel is now driven by simpledrm, the connector reports as &#039;&#039;Unknown&#039;&#039; rather than HDMI: it is &#039;&#039;&#039;Unknown-1&#039;&#039;&#039; to the kernel and &#039;&#039;&#039;None-1&#039;&#039;&#039; to Xorg, where v1.0.x had HDMI-A-1 and HDMI-1. Anything that matches on the connector name - a monitor section, a &amp;lt;code&amp;gt;video=&amp;lt;/code&amp;gt; argument, a Weston output - has to use the new name. The shipped configuration carries both, so it keeps working either way.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After that, KlipperScreen can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart KlipperScreen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it is necessary to rotate the touch panel as well, here is a useful section that can be added to the bottom of that same file. Uncomment the rotation that matches your setup.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;InputClass&amp;quot;&lt;br /&gt;
            Identifier &amp;quot;Coordinate Transformation Matrix&amp;quot;&lt;br /&gt;
            MatchIsTouchscreen &amp;quot;on&amp;quot;&lt;br /&gt;
            MatchDevicePath &amp;quot;/dev/input/event*&amp;quot;&lt;br /&gt;
            MatchDriver &amp;quot;libinput&amp;quot;&lt;br /&gt;
            Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;1 0 0 0 1 0 0 0 1&amp;quot;    # 0 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 1 0 -1 0 1 0 0 1&amp;quot;  # 90 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;-1 0 1 0 -1 1 0 0 1&amp;quot; # 180 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 -1 1 1 0 0 0 0 1&amp;quot;  # 270 degrees&lt;br /&gt;
&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Recompiling and installing binaries==&lt;br /&gt;
===Update u-boot on Recore===&lt;br /&gt;
This is not something the regular user would need to do, but documented here for convenience. &lt;br /&gt;
Place u-boot-sunxi-with-spl.bin in sector 15 (8KB offset)  &lt;br /&gt;
Flash the binary &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk2 bs=1024 seek=8 conv=notrunc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AR100 firmware===&lt;br /&gt;
The AR100 CPU needs a binary file that is loaded on startup by the systemd file klipper.service&lt;br /&gt;
The AR100 binary file comes pre-compiled in Refactor, so most users should not have to re-compile it. &lt;br /&gt;
For experiments the AR100 binary can be recompiled on Recore (architecture aarch64) or on a host computer (amd64 or similar).  &lt;br /&gt;
&lt;br /&gt;
====Compiling the ar100 binary====&lt;br /&gt;
To configure klipper for AR100 and build the binary:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -u printer -i&lt;br /&gt;
cd ~/klipper&lt;br /&gt;
cp test/configs/ar100.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will produce a bin file located in out/ar100.bin, so it should be copied to /opt/firmware&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo cp /home/printer/klipper/out/ar100.bin /opt/firmware/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Once the AR100 binary has been updated, klipper.service can be restarted which then loads the new AR100 binary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for ARM64====&lt;br /&gt;
The AR100 needs a cross compilation toolchain. For ARM64, it can be downloaded from feeds.iagent.no:&lt;br /&gt;
&lt;br /&gt;
http://feeds.iagent.no/toolchains/  &lt;br /&gt;
&lt;br /&gt;
The toolchain has been built with  &lt;br /&gt;
&lt;br /&gt;
https://github.com/richfelker/musl-cross-make&lt;br /&gt;
&lt;br /&gt;
GCC version: 11.2.0&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for x86_64====&lt;br /&gt;
The toolchain used during automatic testing and is the same used for the CRUST firmware project: &lt;br /&gt;
&lt;br /&gt;
https://github.com/crust-firmware/crust#building-the-firmware&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===STM32 firmware===&lt;br /&gt;
&lt;br /&gt;
The firmware for the stm32f031 mcu that is responsible for ADC &lt;br /&gt;
conversions and PWM for heaters and fans comes pre-installed in the flash of the MCU. &lt;br /&gt;
It can be recreated on the board using the Klipper build system.&lt;br /&gt;
&lt;br /&gt;
In the olden days, we used to do it manually.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -u printer -i&lt;br /&gt;
cd ~/klipper&lt;br /&gt;
cp test/configs/stm32f031.config .config&lt;br /&gt;
make menuconfig&lt;br /&gt;
-&amp;gt; Enable extra low-level configuration options&lt;br /&gt;
-&amp;gt; Processor model (STM32F031)&lt;br /&gt;
-&amp;gt; Bootloader offset (No bootloader)&lt;br /&gt;
-&amp;gt; Clock Reference (Internal clock)&lt;br /&gt;
-&amp;gt; (16) Internal clock trim override&lt;br /&gt;
-&amp;gt; Communication interface (Serial (on USART2 PA15/PA14))&lt;br /&gt;
-&amp;gt; Baud rate for serial port: 250000&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the newer days, you can copy the config that is used by Rebuild. Please note that this is for Recore A8, which has the 32 KB flash version of the STM32.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -u printer -i&lt;br /&gt;
cd ~/klipper&lt;br /&gt;
wget https://raw.githubusercontent.com/intelligent-agent/Rebuild/refs/heads/main/userpatches/overlay/klipper/stm32f031-32KB-serial.config&lt;br /&gt;
cp stm32f031-32KB-serial.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Flashing STM32 firmware====&lt;br /&gt;
To flash the STM32 firmware, type &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt; to get back to &#039;&#039;&#039;debian&#039;&#039;&#039; first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mv /opt/firmware/stm32-32KB.bin /opt/firmware/stm32-32KB_old.bin&lt;br /&gt;
sudo cp /home/printer/klipper/out/klipper.bin /opt/firmware/stm32-32KB.bin&lt;br /&gt;
sudo flash-stm32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Klipper===&lt;br /&gt;
Klipper is run as a systemd service. It should not normally need to be restarted from the command line, but during development it can be necessary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The log for Klipper is located in /tmp. It can be viewed as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tail -f /tmp/klippy.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Klipper can also be restarted from the OctoPrint interface. On the &amp;quot;Klipper&amp;quot; tab, press &amp;quot;Firmware&amp;quot; to restart the Klipper firmware. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Klipper-firmware-press.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Toggle===&lt;br /&gt;
Toggle is started automatically by the systemd service toggle.service. A user is created for Toggle on first boot, but the credentials are not set until a user is created in OctoPrint. Once the wizard has been completed, the Toggle user is active, but the credentials will not be valid until OctoPrint is restarted. Therefore, if Toggle is needed, restart OctoPrint after the wizard is complete.&lt;br /&gt;
&lt;br /&gt;
Toggle is running on Weston, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/xdg/weston/weston.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Edit the section about rotation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[output]&lt;br /&gt;
name=HDMI-A-1&lt;br /&gt;
transform=rotate-90&lt;br /&gt;
&lt;br /&gt;
[output]&lt;br /&gt;
name=Unknown-1&lt;br /&gt;
transform=rotate-90&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Both sections are given deliberately: the output is &#039;&#039;&#039;Unknown-1&#039;&#039;&#039; under simpledrm, which is what v1.1.0 ships, and &#039;&#039;&#039;HDMI-A-1&#039;&#039;&#039; on the older driver. Weston applies whichever one matches and ignores the other, so a single file works on both.&lt;br /&gt;
&lt;br /&gt;
After that, Weston can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart weston&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See the Ubuntu documentation for valid rotations: [https://manpages.ubuntu.com/manpages/jammy/man5/weston.ini.5.html weston.ini]&lt;br /&gt;
== Recore booting ==&lt;br /&gt;
There are several stages to booting Recore, and depending on which media is installed, the boot process will &lt;br /&gt;
try and boot either from eMMC, USB host or USB device (FEL).&lt;br /&gt;
&lt;br /&gt;
The board can be booted by either pressing the &amp;quot;BOOT&amp;quot; button for 2 seconds or by applying power to either the 24V connector or the USB C connector. To shut down the board, either use the &amp;quot;shutdown&amp;quot; button from the UI or press the &amp;quot;BOOT&amp;quot; button once. It&#039;s not ideal to shut off the board by removing power directly as this can cause a corrupted file system. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From eMMC&amp;quot;&amp;gt;&lt;br /&gt;
===Booting Recore from eMMC (the normal way)===&lt;br /&gt;
# Turn on power&lt;br /&gt;
# The BROM will load u-boot SPL from eMMC&lt;br /&gt;
# The u-boot SPL will load u-boot&lt;br /&gt;
# u-boot will load Linux&lt;br /&gt;
# Linux will load the rootfs from eMMC.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From USB&amp;quot;&amp;gt;&lt;br /&gt;
===Loading u-boot from eMMC but load kernel and rootfs from USB===&lt;br /&gt;
Starting with Rebuild v1.0.0, u-boot will do a scan for a USB mass storage device and if a working version of Reflash or Rebuild or Refactor is found, it will boot to that image.&lt;br /&gt;
# Download Refactor/Rebuild/Reflash and flash it to a USB drive.&lt;br /&gt;
# Insert the USB drive in the board. &lt;br /&gt;
# Boot the board normally (Use the Boot button/apply power)&lt;br /&gt;
The board should now be have the kernel/rootfs from the USB drive.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From FEL&amp;quot;&amp;gt;&lt;br /&gt;
===Boot Recore from a USB stick using the FEL button===&lt;br /&gt;
If u-boot should be loaded from a host computer and kernel and rootfs is loaded from a USB drive:&lt;br /&gt;
# Flash the [[Reflash]] Linux distro to a USB drive. &lt;br /&gt;
# Insert the USB drive in the Recore board in one of the two host connectors close to the HDMI.&lt;br /&gt;
# Hold down the FEL button while applying power to the board via the USB-C connector.&lt;br /&gt;
# Download the Recore repository https://github.com/intelligent-agent/Recore&lt;br /&gt;
# Install the sunxi-tools program&lt;br /&gt;
# Run the fel command (&#039;&#039;&#039;make fel&#039;&#039;&#039;) from the host computer. All the necessary binarys are in the Recore repository:&lt;br /&gt;
You can read more about the steps needed to boot aboard in FEL mode on the Sunxi wiki: https://linux-sunxi.org/FEL&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Depending on what linux platform you&#039;re running from, sunxi-tools will require the following dependencies to compile properly:&lt;br /&gt;
* libftd-dev&lt;br /&gt;
* libusbx-dev&lt;br /&gt;
* libudev-dev&lt;br /&gt;
(These are Debian/ubuntu names. For Fedora, change -dev to -devel)&lt;br /&gt;
&lt;br /&gt;
This should upload u-boot from the host computer to the board via the USB cable. u-boot will then boot from the connected USB drive. &lt;br /&gt;
Please note that in some instances, the USB drive is not detected as a mass storage device without also having the VIN power connector inserted. See more in [[Recore_A6#USB_connectors_not_discovered_when_powered_by_USB_device|in the &amp;quot;known errors&amp;quot; section of Recore A6]]&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running OctoPrint===&lt;br /&gt;
OctoPrint is stated on boot. If there is a need to restart the daemon, use this command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart octoprint&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues==&lt;br /&gt;
===A display connected after boot is not detected===&lt;br /&gt;
The panel is driven from the framebuffer U-Boot set up, so the mode is whatever U-Boot read from the display&#039;s EDID at power-on. A display plugged in while the board is running will not be picked up - reboot with it connected. A different panel that is present at boot works normally, because U-Boot reads its EDID too. This is the trade for a flicker-free boot: there is no KMS and no runtime hotplug on this path.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.0.2&amp;diff=1669</id>
		<title>Rebuild v1.0.2</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.0.2&amp;diff=1669"/>
		<updated>2026-09-26T08:05:17Z</updated>

		<summary type="html">&lt;p&gt;Elias: AR100 firmware: add note on building with an updated Klipper (CROSS_PREFIX, Rebuild v1.1.0 ar100.config, size check, sudo)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Rebuild header.png|center]]&lt;br /&gt;
Rebuild is a complete Linux image for [[Recore A8|Recore]] 3D printer controller boards. Rebuild comes with Klipper installed and the choice of either [https://docs.mainsail.xyz/ MainSail], [https://docs.fluidd.xyz/ Fluidd] or [https://octoprint.org/ OctoPrint]. The name Rebuild is a reflection of the [https://www.armbian.com/ Armbian] build system, but adapted for Recore boards. &lt;br /&gt;
&lt;br /&gt;
===Rebuild and Refactor===&lt;br /&gt;
Rebuild and Refactor are very similar from a user standpoint, but the build system is different. Recore A7 and A6 come with some version of Refactor (v3.1.x), while Recore A8 comes with Rebuild (v1.0.x) pre-installed. &lt;br /&gt;
&lt;br /&gt;
Rebuild has now been released as v1.0.2&lt;br /&gt;
&lt;br /&gt;
=Installing Rebuild on Recore=&lt;br /&gt;
Recore has eMMC (embedded MMC), so in order to install sotware on the board, a USB drive must be used. For instructions on making a flasher image, have a look at [[Reflash]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
In order to install Rebuild v1.0.2, you need to use Reflash v1.0.1. There is a blog post explaining this new way to install an image on Recore: https://www.iagent.no/2024/05/08/reflash-a-new-way-to-upgrade-firmware/&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Latest images==&lt;br /&gt;
The latest images for Recore are available from github. You can choose to download an image directly from within Reflash, or you can choose to download first and then upload it. Here are the latest images: https://github.com/intelligent-agent/Rebuild/releases&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
[[File:USB-C.png|thumb]]&lt;br /&gt;
[[File:Ethernet.png|thumb]]&lt;br /&gt;
[[File:Blink.png|thumb]]&lt;br /&gt;
[[File:Http.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
It can be a good idea to test the board on the bench before installing it in the printer. Use the USB-C connector or the 24V power plug to power the board and connect the ethernet cable between the board and your local network. &lt;br /&gt;
&lt;br /&gt;
Once power is applied, you should see a white LED light up in the middle of the board. After a few seconds, there should be activity on the eMMC LED, the CPU LED and on the heartbeat LED. &lt;br /&gt;
&lt;br /&gt;
Once the board is powered up, use a computer to access the web interface provided by OctoPrint/MainSail/Fluidd (the UI). &lt;br /&gt;
In order to get access the UI, a network cable must be connected to the board and to a network switch. It is also possible to use a wifi dongle, be please see &amp;quot;Known issues&amp;quot; at the bottom of the page for issues regarding Hotspot/AP.&lt;br /&gt;
If a network cable is used, the board should respond to the address:&lt;br /&gt;
http://recore.local&lt;br /&gt;
If using a wifi dongle, the default wifi network password is 12345678.&lt;br /&gt;
&lt;br /&gt;
For OctoPrint, once the interface is visible, run through the wizard to set up a new printer. &lt;br /&gt;
After the wizard is done, go to the Klipper tab in OctoPrint and edit the Klipper config file. &lt;br /&gt;
This is where the bulk of the work will happen. &lt;br /&gt;
&lt;br /&gt;
On the MainSail or Fluidd image, there should not need to be any configuration necessary. Verify that the web interface comes up and that Klipper is running as expected.&lt;br /&gt;
&lt;br /&gt;
== Klipper configuration ==&lt;br /&gt;
There is a standard klipper configuration file that comes with Refactor/Rebuild. The configuration file is set up &lt;br /&gt;
to work out of the box without anything connected on the pins of the board. The default Klipper config can be used as a starting point for building a custom config file for the printer at hand. &lt;br /&gt;
&lt;br /&gt;
After the Klipper configuration is complete, do a test print to make sure everything is working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Important&#039;&#039;&#039;====&lt;br /&gt;
If you get in a situation where Klipper is unable to start normally, replace the content of the &amp;quot;printer.cfg&amp;quot; file with the default config file that came with Rebuild. The default config file should be available in the &amp;quot;config examples&amp;quot; folder in Fluidd and Mainsail. You might need to do a full reboot of the board after going back to that default config. This is a good way to get back to a known working image. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Config-examples.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wifi on Recore==&lt;br /&gt;
Recore does not have wifi built in, but wifi can be added by using a USB dongle. There is a great dual band wifi dongle that has been tested with Recore and Rebuild and should work out of the box [[Rexfer_A0]]. Wifi can be set up to be either an access point (Hotspot) or to connect to an existing access point (wifi router). If nothing is set, the default will be to create a wifi hotspot called &amp;quot;Recore&amp;quot; with password 12345678.&lt;br /&gt;
&lt;br /&gt;
=== Wifi access point===&lt;br /&gt;
The first time Rebuild boots up, it will set up the wifi as an Access Point (AP). This is done by automatically changing the configuration of NetworkManager. The Wifi AP is called &#039;&#039;&#039;Recore&#039;&#039;&#039; and the password is &#039;&#039;&#039;12345678&#039;&#039;&#039;. This is meant as a temporary setup, so the password should be changed as soon as access is available. The default IP address for the AP is &#039;&#039;&#039;192.168.50.1&#039;&#039;&#039;. Once you have connected to the AP, either with a computer or a phone, it should be possible to gain ssh access. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh debian@192.168.50.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connecting to an external Wifi access point ===&lt;br /&gt;
If you have a Wifi dongle connected, you can connect to a local Wifi access point by using the &#039;&#039;&#039;nmtui&#039;&#039;&#039;  program. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Using nmtui&#039;&#039;&#039;====&lt;br /&gt;
nmtui is a Text UI tool to assist in managing network settings.&lt;br /&gt;
nmtui is mainly navigated using the arrow, space, enter, tab &amp;amp; escape keys.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
# Use SSH or the serial port to log in to the device.&lt;br /&gt;
# Start &#039;&#039;&#039;nmtui&#039;&#039;&#039;&lt;br /&gt;
# Select Activate connection&lt;br /&gt;
# Select wifi network and enter credentials&lt;br /&gt;
# Exit nmtui and verify connection to the wifi network with &#039;&#039;&#039;ip addr&#039;&#039;&#039; (If you connect via wifi hotspot, you will be disconnected)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Nmtui.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SSH access==&lt;br /&gt;
Most of the configuration for Klipper can be handled via the UI, but sometimes it is necessary to have SSH access to the board. By default, the SSH access is disabled, but it can be enabled in three ways.&lt;br /&gt;
# You can choose &amp;quot;enable SSH on new image&amp;quot; in the Reflash user interface&lt;br /&gt;
# You can start the SSH service from Mainsail/Fluidd&lt;br /&gt;
# You can start the ssh service from the serial port. The ssh service will then be persistent on next boot. &amp;lt;pre&amp;gt;systemctl start ssh&amp;lt;/pre&amp;gt;. &lt;br /&gt;
SSH access is only enabled for user &#039;&#039;&#039;debian&#039;&#039;&#039; using the password &#039;&#039;&#039;temppwd&#039;&#039;&#039;.&lt;br /&gt;
The first time you log in, you will be prompted to change the password. After the password has been changed, you will need to log in again. If you do not log in within an hour of enabling SSH, &#039;&#039;&#039;the SSH access will be disabled&#039;&#039;&#039;. This is for security reasons, it&#039;s not good to have an open SSH port with the default password. If the SSH access is disabled, it can be enabled again from the user interface.&lt;br /&gt;
&lt;br /&gt;
==Serial port acccess==&lt;br /&gt;
The USB-C port can be used to get a serial port interface to the board. Once the board is connected and booted, you should be able to see the board show up as a USB device. The serial interface can be used with Minicom on Linux, and PuTTY on Windows. &lt;br /&gt;
&lt;br /&gt;
===Upgrading Debian via apt upgrade===&lt;br /&gt;
The /boot partition of Rebuild is mounted &amp;quot;read only&amp;quot;, so it will have to be remounted as Read Write before running an upgrade. This is handled automatically by apt in this version: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable host mode on the USB-C connector ===&lt;br /&gt;
On Recore A7, the host mode for the USB C connector is activated using a device tree overlay. On A8, this is handled automatically.&lt;br /&gt;
To enable the host mode on Recore A7 write the following on the command line. First SSH into the board. Recore A6 and A5 can not operate in host mode with +5V output. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mount -o remount,rw /boot&lt;br /&gt;
sudo armbian-add-overlay /boot/overlay-user/sun50i-a64-usb-host.dts&lt;br /&gt;
sudo mount -o remount,ro /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using Moonraker and Mainsail==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Mainsail.png]]&lt;br /&gt;
&lt;br /&gt;
==Using KlipperScreen==&lt;br /&gt;
KlipperScreen is running on X, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /usr/share/X11/xorg.conf.d/90-monitor.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
    Identifier &amp;quot;HDMI-1&amp;quot;&lt;br /&gt;
    Option &amp;quot;Rotate&amp;quot; &amp;quot;left&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
After that, KlipperScreen can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart KlipperScreen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it is necessary to rotate the touch panel as well, here is a useful section that can be added to the bottom of that same file. Uncomment the rotation that matches your setup.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;InputClass&amp;quot;&lt;br /&gt;
            Identifier &amp;quot;Coordinate Transformation Matrix&amp;quot;&lt;br /&gt;
            MatchIsTouchscreen &amp;quot;on&amp;quot;&lt;br /&gt;
            MatchDevicePath &amp;quot;/dev/input/event*&amp;quot;&lt;br /&gt;
            MatchDriver &amp;quot;libinput&amp;quot;&lt;br /&gt;
            Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;1 0 0 0 1 0 0 0 1&amp;quot;    # 0 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 1 0 -1 0 1 0 0 1&amp;quot;  # 90 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;-1 0 1 0 -1 1 0 0 1&amp;quot; # 180 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 -1 1 1 0 0 0 0 1&amp;quot;  # 270 degrees&lt;br /&gt;
&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Recompiling and installing binaries==&lt;br /&gt;
===Update u-boot on Recore===&lt;br /&gt;
This is not something the regular user would need to do, but documented here for convenience. &lt;br /&gt;
Place u-boot-sunxi-with-spl.bin in sector 15 (8KB offset)  &lt;br /&gt;
Flash the binary &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk2 bs=1024 seek=8 conv=notrunc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AR100 firmware===&lt;br /&gt;
The AR100 CPU needs a binary file that is loaded on startup by the systemd file klipper.service&lt;br /&gt;
The AR100 binary file comes pre-compiled in Refactor, so most users should not have to re-compile it. &lt;br /&gt;
For experiments the AR100 binary can be recompiled on Recore (architecture aarch64) or on a host computer (amd64 or similar).  &lt;br /&gt;
&lt;br /&gt;
====Compiling the ar100 binary====&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #a2a9b1; border-left:4px solid #36c; background:#eaf3ff; padding:0.6em 1em; margin:0.5em 0 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note: building with an updated Klipper&#039;&#039;&#039; (tested on Rebuild v1.0.2 with Klipper v0.13.0-770-gce7002bed, September 2026)&lt;br /&gt;
&lt;br /&gt;
The steps below were written for the Klipper version that ships with Rebuild v1.0.2. After updating Klipper, four things are different:&lt;br /&gt;
# Newer Klipper expects an &amp;lt;code&amp;gt;or1k-elf-&amp;lt;/code&amp;gt; toolchain. Pass the prefix of the toolchain in &amp;lt;code&amp;gt;/opt/output/bin&amp;lt;/code&amp;gt; to make: &amp;lt;code&amp;gt;make CROSS_PREFIX=or1k-linux-musl-&amp;lt;/code&amp;gt;&lt;br /&gt;
# Don&#039;t use &amp;lt;code&amp;gt;test/configs/ar100.config&amp;lt;/code&amp;gt;. It is Klipper&#039;s CI test config and turns off software SPI, so printers with TMC drivers on software SPI (for example Revolt/TMC5160) stop with &amp;lt;code&amp;gt;Unknown command: spi_set_software_bus&amp;lt;/code&amp;gt;. Use the &amp;lt;code&amp;gt;ar100.config&amp;lt;/code&amp;gt; from Rebuild v1.1.0 instead (below). The v1.0.2 config uses options that newer Klipper no longer has, so every display and sensor gets built in and the image no longer fits.&lt;br /&gt;
# Fix the size check in &amp;lt;code&amp;gt;src/ar100/ar100.ld&amp;lt;/code&amp;gt; (it compares an address with a length and stops at 48 KiB) and remove &amp;lt;code&amp;gt;-O3&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;src/ar100/Makefile&amp;lt;/code&amp;gt;. With &amp;lt;code&amp;gt;-O3&amp;lt;/code&amp;gt; the image no longer fits in the 64 KiB of SRAM A2.&lt;br /&gt;
# Moving the file to &amp;lt;code&amp;gt;/opt/firmware&amp;lt;/code&amp;gt; and restarting Klipper need &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper/&lt;br /&gt;
wget -O .config https://raw.githubusercontent.com/intelligent-agent/Rebuild/refs/tags/v1.1.0/userpatches/overlay/klipper/ar100.config&lt;br /&gt;
sed -i &#039;s/CFLAGS.*+= -O3//&#039; src/ar100/Makefile&lt;br /&gt;
sed -i &#039;s|ASSERT(. &amp;lt;= (SRAM_A2_SIZE), &amp;quot;Klipper image is too large&amp;quot;)|ASSERT(. &amp;lt;= (ORIGIN(SRAM_A2) + LENGTH(SRAM_A2)), &amp;quot;Klipper image is too large&amp;quot;)|&#039; src/ar100/ar100.ld&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make clean&lt;br /&gt;
make CROSS_PREFIX=or1k-linux-musl-&lt;br /&gt;
sudo mv out/ar100.bin /opt/firmware/&lt;br /&gt;
sudo systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Run &amp;lt;code&amp;gt;make clean&amp;lt;/code&amp;gt; as shown: changing the Makefile does not make Klipper rebuild on its own. The two &amp;lt;code&amp;gt;sed&amp;lt;/code&amp;gt; lines modify the Klipper checkout, so run &amp;lt;code&amp;gt;git checkout src/ar100&amp;lt;/code&amp;gt; before the next Klipper update.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To configure klipper for AR100 and build the binary:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper/&lt;br /&gt;
cp test/configs/ar100.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will produce a bin file located in out/ar100.bin, so it should be moved to /opt/firmware&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mv out/ar100.bin /opt/firmware/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Once the AR100 binary has been updated, klipper.service can be restarted which then loads the new AR100 binary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for ARM64====&lt;br /&gt;
The AR100 needs a cross compilation toolchain. For ARM64, it can be downloaded from feeds.iagent.no:&lt;br /&gt;
&lt;br /&gt;
http://feeds.iagent.no/toolchains/  &lt;br /&gt;
&lt;br /&gt;
The toolchain has been built with  &lt;br /&gt;
&lt;br /&gt;
https://github.com/richfelker/musl-cross-make&lt;br /&gt;
&lt;br /&gt;
GCC version: 11.2.0&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for x86_64====&lt;br /&gt;
The toolchain used during automatic testing and is the same used for the CRUST firmware project: &lt;br /&gt;
&lt;br /&gt;
https://github.com/crust-firmware/crust#building-the-firmware&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===STM32 firmware===&lt;br /&gt;
&lt;br /&gt;
The firmware for the stm32f031 mcu that is responsible for ADC &lt;br /&gt;
conversions and PWM for heaters and fans comes pre-installed in the flash of the MCU. &lt;br /&gt;
It can be recreated on the board using the Klipper build system.&lt;br /&gt;
&lt;br /&gt;
In the olden days, we used to do it manually.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
cp test/configs/stm32f031.config .config&lt;br /&gt;
make menuconfig&lt;br /&gt;
-&amp;gt; Enable extra low-level configuration options&lt;br /&gt;
-&amp;gt; Processor model (STM32F031)&lt;br /&gt;
-&amp;gt; Bootloader offset (No bootloader)&lt;br /&gt;
-&amp;gt; Clock Reference (Internal clock)&lt;br /&gt;
-&amp;gt; (16) Internal clock trim override&lt;br /&gt;
-&amp;gt; Communication interface (Serial (on USART2 PA15/PA14))&lt;br /&gt;
-&amp;gt; Baud rate for serial port: 250000&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the newer days, you can copy the config that is used by Rebuild. Please note that this is for Recore A8, which has the 32 KB flash version of the STM32.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
wget https://raw.githubusercontent.com/intelligent-agent/Rebuild/refs/heads/main/userpatches/overlay/klipper/stm32f031-32KB-serial.config&lt;br /&gt;
cp stm32f031-32KB-serial.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Flashing STM32 firmware====&lt;br /&gt;
To flash the STM32 firmware:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mv /opt/firmware/stm32-32KB.bin /opt/firmware/stm32-32KB_old.bin&lt;br /&gt;
sudo cp out/klipper.bin /opt/firmware/stm32-32KB.bin&lt;br /&gt;
sudo flash-stm32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Klipper===&lt;br /&gt;
Klipper is run as a systemd service. It should not normally need to be restarted from the command line, but during development it can be necessary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The log for Klipper is located in /tmp. It can be viewed as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tail -f /tmk/klippy.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Klipper can also be restarted from the OctoPrint interface. On the &amp;quot;Klipper&amp;quot; tab, press &amp;quot;Firmware&amp;quot; to restart the Klipper firmware. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Klipper-firmware-press.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Toggle===&lt;br /&gt;
Toggle is started automatically by the systemd service toggle.service. A user is created for Toggle on first boot, but the credentials are not set until a user is created in OctoPrint. Once the wizard has been completed, the Toggle user is active, but the credentials will not be valid until OctoPrint is restarted. Therefore, if Toggle is needed, restart OctoPrint after the wizard is complete.&lt;br /&gt;
&lt;br /&gt;
Toggle is running on Weston, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/xdg/weston/weston.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Edit the section about rotation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[output]&lt;br /&gt;
name=HDMI-A-1&lt;br /&gt;
transform=rotate-90&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
After that, Weston can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart weston&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See the Ubuntu documentation for valid rotations: [https://manpages.ubuntu.com/manpages/jammy/man5/weston.ini.5.html weston.ini]&lt;br /&gt;
== Recore booting ==&lt;br /&gt;
There are several stages to booting Recore, and depending on which media is installed, the boot process will &lt;br /&gt;
try and boot either from eMMC, USB host or USB device (FEL).&lt;br /&gt;
&lt;br /&gt;
The board can be booted by either pressing the &amp;quot;BOOT&amp;quot; button for 2 seconds or by applying power to either the 24V connector or the USB C connector. To shut down the board, either use the &amp;quot;shutdown&amp;quot; button from the UI or press the &amp;quot;BOOT&amp;quot; button once. It&#039;s not ideal to shut off the board by removing power directly as this can cause a corrupted file system. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From eMMC&amp;quot;&amp;gt;&lt;br /&gt;
===Booting Recore from eMMC (the normal way)===&lt;br /&gt;
# Turn on power&lt;br /&gt;
# The BROM will load u-boot SPL from eMMC&lt;br /&gt;
# The u-boot SPL will load u-boot&lt;br /&gt;
# u-boot will load Linux&lt;br /&gt;
# Linux will load the rootfs from eMMC.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From USB&amp;quot;&amp;gt;&lt;br /&gt;
===Loading u-boot from eMMC but load kernel and rootfs from USB===&lt;br /&gt;
Starting with Rebuild v1.0.0, u-boot will do a scan for a USB mass storage device and if a working version of Reflash or Rebuild or Refactor is found, it will boot to that image.&lt;br /&gt;
# Download Refactor/Rebuild/Reflash and flash it to a USB drive.&lt;br /&gt;
# Insert the USB drive in the board. &lt;br /&gt;
# Boot the board normally (Use the Boot button/apply power)&lt;br /&gt;
The board should now be have the kernel/rootfs from the USB drive.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From FEL&amp;quot;&amp;gt;&lt;br /&gt;
===Boot Recore from a USB stick using the FEL button===&lt;br /&gt;
If u-boot should be loaded from a host computer and kernel and rootfs is loaded from a USB drive:&lt;br /&gt;
# Flash the [[Reflash]] Linux distro to a USB drive. &lt;br /&gt;
# Insert the USB drive in the Recore board in one of the two host connectors close to the HDMI.&lt;br /&gt;
# Hold down the FEL button while applying power to the board via the USB-C connector.&lt;br /&gt;
# Download the Recore repository https://github.com/intelligent-agent/Recore&lt;br /&gt;
# Install the sunxi-tools program&lt;br /&gt;
# Run the fel command (&#039;&#039;&#039;make fel&#039;&#039;&#039;) from the host computer. All the necessary binarys are in the Recore repository:&lt;br /&gt;
You can read more about the steps needed to boot aboard in FEL mode on the Sunxi wiki: https://linux-sunxi.org/FEL&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Depending on what linux platform you&#039;re running from, sunxi-tools will require the following dependencies to compile properly:&lt;br /&gt;
* libftd-dev&lt;br /&gt;
* libusbx-dev&lt;br /&gt;
* libudev-dev&lt;br /&gt;
(These are Debian/ubuntu names. For Fedora, change -dev to -devel)&lt;br /&gt;
&lt;br /&gt;
This should upload u-boot from the host computer to the board via the USB cable. u-boot will then boot from the connected USB drive. &lt;br /&gt;
Please note that in some instances, the USB drive is not detected as a mass storage device without also having the VIN power connector inserted. See more in [[Recore_A6#USB_connectors_not_discovered_when_powered_by_USB_device|in the &amp;quot;known errors&amp;quot; section of Recore A6]]&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running OctoPrint===&lt;br /&gt;
OctoPrint is stated on boot. If there is a need to restart the daemon, use this command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart octoprint&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues==&lt;br /&gt;
===Having both Ethernet and Wi-Fi creates problems with mDNS===&lt;br /&gt;
When having both ethernet and Wi-Fi connected there can be a problem with hostname resolution. &lt;br /&gt;
The workaround is to either remove Wi-Fi or ethernet.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Reflash_v1.1.0&amp;diff=1668</id>
		<title>Reflash v1.1.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Reflash_v1.1.0&amp;diff=1668"/>
		<updated>2026-09-19T07:01:01Z</updated>

		<summary type="html">&lt;p&gt;Elias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reflash header.png|Reflash header.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reflash is a Linux image for downloading and installing [[Rebuild]] and [[Refactor]] images on [[Recore]]. You can also create an image from the contents of the eMMC.&lt;br /&gt;
&lt;br /&gt;
The latest image is: [https://github.com/intelligent-agent/Reflash/releases/tag/v1.1.0 Reflash v1.1.0]&lt;br /&gt;
&lt;br /&gt;
For the previous release, see [[Reflash v1.0.1]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Entering FEL mode&#039;&#039;&#039;====&lt;br /&gt;
The first time you use Reflash 1.0.0 and above, you need to boot to Reflash using FEL-mode. Hold the FEL button on the board down and press the RST (reset) button. You need to have a USB C cable connected between the USB C connector on Recore and a host computer.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Linux&amp;quot;&amp;gt;&lt;br /&gt;
You should see the board show up as a USB device:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsusb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:FEL-mode lsusb.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Download the Recore git repository. On the command line write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://github.com/intelligent-agent/Recore/raw/master/binaries/Recore-fel.zip&lt;br /&gt;
unzip Recore-fel.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Install the sunxi-tools package on the host computer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install sunxi-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now you can run the whole command on a shell.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo sunxi-fel -v -p spl fel/sunxi-spl.bin write 0x44000 fel/bl31.bin write 0x4a000000 fel/u-boot.bin reset64 0x44000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On the host computer, you should see the binary files being uploaded like the following:&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Make-fel.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Windows&amp;quot;&amp;gt;&lt;br /&gt;
# Open Device Manager and check that the device shows up. It might not have a known vendor and product description. &amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;[[File:Windows-Device-manager.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
# Download the [https://github.com/intelligent-agent/Recore/archive/refs/heads/master.zip Recore repository] and extract the contents.&lt;br /&gt;
# Download [https://github.com/eperie/build-scripts/releases/download/v1.3/sunxi-tools-mingw64-530adfa.zip sunxi-fel binary for windows] and extract the contents so it is the the Recore-master folder.&lt;br /&gt;
# Download and install Zadig https://linux-sunxi.org/FEL/USBBoot#Using_sunxi-fel_on_Windows&lt;br /&gt;
# Open the CMD prompt and navigate to the extracted Recore folder.&lt;br /&gt;
# Insert the USB drive with Reflash (See instructions further down)&lt;br /&gt;
# Run the following command from the Recore folder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(prefix) sunxi-fel.exe -v -p spl binaries\new\sunxi-spl.bin write 0x44000 binaries\new\bl31.bin write 0x4a000000 binaries\new\u-boot.bin reset64 0x44000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After running that command, you should see the SPL and u-boot being transferred and the board should start to boot from the USB drive.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;[[File:Sunxi-fel-windows.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Instructions==&lt;br /&gt;
This page has step-by-step instructions for using the image. Here is what you should do:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Use [https://www.balena.io/etcher/ Balena Etcher] to download and flash the Reflash image. Here is the URL to the image: &amp;lt;pre&amp;gt;https://github.com/intelligent-agent/Reflash/releases/download/v1.1.0/reflash-v1.1.0.img.xz&amp;lt;/pre&amp;gt;&lt;br /&gt;
You can also download it from here: https://github.com/intelligent-agent/Reflash/releases/tag/v1.1.0&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;[[File:BalenaEthcer.png|center]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
After flashing the image to a USB drive with at least 4 GB of storage, eject the USB drive &amp;lt;b&amp;gt;properly&amp;lt;/b&amp;gt; and insert it in a USB port on the Recore board.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
If you want to get back to Reflash from Rebuild or Refactor, you can do so by having the USB drive inserted during boot. A reboot can be done from Mainsail, Fluidd or OctoPrint.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Once the board has booted from USB, you should be able to access the web interface using the address http://recore.local&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;[[File:Reflash.png|center]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
From the web interface, choose which version of Refactor/Rebuild you want to download. There are two types of images, either with OctoPrint as the web interface, with Mainsail or with Fluidd. You can also choose to upload a custom image using the &amp;quot;Upload file&amp;quot; option.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Once the image has been downloaded (to the USB drive) you can install/flash the image to the eMMC. This will take 3-4 minutes.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Once the image has been flashed on the eMMC drive, you can reboot the board, and it will boot using the image that you chose.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
You can keep the Reflash USB drive in a safe place and reuse it the next time you want to upgrade the software. If you want to upgrade to a later version of Rebuild, the same image can be used again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;A note on USB drives&#039;&#039;&#039;====&lt;br /&gt;
The USB drive matters more than it looks like it should. Reflash runs entirely from it, downloads the image onto it and reads the image back off it while flashing, so a slow or worn drive shows up as a slow first boot and a slow upload - the difference between a good and a bad drive has been measured at 22 seconds against nearly four minutes to reach the web interface. If Reflash is unusually slow, try a different drive before looking for anything else.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What is new in v1.1.0==&lt;br /&gt;
&lt;br /&gt;
===The screen===&lt;br /&gt;
* Reflash now draws its own status screen on the attached panel: the version, what it is doing, and a progress bar, ending in &amp;quot;Flash complete, remove USB drive&amp;quot;. Previously the panel showed the boot console.&lt;br /&gt;
* A splash is shown from the boot partition while U-Boot runs, and U-Boot no longer prints over it.&lt;br /&gt;
* The panel is handed to simpledrm by the shipped DTB, so the screen comes up the same way it does in Rebuild.&lt;br /&gt;
* Removing the USB drive is acknowledged on the panel instead of being silently ignored.&lt;br /&gt;
&lt;br /&gt;
===WiFi===&lt;br /&gt;
* WiFi is managed by iwd, and whether a dongle is present is decided from sysfs rather than from iwd&#039;s transient view - a failed status request no longer claims the dongle was removed.&lt;br /&gt;
* The info panel shows how the board is connected and how strong the signal is. A wired link is preferred over WiFi, so the two interfaces cannot confuse each other.&lt;br /&gt;
* Setting WiFi up on a board that then fails to connect no longer leaves the board unreachable, and every WiFi request has a timeout so a slow scan cannot freeze the dialog.&lt;br /&gt;
* The passphrase is kept out of the log and is no longer served back to the browser.&lt;br /&gt;
* A board with no WiFi adapter at all now skips WiFi gracefully instead of erroring.&lt;br /&gt;
&lt;br /&gt;
===USB console and the control protocol===&lt;br /&gt;
* The USB gadget exposes two ACM functions. &amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; on the host is a login prompt (user &#039;&#039;&#039;debian&#039;&#039;&#039;, password &#039;&#039;&#039;temppwd&#039;&#039;&#039;), and &amp;lt;code&amp;gt;/dev/ttyACM1&amp;lt;/code&amp;gt; is a line-based control protocol for listing, starting and polling a flash without the web UI.&lt;br /&gt;
* This matters on a board with no network - a failed WiFi setup used to leave the UART header inside the case as the only console.&lt;br /&gt;
* The same protocol is available on the board itself through &amp;lt;code&amp;gt;reflash-ctl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Flashing and uploads===&lt;br /&gt;
* An image that fails its integrity check can no longer be installed.&lt;br /&gt;
* A large upload is sent as raw binary with client-side retry, and the destination file is held open across chunks, which fixed uploads timing out part way through.&lt;br /&gt;
* Closing the browser tab cancels the upload instead of leaving the server waiting.&lt;br /&gt;
* Transfer throughput is charted in a popup on the progress bar, with peak and average.&lt;br /&gt;
* If the eMMC stops responding during the final cleanup, Reflash now says so and asks for a power cycle, rather than sitting at 100% forever.&lt;br /&gt;
* A failed image load no longer results in the board booting anyway.&lt;br /&gt;
&lt;br /&gt;
===Board information===&lt;br /&gt;
* Board metrics - temperature, DRAM rail, throughput - are plotted behind a button in the Info dropdown.&lt;br /&gt;
* The over-temperature warning now triggers at the temperature the SoC actually throttles at.&lt;br /&gt;
* If the board revision cannot be read, Reflash says so loudly and keeps the log, instead of guessing.&lt;br /&gt;
* Each board gets its own persistent SSH host key, and identifies itself to DHCP by MAC address, so two boards cannot end up sharing one lease.&lt;br /&gt;
&lt;br /&gt;
===A5 and A6 boards===&lt;br /&gt;
* The DRAM rail is raised at boot and DRAM frequency scaling is disabled on A5 and A6, from the same universal image - no separate build for older boards.&lt;br /&gt;
&lt;br /&gt;
==Reflash image==&lt;br /&gt;
Reflash is an initRamFS Linux image. That is in order to completely remove the boot medium before a reboot occurs. Because of that, Reflash needs to be very small. The application is built in Go which makes it stand alone with very little dependencies. The network management is handled by systemd-networkd and systemd-resolved, and WiFi by iwd. Very few extra programs are installed, and any additional programs that get installed will be lost after a reboot.&lt;br /&gt;
&lt;br /&gt;
The root filesystem is Debian trixie, built with debootstrap &amp;lt;code&amp;gt;--variant=minbase&amp;lt;/code&amp;gt;. The kernel is &#039;&#039;&#039;6.18.33&#039;&#039;&#039;, the same one [[Rebuild]] ships.&lt;br /&gt;
&lt;br /&gt;
SSH is enabled for user &#039;&#039;&#039;debian&#039;&#039;&#039; with password &#039;&#039;&#039;temppwd&#039;&#039;&#039;. The same password is set for &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Known issues==&lt;br /&gt;
===Flash progress not showing any progress===&lt;br /&gt;
Sometimes the flashing process does not work as expected. There is no progress on the progress indicator and the flashing never completes. A workaround is to go back to step 1 and install Reflash again.&lt;br /&gt;
&lt;br /&gt;
===A USB drive that is not detected===&lt;br /&gt;
On some boards the USB drive is not enumerated at boot. Reflash waits for the drive and counts the wait on screen, and names a drive that never appears as broken. If it never appears, power the board off completely - a reset is not always enough - and try again, or try a different drive. This is tracked as [https://github.com/intelligent-agent/Reflash/issues/88 Reflash issue #88].&lt;br /&gt;
&lt;br /&gt;
==Contributing==&lt;br /&gt;
Bug reports and pull requests are welcome at [https://github.com/intelligent-agent/Reflash Reflash on GitHub]. If you use an AI assistant to write the patch, see [[AI-assisted contributions]].&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.1.0&amp;diff=1667</id>
		<title>Rebuild v1.1.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.1.0&amp;diff=1667"/>
		<updated>2026-09-18T18:44:03Z</updated>

		<summary type="html">&lt;p&gt;Elias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Rebuild header.png|center]]&lt;br /&gt;
Rebuild is a complete Linux image for [[Recore A8|Recore]] 3D printer controller boards. Rebuild comes with Klipper installed and the choice of either [https://docs.mainsail.xyz/ MainSail], [https://docs.fluidd.xyz/ Fluidd] or [https://octoprint.org/ OctoPrint]. The name Rebuild is a reflection of the [https://www.armbian.com/ Armbian] build system, but adapted for Recore boards. &lt;br /&gt;
&lt;br /&gt;
Rebuild has now been released as v1.1.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;There is no in-place upgrade to v1.1.0&#039;&#039;&#039;====&lt;br /&gt;
The base OS, the kernel and U-Boot have all moved, and U-Boot does not live in the filesystem, so &amp;lt;code&amp;gt;apt upgrade&amp;lt;/code&amp;gt; on a v1.0.x board will not get you here. &#039;&#039;&#039;Flash a fresh image.&#039;&#039;&#039; Save &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt; and anything else you have customised first.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=What is new in v1.1.0=&lt;br /&gt;
&lt;br /&gt;
==A new base==&lt;br /&gt;
* Debian 13 (trixie) on Armbian 26.08, running the &#039;&#039;&#039;6.18.50&#039;&#039;&#039; kernel.&lt;br /&gt;
* Rebuild and [[Reflash v1.1.0|Reflash]] are now built against the same kernel. They had drifted apart across kernel version, branch and Armbian release, which meant a kernel fix landed in one image but not the other.&lt;br /&gt;
* &#039;&#039;&#039;U-Boot 2026.07&#039;&#039;&#039;, replacing 2024.01.&lt;br /&gt;
&lt;br /&gt;
==The display==&lt;br /&gt;
* The panel is driven by &#039;&#039;&#039;simpledrm&#039;&#039;&#039;, adopting the framebuffer U-Boot has already set up from the display&#039;s EDID. The result is one mode from U-Boot through Plymouth to KlipperScreen, with no mode change and no flicker anywhere in the chain.&lt;br /&gt;
* This replaces a path where the HDMI driver could misread hotplug as low for about half a second while its PHY came up, get no EDID inside that window, and invent a 1024x768 mode. The framebuffer is allocated once and cannot grow, so that guess was permanent: the panel could not lock, dropped sync and blanked its own backlight.&lt;br /&gt;
* A redesigned Plymouth splash, and a framebuffer console that can be rotated to match a panel that is mounted rotated.&lt;br /&gt;
* A board with no panel now says &amp;quot;no display detected&amp;quot; rather than reporting a failure, and the barebone image gives you a shell on the panel instead of a frozen splash.&lt;br /&gt;
&lt;br /&gt;
==Booting==&lt;br /&gt;
* U-Boot no longer scans the USB-C port for boot devices, and holds PD7 low so the board never sources VBUS on USB-C.&lt;br /&gt;
* &amp;lt;code&amp;gt;bootm_size&amp;lt;/code&amp;gt; is wide enough for a Reflash initrd to be relocated. On U-Boot 2026.07 the memory map persists for the whole session, so scratch loads earlier in the boot script fragmented it and the initrd had nowhere to go.&lt;br /&gt;
* U-Boot no longer hunts for a netboot server that does not exist, which used to add a delay to every boot.&lt;br /&gt;
* A failed image load no longer results in the kernel being booted anyway.&lt;br /&gt;
&lt;br /&gt;
==Printer and hardware==&lt;br /&gt;
* The Klipper RP2040 binary is built with the image and flashed on first boot, and first boot now verifies that it was actually flashed and that Klipper reached its MCUs, rather than assuming.&lt;br /&gt;
* DRAM frequency scaling is disabled on A5 and A6.&lt;br /&gt;
* udev no longer probes the RP2 bootloader as though it were a disk.&lt;br /&gt;
* ustreamer starts from the camera device, so a camera present at boot is picked up.&lt;br /&gt;
&lt;br /&gt;
==Network and identity==&lt;br /&gt;
* &#039;&#039;&#039;Every board now generates its own SSH host key.&#039;&#039;&#039; v1.0.x shipped one key pair inside the image, so every Recore in the world presented the same host identity.&lt;br /&gt;
* Rebuild tries the configured network for a full two minutes before falling back to the hotspot, instead of giving up early.&lt;br /&gt;
* WiFi profiles apply to whatever dongle is present, and a board with no WiFi device leaves quietly instead of failing every boot.&lt;br /&gt;
* The board can report its own serial number, in every variant including barebone.&lt;br /&gt;
&lt;br /&gt;
==Removed==&lt;br /&gt;
* &#039;&#039;&#039;armbian-config&#039;&#039;&#039; and &#039;&#039;&#039;armbian-install&#039;&#039;&#039; are no longer installed. They defeat the package holds that keep Klipper, the kernel and U-Boot at the versions the image was tested with: &amp;lt;code&amp;gt;armbian-config&amp;lt;/code&amp;gt; runs &amp;lt;code&amp;gt;apt-mark unhold&amp;lt;/code&amp;gt;, and its software installer passes &amp;lt;code&amp;gt;--allow-change-held-packages&amp;lt;/code&amp;gt;. Removing them is what makes the held versions mean something.&lt;br /&gt;
&lt;br /&gt;
=Installing Rebuild on Recore=&lt;br /&gt;
Recore has eMMC (embedded MMC), so in order to install software on the board, a USB drive must be used. For instructions on making a flasher image, have a look at [[Reflash]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
In order to install Rebuild v1.1.0, you need to use Reflash v1.1.0. There is a blog post explaining this new way to install an image on Recore: https://www.iagent.no/2024/05/08/reflash-a-new-way-to-upgrade-firmware/&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Latest images==&lt;br /&gt;
The latest images for Recore are available from github. You can choose to download an image directly from within Reflash, or you can choose to download first and then upload it. Here are the latest images: https://github.com/intelligent-agent/Rebuild/releases&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
[[File:USB-C.png|thumb]]&lt;br /&gt;
[[File:Ethernet.png|thumb]]&lt;br /&gt;
[[File:Blink.png|thumb]]&lt;br /&gt;
[[File:Http.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
It can be a good idea to test the board on the bench before installing it in the printer. Use the USB-C connector or the 24V power plug to power the board and connect the ethernet cable between the board and your local network. &lt;br /&gt;
&lt;br /&gt;
Once power is applied, you should see a white LED light up in the middle of the board. After a few seconds, there should be activity on the eMMC LED, the CPU LED and on the heartbeat LED. &lt;br /&gt;
&lt;br /&gt;
Once the board is powered up, use a computer to access the web interface provided by OctoPrint/MainSail/Fluidd (the UI). &lt;br /&gt;
In order to get access the UI, a network cable must be connected to the board and to a network switch. It is also possible to use a wifi dongle, be please see &amp;quot;Known issues&amp;quot; at the bottom of the page for issues regarding Hotspot/AP.&lt;br /&gt;
If a network cable is used, the board should respond to the address:&lt;br /&gt;
http://recore.local&lt;br /&gt;
If using a wifi dongle, the default wifi network password is 12345678.&lt;br /&gt;
&lt;br /&gt;
For OctoPrint, once the interface is visible, run through the wizard to set up a new printer. &lt;br /&gt;
After the wizard is done, go to the Klipper tab in OctoPrint and edit the Klipper config file. &lt;br /&gt;
This is where the bulk of the work will happen. &lt;br /&gt;
&lt;br /&gt;
On the MainSail or Fluidd image, there should not need to be any configuration necessary. Verify that the web interface comes up and that Klipper is running as expected.&lt;br /&gt;
&lt;br /&gt;
== Klipper configuration ==&lt;br /&gt;
There is a standard klipper configuration file that comes with Refactor/Rebuild. The configuration file is set up &lt;br /&gt;
to work out of the box without anything connected on the pins of the board. The default Klipper config can be used as a starting point for building a custom config file for the printer at hand. &lt;br /&gt;
&lt;br /&gt;
After the Klipper configuration is complete, do a test print to make sure everything is working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Important&#039;&#039;&#039;====&lt;br /&gt;
If you get in a situation where Klipper is unable to start normally, replace the content of the &amp;quot;printer.cfg&amp;quot; file with the default config file that came with Rebuild. The default config file should be available in the &amp;quot;config examples&amp;quot; folder in Fluidd and Mainsail. You might need to do a full reboot of the board after going back to that default config. This is a good way to get back to a known working image. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Config-examples.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wifi on Recore==&lt;br /&gt;
Recore does not have wifi built in, but wifi can be added by using a USB dongle. There is a great dual band wifi dongle that has been tested with Recore and Rebuild and should work out of the box [[Rexfer_A0]]. Wifi can be set up to be either an access point (Hotspot) or to connect to an existing access point (wifi router). If nothing is set, the default will be to create a wifi hotspot called &amp;quot;Recore&amp;quot; with password 12345678.&lt;br /&gt;
&lt;br /&gt;
=== Wifi access point===&lt;br /&gt;
The first time Rebuild boots up, it will set up the wifi as an Access Point (AP). This is done by automatically changing the configuration of NetworkManager. The Wifi AP is called &#039;&#039;&#039;Recore&#039;&#039;&#039; and the password is &#039;&#039;&#039;12345678&#039;&#039;&#039;. This is meant as a temporary setup, so the password should be changed as soon as access is available. The default IP address for the AP is &#039;&#039;&#039;192.168.50.1&#039;&#039;&#039;. Once you have connected to the AP, either with a computer or a phone, it should be possible to gain ssh access. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh debian@192.168.50.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connecting to an external Wifi access point ===&lt;br /&gt;
If you have a Wifi dongle connected, you can connect to a local Wifi access point by using the &#039;&#039;&#039;nmtui&#039;&#039;&#039;  program. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Using nmtui&#039;&#039;&#039;====&lt;br /&gt;
nmtui is a Text UI tool to assist in managing network settings.&lt;br /&gt;
nmtui is mainly navigated using the arrow, space, enter, tab &amp;amp; escape keys.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
# Use SSH or the serial port to log in to the device.&lt;br /&gt;
# Start &#039;&#039;&#039;nmtui&#039;&#039;&#039;&lt;br /&gt;
# Select Activate connection&lt;br /&gt;
# Select wifi network and enter credentials&lt;br /&gt;
# Exit nmtui and verify connection to the wifi network with &#039;&#039;&#039;ip addr&#039;&#039;&#039; (If you connect via wifi hotspot, you will be disconnected)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Nmtui.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SSH access==&lt;br /&gt;
Most of the configuration for Klipper can be handled via the UI, but sometimes it is necessary to have SSH access to the board. By default, the SSH access is disabled, but it can be enabled in three ways.&lt;br /&gt;
# You can choose &amp;quot;enable SSH on new image&amp;quot; in the Reflash user interface&lt;br /&gt;
# You can start the SSH service from Mainsail/Fluidd&lt;br /&gt;
# You can start the ssh service from the serial port. The ssh service will then be persistent on next boot. &amp;lt;pre&amp;gt;systemctl start ssh&amp;lt;/pre&amp;gt;. &lt;br /&gt;
SSH access is only enabled for user &#039;&#039;&#039;debian&#039;&#039;&#039; using the password &#039;&#039;&#039;temppwd&#039;&#039;&#039;.&lt;br /&gt;
The first time you log in, you will be prompted to change the password. After the password has been changed, you will need to log in again. If you do not log in within an hour of enabling SSH, &#039;&#039;&#039;the SSH access will be disabled&#039;&#039;&#039;. This is for security reasons, it&#039;s not good to have an open SSH port with the default password. If the SSH access is disabled, it can be enabled again from the user interface.&lt;br /&gt;
&lt;br /&gt;
==Serial port acccess==&lt;br /&gt;
The USB-C port can be used to get a serial port interface to the board. Once the board is connected and booted, you should be able to see the board show up as a USB device. The serial interface can be used with Minicom on Linux, and PuTTY on Windows. &lt;br /&gt;
&lt;br /&gt;
===Upgrading Debian via apt upgrade===&lt;br /&gt;
The /boot partition of Rebuild is mounted &amp;quot;read only&amp;quot;, so it will have to be remounted as Read Write before running an upgrade. This is handled automatically by apt in this version: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable host mode on the USB-C connector ===&lt;br /&gt;
On Recore A7, the host mode for the USB C connector is activated using a device tree overlay. On A8, this is handled automatically.&lt;br /&gt;
To enable the host mode on Recore A7 write the following on the command line. First SSH into the board. Recore A6 and A5 can not operate in host mode with +5V output. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mount -o remount,rw /boot&lt;br /&gt;
sudo armbian-add-overlay /boot/overlay-user/sun50i-a64-usb-host.dts&lt;br /&gt;
sudo mount -o remount,ro /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using Moonraker and Mainsail==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Mainsail.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using KlipperScreen==&lt;br /&gt;
KlipperScreen is running on X, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /usr/share/X11/xorg.conf.d/90-monitor.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
    Identifier &amp;quot;None-1&amp;quot;&lt;br /&gt;
    Option &amp;quot;Rotate&amp;quot; &amp;quot;left&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;The connector name changed in v1.1.0&#039;&#039;&#039;====&lt;br /&gt;
Because the panel is now driven by simpledrm, the connector reports as &#039;&#039;Unknown&#039;&#039; rather than HDMI: it is &#039;&#039;&#039;Unknown-1&#039;&#039;&#039; to the kernel and &#039;&#039;&#039;None-1&#039;&#039;&#039; to Xorg, where v1.0.x had HDMI-A-1 and HDMI-1. Anything that matches on the connector name - a monitor section, a &amp;lt;code&amp;gt;video=&amp;lt;/code&amp;gt; argument, a Weston output - has to use the new name. The shipped configuration carries both, so it keeps working either way.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After that, KlipperScreen can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart KlipperScreen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it is necessary to rotate the touch panel as well, here is a useful section that can be added to the bottom of that same file. Uncomment the rotation that matches your setup.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;InputClass&amp;quot;&lt;br /&gt;
            Identifier &amp;quot;Coordinate Transformation Matrix&amp;quot;&lt;br /&gt;
            MatchIsTouchscreen &amp;quot;on&amp;quot;&lt;br /&gt;
            MatchDevicePath &amp;quot;/dev/input/event*&amp;quot;&lt;br /&gt;
            MatchDriver &amp;quot;libinput&amp;quot;&lt;br /&gt;
            Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;1 0 0 0 1 0 0 0 1&amp;quot;    # 0 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 1 0 -1 0 1 0 0 1&amp;quot;  # 90 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;-1 0 1 0 -1 1 0 0 1&amp;quot; # 180 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 -1 1 1 0 0 0 0 1&amp;quot;  # 270 degrees&lt;br /&gt;
&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Recompiling and installing binaries==&lt;br /&gt;
===Update u-boot on Recore===&lt;br /&gt;
This is not something the regular user would need to do, but documented here for convenience. &lt;br /&gt;
Place u-boot-sunxi-with-spl.bin in sector 15 (8KB offset)  &lt;br /&gt;
Flash the binary &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk2 bs=1024 seek=8 conv=notrunc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AR100 firmware===&lt;br /&gt;
The AR100 CPU needs a binary file that is loaded on startup by the systemd file klipper.service&lt;br /&gt;
The AR100 binary file comes pre-compiled in Refactor, so most users should not have to re-compile it. &lt;br /&gt;
For experiments the AR100 binary can be recompiled on Recore (architecture aarch64) or on a host computer (amd64 or similar).  &lt;br /&gt;
&lt;br /&gt;
====Compiling the ar100 binary====&lt;br /&gt;
To configure klipper for AR100 and build the binary:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper/&lt;br /&gt;
cp test/configs/ar100.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will produce a bin file located in out/ar100.bin, so it should be moved to /opt/firmware&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mv out/ar100.bin /opt/firmware/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Once the AR100 binary has been updated, klipper.service can be restarted which then loads the new AR100 binary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for ARM64====&lt;br /&gt;
The AR100 needs a cross compilation toolchain. For ARM64, it can be downloaded from feeds.iagent.no:&lt;br /&gt;
&lt;br /&gt;
http://feeds.iagent.no/toolchains/  &lt;br /&gt;
&lt;br /&gt;
The toolchain has been built with  &lt;br /&gt;
&lt;br /&gt;
https://github.com/richfelker/musl-cross-make&lt;br /&gt;
&lt;br /&gt;
GCC version: 11.2.0&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for x86_64====&lt;br /&gt;
The toolchain used during automatic testing and is the same used for the CRUST firmware project: &lt;br /&gt;
&lt;br /&gt;
https://github.com/crust-firmware/crust#building-the-firmware&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===STM32 firmware===&lt;br /&gt;
&lt;br /&gt;
The firmware for the stm32f031 mcu that is responsible for ADC &lt;br /&gt;
conversions and PWM for heaters and fans comes pre-installed in the flash of the MCU. &lt;br /&gt;
It can be recreated on the board using the Klipper build system.&lt;br /&gt;
&lt;br /&gt;
In the olden days, we used to do it manually.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
cp test/configs/stm32f031.config .config&lt;br /&gt;
make menuconfig&lt;br /&gt;
-&amp;gt; Enable extra low-level configuration options&lt;br /&gt;
-&amp;gt; Processor model (STM32F031)&lt;br /&gt;
-&amp;gt; Bootloader offset (No bootloader)&lt;br /&gt;
-&amp;gt; Clock Reference (Internal clock)&lt;br /&gt;
-&amp;gt; (16) Internal clock trim override&lt;br /&gt;
-&amp;gt; Communication interface (Serial (on USART2 PA15/PA14))&lt;br /&gt;
-&amp;gt; Baud rate for serial port: 250000&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the newer days, you can copy the config that is used by Rebuild. Please note that this is for Recore A8, which has the 32 KB flash version of the STM32.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
wget https://raw.githubusercontent.com/intelligent-agent/Rebuild/refs/heads/main/userpatches/overlay/klipper/stm32f031-32KB-serial.config&lt;br /&gt;
cp stm32f031-32KB-serial.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Flashing STM32 firmware====&lt;br /&gt;
To flash the STM32 firmware:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mv /opt/firmware/stm32-32KB.bin /opt/firmware/stm32-32KB_old.bin&lt;br /&gt;
sudo cp out/klipper.bin /opt/firmware/stm32-32KB.bin&lt;br /&gt;
sudo flash-stm32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Klipper===&lt;br /&gt;
Klipper is run as a systemd service. It should not normally need to be restarted from the command line, but during development it can be necessary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The log for Klipper is located in /tmp. It can be viewed as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tail -f /tmp/klippy.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Klipper can also be restarted from the OctoPrint interface. On the &amp;quot;Klipper&amp;quot; tab, press &amp;quot;Firmware&amp;quot; to restart the Klipper firmware. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Klipper-firmware-press.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Toggle===&lt;br /&gt;
Toggle is started automatically by the systemd service toggle.service. A user is created for Toggle on first boot, but the credentials are not set until a user is created in OctoPrint. Once the wizard has been completed, the Toggle user is active, but the credentials will not be valid until OctoPrint is restarted. Therefore, if Toggle is needed, restart OctoPrint after the wizard is complete.&lt;br /&gt;
&lt;br /&gt;
Toggle is running on Weston, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/xdg/weston/weston.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Edit the section about rotation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[output]&lt;br /&gt;
name=HDMI-A-1&lt;br /&gt;
transform=rotate-90&lt;br /&gt;
&lt;br /&gt;
[output]&lt;br /&gt;
name=Unknown-1&lt;br /&gt;
transform=rotate-90&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Both sections are given deliberately: the output is &#039;&#039;&#039;Unknown-1&#039;&#039;&#039; under simpledrm, which is what v1.1.0 ships, and &#039;&#039;&#039;HDMI-A-1&#039;&#039;&#039; on the older driver. Weston applies whichever one matches and ignores the other, so a single file works on both.&lt;br /&gt;
&lt;br /&gt;
After that, Weston can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart weston&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See the Ubuntu documentation for valid rotations: [https://manpages.ubuntu.com/manpages/jammy/man5/weston.ini.5.html weston.ini]&lt;br /&gt;
== Recore booting ==&lt;br /&gt;
There are several stages to booting Recore, and depending on which media is installed, the boot process will &lt;br /&gt;
try and boot either from eMMC, USB host or USB device (FEL).&lt;br /&gt;
&lt;br /&gt;
The board can be booted by either pressing the &amp;quot;BOOT&amp;quot; button for 2 seconds or by applying power to either the 24V connector or the USB C connector. To shut down the board, either use the &amp;quot;shutdown&amp;quot; button from the UI or press the &amp;quot;BOOT&amp;quot; button once. It&#039;s not ideal to shut off the board by removing power directly as this can cause a corrupted file system. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From eMMC&amp;quot;&amp;gt;&lt;br /&gt;
===Booting Recore from eMMC (the normal way)===&lt;br /&gt;
# Turn on power&lt;br /&gt;
# The BROM will load u-boot SPL from eMMC&lt;br /&gt;
# The u-boot SPL will load u-boot&lt;br /&gt;
# u-boot will load Linux&lt;br /&gt;
# Linux will load the rootfs from eMMC.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From USB&amp;quot;&amp;gt;&lt;br /&gt;
===Loading u-boot from eMMC but load kernel and rootfs from USB===&lt;br /&gt;
Starting with Rebuild v1.0.0, u-boot will do a scan for a USB mass storage device and if a working version of Reflash or Rebuild or Refactor is found, it will boot to that image.&lt;br /&gt;
# Download Refactor/Rebuild/Reflash and flash it to a USB drive.&lt;br /&gt;
# Insert the USB drive in the board. &lt;br /&gt;
# Boot the board normally (Use the Boot button/apply power)&lt;br /&gt;
The board should now be have the kernel/rootfs from the USB drive.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From FEL&amp;quot;&amp;gt;&lt;br /&gt;
===Boot Recore from a USB stick using the FEL button===&lt;br /&gt;
If u-boot should be loaded from a host computer and kernel and rootfs is loaded from a USB drive:&lt;br /&gt;
# Flash the [[Reflash]] Linux distro to a USB drive. &lt;br /&gt;
# Insert the USB drive in the Recore board in one of the two host connectors close to the HDMI.&lt;br /&gt;
# Hold down the FEL button while applying power to the board via the USB-C connector.&lt;br /&gt;
# Download the Recore repository https://github.com/intelligent-agent/Recore&lt;br /&gt;
# Install the sunxi-tools program&lt;br /&gt;
# Run the fel command (&#039;&#039;&#039;make fel&#039;&#039;&#039;) from the host computer. All the necessary binarys are in the Recore repository:&lt;br /&gt;
You can read more about the steps needed to boot aboard in FEL mode on the Sunxi wiki: https://linux-sunxi.org/FEL&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Depending on what linux platform you&#039;re running from, sunxi-tools will require the following dependencies to compile properly:&lt;br /&gt;
* libftd-dev&lt;br /&gt;
* libusbx-dev&lt;br /&gt;
* libudev-dev&lt;br /&gt;
(These are Debian/ubuntu names. For Fedora, change -dev to -devel)&lt;br /&gt;
&lt;br /&gt;
This should upload u-boot from the host computer to the board via the USB cable. u-boot will then boot from the connected USB drive. &lt;br /&gt;
Please note that in some instances, the USB drive is not detected as a mass storage device without also having the VIN power connector inserted. See more in [[Recore_A6#USB_connectors_not_discovered_when_powered_by_USB_device|in the &amp;quot;known errors&amp;quot; section of Recore A6]]&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running OctoPrint===&lt;br /&gt;
OctoPrint is stated on boot. If there is a need to restart the daemon, use this command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart octoprint&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues==&lt;br /&gt;
===A display connected after boot is not detected===&lt;br /&gt;
The panel is driven from the framebuffer U-Boot set up, so the mode is whatever U-Boot read from the display&#039;s EDID at power-on. A display plugged in while the board is running will not be picked up - reboot with it connected. A different panel that is present at boot works normally, because U-Boot reads its EDID too. This is the trade for a flicker-free boot: there is no KMS and no runtime hotplug on this path.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Rebuild&amp;diff=1666</id>
		<title>Rebuild</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Rebuild&amp;diff=1666"/>
		<updated>2026-09-18T18:38:09Z</updated>

		<summary type="html">&lt;p&gt;Elias: Changed redirect target from Rebuild v1.0.2 to Rebuild v1.1.0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Rebuild v1.1.0]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Rebuild v1.0.2]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Rebuild v1.0.1]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Rebuild v1.0.0]]&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Reflash&amp;diff=1665</id>
		<title>Reflash</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Reflash&amp;diff=1665"/>
		<updated>2026-09-18T18:36:57Z</updated>

		<summary type="html">&lt;p&gt;Elias: Changed redirect target from Reflash v1.0.1 to Reflash v1.1.0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Reflash v1.1.0]]&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.1.0&amp;diff=1664</id>
		<title>Rebuild v1.1.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.1.0&amp;diff=1664"/>
		<updated>2026-09-12T07:42:41Z</updated>

		<summary type="html">&lt;p&gt;Elias: Add what is new in v1.1.0; fix unclosed div, connector names for simpledrm, and two typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Rebuild header.png|center]]&lt;br /&gt;
Rebuild is a complete Linux image for [[Recore A8|Recore]] 3D printer controller boards. Rebuild comes with Klipper installed and the choice of either [https://docs.mainsail.xyz/ MainSail], [https://docs.fluidd.xyz/ Fluidd] or [https://octoprint.org/ OctoPrint]. The name Rebuild is a reflection of the [https://www.armbian.com/ Armbian] build system, but adapted for Recore boards. &lt;br /&gt;
&lt;br /&gt;
Rebuild has now been released as v1.1.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;There is no in-place upgrade to v1.1.0&#039;&#039;&#039;====&lt;br /&gt;
The base OS, the kernel and U-Boot have all moved, and U-Boot does not live in the filesystem, so &amp;lt;code&amp;gt;apt upgrade&amp;lt;/code&amp;gt; on a v1.0.x board will not get you here. &#039;&#039;&#039;Flash a fresh image.&#039;&#039;&#039; Save &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt; and anything else you have customised first.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=What is new in v1.1.0=&lt;br /&gt;
&lt;br /&gt;
==A new base==&lt;br /&gt;
* Debian 13 (trixie) on Armbian 26.08, running the &#039;&#039;&#039;6.18.50&#039;&#039;&#039; kernel.&lt;br /&gt;
* Rebuild and [[Reflash v1.1.0|Reflash]] are now built against the same kernel. They had drifted apart across kernel version, branch and Armbian release, which meant a kernel fix landed in one image but not the other.&lt;br /&gt;
* &#039;&#039;&#039;U-Boot 2026.07&#039;&#039;&#039;, replacing 2024.01.&lt;br /&gt;
&lt;br /&gt;
==The display==&lt;br /&gt;
* The panel is driven by &#039;&#039;&#039;simpledrm&#039;&#039;&#039;, adopting the framebuffer U-Boot has already set up from the display&#039;s EDID. The result is one mode from U-Boot through Plymouth to KlipperScreen, with no mode change and no flicker anywhere in the chain.&lt;br /&gt;
* This replaces a path where the HDMI driver could misread hotplug as low for about half a second while its PHY came up, get no EDID inside that window, and invent a 1024x768 mode. The framebuffer is allocated once and cannot grow, so that guess was permanent: the panel could not lock, dropped sync and blanked its own backlight.&lt;br /&gt;
* A redesigned Plymouth splash, and a framebuffer console that can be rotated to match a panel that is mounted rotated.&lt;br /&gt;
* A board with no panel now says &amp;quot;no display detected&amp;quot; rather than reporting a failure, and the barebone image gives you a shell on the panel instead of a frozen splash.&lt;br /&gt;
&lt;br /&gt;
==Booting==&lt;br /&gt;
* U-Boot no longer scans the USB-C port for boot devices, and holds PD7 low so the board never sources VBUS on USB-C.&lt;br /&gt;
* &amp;lt;code&amp;gt;bootm_size&amp;lt;/code&amp;gt; is wide enough for a Reflash initrd to be relocated. On U-Boot 2026.07 the memory map persists for the whole session, so scratch loads earlier in the boot script fragmented it and the initrd had nowhere to go.&lt;br /&gt;
* U-Boot no longer hunts for a netboot server that does not exist, which used to add a delay to every boot.&lt;br /&gt;
* A failed image load no longer results in the kernel being booted anyway.&lt;br /&gt;
&lt;br /&gt;
==Printer and hardware==&lt;br /&gt;
* The Klipper RP2040 binary is built with the image and flashed on first boot, and first boot now verifies that it was actually flashed and that Klipper reached its MCUs, rather than assuming.&lt;br /&gt;
* DRAM frequency scaling is disabled on A5 and A6.&lt;br /&gt;
* udev no longer probes the RP2 bootloader as though it were a disk.&lt;br /&gt;
* ustreamer starts from the camera device, so a camera present at boot is picked up.&lt;br /&gt;
&lt;br /&gt;
==Network and identity==&lt;br /&gt;
* &#039;&#039;&#039;Every board now generates its own SSH host key.&#039;&#039;&#039; v1.0.x shipped one key pair inside the image, so every Recore in the world presented the same host identity.&lt;br /&gt;
* Rebuild tries the configured network for a full two minutes before falling back to the hotspot, instead of giving up early.&lt;br /&gt;
* WiFi profiles apply to whatever dongle is present, and a board with no WiFi device leaves quietly instead of failing every boot.&lt;br /&gt;
* The board can report its own serial number, in every variant including barebone.&lt;br /&gt;
&lt;br /&gt;
==Removed==&lt;br /&gt;
* &#039;&#039;&#039;armbian-config&#039;&#039;&#039; and &#039;&#039;&#039;armbian-install&#039;&#039;&#039; are no longer installed. They defeat the package holds that keep Klipper, the kernel and U-Boot at the versions the image was tested with: &amp;lt;code&amp;gt;armbian-config&amp;lt;/code&amp;gt; runs &amp;lt;code&amp;gt;apt-mark unhold&amp;lt;/code&amp;gt;, and its software installer passes &amp;lt;code&amp;gt;--allow-change-held-packages&amp;lt;/code&amp;gt;. Removing them is what makes the held versions mean something.&lt;br /&gt;
&lt;br /&gt;
=Installing Rebuild on Recore=&lt;br /&gt;
Recore has eMMC (embedded MMC), so in order to install software on the board, a USB drive must be used. For instructions on making a flasher image, have a look at [[Reflash]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
In order to install Rebuild v1.1.0, you need to use Reflash v1.1.0. There is a blog post explaining this new way to install an image on Recore: https://www.iagent.no/2024/05/08/reflash-a-new-way-to-upgrade-firmware/&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Latest images==&lt;br /&gt;
The latest images for Recore are available from github. You can choose to download an image directly from within Reflash, or you can choose to download first and then upload it. Here are the latest images: https://github.com/intelligent-agent/Rebuild/releases&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
[[File:USB-C.png|thumb]]&lt;br /&gt;
[[File:Ethernet.png|thumb]]&lt;br /&gt;
[[File:Blink.png|thumb]]&lt;br /&gt;
[[File:Http.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
It can be a good idea to test the board on the bench before installing it in the printer. Use the USB-C connector or the 24V power plug to power the board and connect the ethernet cable between the board and your local network. &lt;br /&gt;
&lt;br /&gt;
Once power is applied, you should see a white LED light up in the middle of the board. After a few seconds, there should be activity on the eMMC LED, the CPU LED and on the heartbeat LED. &lt;br /&gt;
&lt;br /&gt;
Once the board is powered up, use a computer to access the web interface provided by OctoPrint/MainSail/Fluidd (the UI). &lt;br /&gt;
In order to get access the UI, a network cable must be connected to the board and to a network switch. It is also possible to use a wifi dongle, be please see &amp;quot;Known issues&amp;quot; at the bottom of the page for issues regarding Hotspot/AP.&lt;br /&gt;
If a network cable is used, the board should respond to the address:&lt;br /&gt;
http://recore.local&lt;br /&gt;
If using a wifi dongle, the default wifi network password is 12345678.&lt;br /&gt;
&lt;br /&gt;
For OctoPrint, once the interface is visible, run through the wizard to set up a new printer. &lt;br /&gt;
After the wizard is done, go to the Klipper tab in OctoPrint and edit the Klipper config file. &lt;br /&gt;
This is where the bulk of the work will happen. &lt;br /&gt;
&lt;br /&gt;
On the MainSail or Fluidd image, there should not need to be any configuration necessary. Verify that the web interface comes up and that Klipper is running as expected.&lt;br /&gt;
&lt;br /&gt;
== Klipper configuration ==&lt;br /&gt;
There is a standard klipper configuration file that comes with Refactor/Rebuild. The configuration file is set up &lt;br /&gt;
to work out of the box without anything connected on the pins of the board. The default Klipper config can be used as a starting point for building a custom config file for the printer at hand. &lt;br /&gt;
&lt;br /&gt;
After the Klipper configuration is complete, do a test print to make sure everything is working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Important&#039;&#039;&#039;====&lt;br /&gt;
If you get in a situation where Klipper is unable to start normally, replace the content of the &amp;quot;printer.cfg&amp;quot; file with the default config file that came with Rebuild. The default config file should be available in the &amp;quot;config examples&amp;quot; folder in Fluidd and Mainsail. You might need to do a full reboot of the board after going back to that default config. This is a good way to get back to a known working image. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Config-examples.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wifi on Recore==&lt;br /&gt;
Recore does not have wifi built in, but wifi can be added by using a USB dongle. There is a great dual band wifi dongle that has been tested with Recore and Rebuild and should work out of the box [[Rexfer_A0]]. Wifi can be set up to be either an access point (Hotspot) or to connect to an existing access point (wifi router). If nothing is set, the default will be to create a wifi hotspot called &amp;quot;Recore&amp;quot; with password 12345678.&lt;br /&gt;
&lt;br /&gt;
=== Wifi access point===&lt;br /&gt;
The first time Rebuild boots up, it will set up the wifi as an Access Point (AP). This is done by automatically changing the configuration of NetworkManager. The Wifi AP is called &#039;&#039;&#039;Recore&#039;&#039;&#039; and the password is &#039;&#039;&#039;12345678&#039;&#039;&#039;. This is meant as a temporary setup, so the password should be changed as soon as access is available. The default IP address for the AP is &#039;&#039;&#039;192.168.50.1&#039;&#039;&#039;. Once you have connected to the AP, either with a computer or a phone, it should be possible to gain ssh access. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh debian@192.168.50.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connecting to an external Wifi access point ===&lt;br /&gt;
If you have a Wifi dongle connected, you can connect to a local Wifi access point by using the &#039;&#039;&#039;nmtui&#039;&#039;&#039;  program. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Using nmtui&#039;&#039;&#039;====&lt;br /&gt;
nmtui is a Text UI tool to assist in managing network settings.&lt;br /&gt;
nmtui is mainly navigated using the arrow, space, enter, tab &amp;amp; escape keys.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
# Use SSH or the serial port to log in to the device.&lt;br /&gt;
# Start &#039;&#039;&#039;nmtui&#039;&#039;&#039;&lt;br /&gt;
# Select Activate connection&lt;br /&gt;
# Select wifi network and enter credentials&lt;br /&gt;
# Exit nmtui and verify connection to the wifi network with &#039;&#039;&#039;ip addr&#039;&#039;&#039; (If you connect via wifi hotspot, you will be disconnected)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Nmtui.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SSH access==&lt;br /&gt;
Most of the configuration for Klipper can be handled via the UI, but sometimes it is necessary to have SSH access to the board. By default, the SSH access is disabled, but it can be enabled in three ways.&lt;br /&gt;
# You can choose &amp;quot;enable SSH on new image&amp;quot; in the Reflash user interface&lt;br /&gt;
# You can start the SSH service from Mainsail/Fluidd&lt;br /&gt;
# You can start the ssh service from the serial port. The ssh service will then be persistent on next boot. &amp;lt;pre&amp;gt;systemctl start ssh&amp;lt;/pre&amp;gt;. &lt;br /&gt;
SSH access is only enabled for user &#039;&#039;&#039;debian&#039;&#039;&#039; using the password &#039;&#039;&#039;temppwd&#039;&#039;&#039;.&lt;br /&gt;
The first time you log in, you will be prompted to change the password. After the password has been changed, you will need to log in again. If you do not log in within an hour of enabling SSH, &#039;&#039;&#039;the SSH access will be disabled&#039;&#039;&#039;. This is for security reasons, it&#039;s not good to have an open SSH port with the default password. If the SSH access is disabled, it can be enabled again from the user interface.&lt;br /&gt;
&lt;br /&gt;
==Serial port acccess==&lt;br /&gt;
The USB-C port can be used to get a serial port interface to the board. Once the board is connected and booted, you should be able to see the board show up as a USB device. The serial interface can be used with Minicom on Linux, and PuTTY on Windows. &lt;br /&gt;
&lt;br /&gt;
===Upgrading Debian via apt upgrade===&lt;br /&gt;
The /boot partition of Rebuild is mounted &amp;quot;read only&amp;quot;, so it will have to be remounted as Read Write before running an upgrade. This is handled automatically by apt in this version: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable host mode on the USB-C connector ===&lt;br /&gt;
On Recore A7, the host mode for the USB C connector is activated using a device tree overlay. On A8, this is handled automatically.&lt;br /&gt;
To enable the host mode on Recore A7 write the following on the command line. First SSH into the board. Recore A6 and A5 can not operate in host mode with +5V output. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mount -o remount,rw /boot&lt;br /&gt;
sudo armbian-add-overlay /boot/overlay-user/sun50i-a64-usb-host.dts&lt;br /&gt;
sudo mount -o remount,ro /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using Moonraker and Mainsail==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Mainsail.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using KlipperScreen==&lt;br /&gt;
KlipperScreen is running on X, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /usr/share/X11/xorg.conf.d/90-monitor.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
    Identifier &amp;quot;None-1&amp;quot;&lt;br /&gt;
    Option &amp;quot;Rotate&amp;quot; &amp;quot;left&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;The connector name changed in v1.1.0&#039;&#039;&#039;====&lt;br /&gt;
Because the panel is now driven by simpledrm, the connector reports as &#039;&#039;Unknown&#039;&#039; rather than HDMI: it is &#039;&#039;&#039;Unknown-1&#039;&#039;&#039; to the kernel and &#039;&#039;&#039;None-1&#039;&#039;&#039; to Xorg, where v1.0.x had HDMI-A-1 and HDMI-1. Anything that matches on the connector name - a monitor section, a &amp;lt;code&amp;gt;video=&amp;lt;/code&amp;gt; argument, a Weston output - has to use the new name. The shipped configuration carries both, so it keeps working either way.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After that, KlipperScreen can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart KlipperScreen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it is necessary to rotate the touch panel as well, here is a useful section that can be added to the bottom of that same file. Uncomment the rotation that matches your setup.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;InputClass&amp;quot;&lt;br /&gt;
            Identifier &amp;quot;Coordinate Transformation Matrix&amp;quot;&lt;br /&gt;
            MatchIsTouchscreen &amp;quot;on&amp;quot;&lt;br /&gt;
            MatchDevicePath &amp;quot;/dev/input/event*&amp;quot;&lt;br /&gt;
            MatchDriver &amp;quot;libinput&amp;quot;&lt;br /&gt;
            Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;1 0 0 0 1 0 0 0 1&amp;quot;    # 0 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 1 0 -1 0 1 0 0 1&amp;quot;  # 90 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;-1 0 1 0 -1 1 0 0 1&amp;quot; # 180 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 -1 1 1 0 0 0 0 1&amp;quot;  # 270 degrees&lt;br /&gt;
&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Recompiling and installing binaries==&lt;br /&gt;
===Update u-boot on Recore===&lt;br /&gt;
This is not something the regular user would need to do, but documented here for convenience. &lt;br /&gt;
Place u-boot-sunxi-with-spl.bin in sector 15 (8KB offset)  &lt;br /&gt;
Flash the binary &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk2 bs=1024 seek=8 conv=notrunc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AR100 firmware===&lt;br /&gt;
The AR100 CPU needs a binary file that is loaded on startup by the systemd file klipper.service&lt;br /&gt;
The AR100 binary file comes pre-compiled in Refactor, so most users should not have to re-compile it. &lt;br /&gt;
For experiments the AR100 binary can be recompiled on Recore (architecture aarch64) or on a host computer (amd64 or similar).  &lt;br /&gt;
&lt;br /&gt;
====Compiling the ar100 binary====&lt;br /&gt;
To configure klipper for AR100 and build the binary:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper/&lt;br /&gt;
cp test/configs/ar100.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will produce a bin file located in out/ar100.bin, so it should be moved to /opt/firmware&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mv out/ar100.bin /opt/firmware/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Once the AR100 binary has been updated, klipper.service can be restarted which then loads the new AR100 binary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for ARM64====&lt;br /&gt;
The AR100 needs a cross compilation toolchain. For ARM64, it can be downloaded from feeds.iagent.no:&lt;br /&gt;
&lt;br /&gt;
http://feeds.iagent.no/toolchains/  &lt;br /&gt;
&lt;br /&gt;
The toolchain has been built with  &lt;br /&gt;
&lt;br /&gt;
https://github.com/richfelker/musl-cross-make&lt;br /&gt;
&lt;br /&gt;
GCC version: 11.2.0&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for x86_64====&lt;br /&gt;
The toolchain used during automatic testing and is the same used for the CRUST firmware project: &lt;br /&gt;
&lt;br /&gt;
https://github.com/crust-firmware/crust#building-the-firmware&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===STM32 firmware===&lt;br /&gt;
&lt;br /&gt;
The firmware for the stm32f031 mcu that is responsible for ADC &lt;br /&gt;
conversions and PWM for heaters and fans comes pre-installed in the flash of the MCU. &lt;br /&gt;
It can be recreated on the board using the Klipper build system.&lt;br /&gt;
&lt;br /&gt;
In the olden days, we used to do it manually.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
cp test/configs/stm32f031.config .config&lt;br /&gt;
make menuconfig&lt;br /&gt;
-&amp;gt; Enable extra low-level configuration options&lt;br /&gt;
-&amp;gt; Processor model (STM32F031)&lt;br /&gt;
-&amp;gt; Bootloader offset (No bootloader)&lt;br /&gt;
-&amp;gt; Clock Reference (Internal clock)&lt;br /&gt;
-&amp;gt; (16) Internal clock trim override&lt;br /&gt;
-&amp;gt; Communication interface (Serial (on USART2 PA15/PA14))&lt;br /&gt;
-&amp;gt; Baud rate for serial port: 250000&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the newer days, you can copy the config that is used by Rebuild. Please note that this is for Recore A8, which has the 32 KB flash version of the STM32.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
wget https://raw.githubusercontent.com/intelligent-agent/Rebuild/refs/heads/main/userpatches/overlay/klipper/stm32f031-32KB-serial.config&lt;br /&gt;
cp stm32f031-32KB-serial.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Flashing STM32 firmware====&lt;br /&gt;
To flash the STM32 firmware:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mv /opt/firmware/stm32-32KB.bin /opt/firmware/stm32-32KB_old.bin&lt;br /&gt;
sudo cp out/klipper.bin /opt/firmware/stm32-32KB.bin&lt;br /&gt;
sudo flash-stm32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Klipper===&lt;br /&gt;
Klipper is run as a systemd service. It should not normally need to be restarted from the command line, but during development it can be necessary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The log for Klipper is located in /tmp. It can be viewed as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tail -f /tmp/klippy.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Klipper can also be restarted from the OctoPrint interface. On the &amp;quot;Klipper&amp;quot; tab, press &amp;quot;Firmware&amp;quot; to restart the Klipper firmware. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Klipper-firmware-press.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Toggle===&lt;br /&gt;
Toggle is started automatically by the systemd service toggle.service. A user is created for Toggle on first boot, but the credentials are not set until a user is created in OctoPrint. Once the wizard has been completed, the Toggle user is active, but the credentials will not be valid until OctoPrint is restarted. Therefore, if Toggle is needed, restart OctoPrint after the wizard is complete.&lt;br /&gt;
&lt;br /&gt;
Toggle is running on Weston, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/xdg/weston/weston.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Edit the section about rotation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[output]&lt;br /&gt;
name=HDMI-A-1&lt;br /&gt;
transform=rotate-90&lt;br /&gt;
&lt;br /&gt;
[output]&lt;br /&gt;
name=Unknown-1&lt;br /&gt;
transform=rotate-90&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Both sections are given deliberately: the output is &#039;&#039;&#039;Unknown-1&#039;&#039;&#039; under simpledrm, which is what v1.1.0 ships, and &#039;&#039;&#039;HDMI-A-1&#039;&#039;&#039; on the older driver. Weston applies whichever one matches and ignores the other, so a single file works on both.&lt;br /&gt;
&lt;br /&gt;
After that, Weston can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart weston&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See the Ubuntu documentation for valid rotations: [https://manpages.ubuntu.com/manpages/jammy/man5/weston.ini.5.html weston.ini]&lt;br /&gt;
== Recore booting ==&lt;br /&gt;
There are several stages to booting Recore, and depending on which media is installed, the boot process will &lt;br /&gt;
try and boot either from eMMC, USB host or USB device (FEL).&lt;br /&gt;
&lt;br /&gt;
The board can be booted by either pressing the &amp;quot;BOOT&amp;quot; button for 2 seconds or by applying power to either the 24V connector or the USB C connector. To shut down the board, either use the &amp;quot;shutdown&amp;quot; button from the UI or press the &amp;quot;BOOT&amp;quot; button once. It&#039;s not ideal to shut off the board by removing power directly as this can cause a corrupted file system. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From eMMC&amp;quot;&amp;gt;&lt;br /&gt;
===Booting Recore from eMMC (the normal way)===&lt;br /&gt;
# Turn on power&lt;br /&gt;
# The BROM will load u-boot SPL from eMMC&lt;br /&gt;
# The u-boot SPL will load u-boot&lt;br /&gt;
# u-boot will load Linux&lt;br /&gt;
# Linux will load the rootfs from eMMC.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From USB&amp;quot;&amp;gt;&lt;br /&gt;
===Loading u-boot from eMMC but load kernel and rootfs from USB===&lt;br /&gt;
Starting with Rebuild v1.0.0, u-boot will do a scan for a USB mass storage device and if a working version of Reflash or Rebuild or Refactor is found, it will boot to that image.&lt;br /&gt;
# Download Refactor/Rebuild/Reflash and flash it to a USB drive.&lt;br /&gt;
# Insert the USB drive in the board. &lt;br /&gt;
# Boot the board normally (Use the Boot button/apply power)&lt;br /&gt;
The board should now be have the kernel/rootfs from the USB drive.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From FEL&amp;quot;&amp;gt;&lt;br /&gt;
===Boot Recore from a USB stick using the FEL button===&lt;br /&gt;
If u-boot should be loaded from a host computer and kernel and rootfs is loaded from a USB drive:&lt;br /&gt;
# Flash the [[Reflash]] Linux distro to a USB drive. &lt;br /&gt;
# Insert the USB drive in the Recore board in one of the two host connectors close to the HDMI.&lt;br /&gt;
# Hold down the FEL button while applying power to the board via the USB-C connector.&lt;br /&gt;
# Download the Recore repository https://github.com/intelligent-agent/Recore&lt;br /&gt;
# Install the sunxi-tools program&lt;br /&gt;
# Run the fel command (&#039;&#039;&#039;make fel&#039;&#039;&#039;) from the host computer. All the necessary binarys are in the Recore repository:&lt;br /&gt;
You can read more about the steps needed to boot aboard in FEL mode on the Sunxi wiki: https://linux-sunxi.org/FEL&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Depending on what linux platform you&#039;re running from, sunxi-tools will require the following dependencies to compile properly:&lt;br /&gt;
* libftd-dev&lt;br /&gt;
* libusbx-dev&lt;br /&gt;
* libudev-dev&lt;br /&gt;
(These are Debian/ubuntu names. For Fedora, change -dev to -devel)&lt;br /&gt;
&lt;br /&gt;
This should upload u-boot from the host computer to the board via the USB cable. u-boot will then boot from the connected USB drive. &lt;br /&gt;
Please note that in some instances, the USB drive is not detected as a mass storage device without also having the VIN power connector inserted. See more in [[Recore_A6#USB_connectors_not_discovered_when_powered_by_USB_device|in the &amp;quot;known errors&amp;quot; section of Recore A6]]&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running OctoPrint===&lt;br /&gt;
OctoPrint is stated on boot. If there is a need to restart the daemon, use this command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart octoprint&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues==&lt;br /&gt;
===A display connected after boot is not detected===&lt;br /&gt;
The panel is driven from the framebuffer U-Boot set up, so the mode is whatever U-Boot read from the display&#039;s EDID at power-on. A display plugged in while the board is running will not be picked up - reboot with it connected. A different panel that is present at boot works normally, because U-Boot reads its EDID too. This is the trade for a flicker-free boot: there is no KMS and no runtime hotplug on this path.&lt;br /&gt;
&lt;br /&gt;
===Having both Ethernet and Wi-Fi creates problems with mDNS===&lt;br /&gt;
When having both ethernet and Wi-Fi connected there can be a problem with hostname resolution. &lt;br /&gt;
The workaround is to either remove Wi-Fi or ethernet.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Main_Page&amp;diff=1663</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Main_Page&amp;diff=1663"/>
		<updated>2026-09-11T20:06:05Z</updated>

		<summary type="html">&lt;p&gt;Elias: Link AI-assisted contributions under Guides&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#tweekihide:navbar-right}}&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Delta H.jpg]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the documentation for Recore, Manga Screen 1 and 2, Refactor and Toggle hardware and software products developed by made by Intelligent Agent. All software is free and open source. Recore is open schematic hardware and can be conveniently purchased in the store. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mediawiki&amp;quot; style=&amp;quot;width: 100%; vertical-align:top;&amp;quot;&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
* [[Recore A8]]&lt;br /&gt;
* [[Recore A7]]&lt;br /&gt;
* [[Recore A6]]&lt;br /&gt;
* [[Remove A1]]&lt;br /&gt;
* [[Restep A1]]&lt;br /&gt;
* [[Rexfer A0]]&lt;br /&gt;
* [[Relit A0]]&lt;br /&gt;
* [[Revolt A2]]&lt;br /&gt;
* [[Rebase A0]]&lt;br /&gt;
* [[Retool_A2]]&lt;br /&gt;
* [[Renits_A5]] WIP&lt;br /&gt;
* [[Reheat_A0]] WIP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
* [[Rebuild]] Current Linux OS for Recore&lt;br /&gt;
* [[Refactor]] Legacy Linux OS for Recore&lt;br /&gt;
* [[Reflash]] Image to install Refactor/Rebuild&lt;br /&gt;
* [[Mainline Klipper]] How to use the main Klipper release on Recore&lt;br /&gt;
* [[Toggle]] User interface for OctoPrint&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
==HowTo==&lt;br /&gt;
* [[Getting started]]&lt;br /&gt;
* [[Connecting | Connecting to the board]]&lt;br /&gt;
* [[Webcams]]&lt;br /&gt;
* [[Printer_101 | Printer 101]]&lt;br /&gt;
* [[FAQ]]&lt;br /&gt;
* [https://discord.gg/bCnp9H5SB5 Discord]&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
====Old hardware====&lt;br /&gt;
* [[Replicape Rev B]]&lt;br /&gt;
* [[Replicape Rev A]]&lt;br /&gt;
* [[Manga Screen 2]]&lt;br /&gt;
* [[Manga Screen 1]]&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
====Off site====&lt;br /&gt;
* [https://www.klipper3d.org/ Klipper] The &amp;quot;firmware&amp;quot; for Replicape/Recore&lt;br /&gt;
* [https://docs.mainsail.xyz/ Mainsail] A modern and responsive user interface for Klipper&lt;br /&gt;
* [https://octoprint.org/ OctoPrint ] A snappy web interface for 3D printers&lt;br /&gt;
* [https://docs.fluidd.xyz/ Fluidd] Responsive web based user interface for Klipper.&lt;br /&gt;
* [https://klipperscreen.readthedocs.io/en/latest/ KlipperScreen] A touchscreen GUI that interfaces with Klipper&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
====Guides====&lt;br /&gt;
* [[BLTouch | Using BLTouch with Replicape]]&lt;br /&gt;
* [[Adding a Servo | Adding a Servo to Replicape]]&lt;br /&gt;
* [[Adding a Probe for G29/G33]]&lt;br /&gt;
* [[Cartesian | Cartesian configuration guide]]&lt;br /&gt;
* [[Corexy | CoreXY configuration guide]]&lt;br /&gt;
* [[OEM_customization | OEM display customisation on Recore]]&lt;br /&gt;
* [[Voron_2.4 | Voron 2.4 wiring]]&lt;br /&gt;
* [[AI-assisted contributions | Submitting AI-assisted code]]&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
* [[ Dev Team Bios | Development Team ]]&lt;br /&gt;
* [[Beta Testing | Running the Develop Branch on Your Printer]]&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Contributing ==&lt;br /&gt;
* [[Special:CreateAccount | Add new users to this wiki]]&lt;br /&gt;
* [[Formatting | Formatting on this wiki]]&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
== Legacy Information ==&lt;br /&gt;
* [[Thing]]&lt;br /&gt;
* [[Thing Delta]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Reflash_v1.1.0&amp;diff=1662</id>
		<title>Reflash v1.1.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Reflash_v1.1.0&amp;diff=1662"/>
		<updated>2026-09-11T20:05:38Z</updated>

		<summary type="html">&lt;p&gt;Elias: Write up the v1.1.0 release&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reflash header.png|Reflash header.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reflash is a Linux image for downloading and installing [[Rebuild]] and [[Refactor]] images on [[Recore]]. You can also create an image from the contents of the eMMC.&lt;br /&gt;
&lt;br /&gt;
The latest image is: [https://github.com/intelligent-agent/Reflash/releases/tag/v1.1.0 Reflash v1.1.0]&lt;br /&gt;
&lt;br /&gt;
For the previous release, see [[Reflash v1.0.1]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note on v1.1.0&#039;&#039;&#039;====&lt;br /&gt;
v1.1.0 is a maintenance release: the instructions below are unchanged from v1.0.1, and a USB drive written with v1.0.x can simply be rewritten with the new image. The changes are in what happens once the board is running - the screen, the WiFi setup, the USB console and the error reporting. See [[#What is new in v1.1.0|What is new in v1.1.0]].&lt;br /&gt;
&lt;br /&gt;
The kernel has moved from 5.15 to &#039;&#039;&#039;6.18.33&#039;&#039;&#039;, the same kernel [[Rebuild]] ships. Reflash and Rebuild previously ran different kernel versions from different Armbian branches, which meant a kernel fix landed in one image but not the other.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Entering FEL mode&#039;&#039;&#039;====&lt;br /&gt;
The first time you use Reflash 1.0.0 and above, you need to boot to Reflash using FEL-mode. Hold the FEL button on the board down and press the RST (reset) button. You need to have a USB C cable connected between the USB C connector on Recore and a host computer.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Linux&amp;quot;&amp;gt;&lt;br /&gt;
You should see the board show up as a USB device:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsusb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:FEL-mode lsusb.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Download the Recore git repository. On the command line write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://github.com/intelligent-agent/Recore/raw/master/binaries/Recore-fel.zip&lt;br /&gt;
unzip Recore-fel.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Install the sunxi-tools package on the host computer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install sunxi-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now you can run the whole command on a shell.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo sunxi-fel -v -p spl fel/sunxi-spl.bin write 0x44000 fel/bl31.bin write 0x4a000000 fel/u-boot.bin reset64 0x44000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On the host computer, you should see the binary files being uploaded like the following:&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Make-fel.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Windows&amp;quot;&amp;gt;&lt;br /&gt;
# Open Device Manager and check that the device shows up. It might not have a known vendor and product description. &amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;[[File:Windows-Device-manager.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
# Download the [https://github.com/intelligent-agent/Recore/archive/refs/heads/master.zip Recore repository] and extract the contents.&lt;br /&gt;
# Download [https://github.com/eperie/build-scripts/releases/download/v1.3/sunxi-tools-mingw64-530adfa.zip sunxi-fel binary for windows] and extract the contents so it is the the Recore-master folder.&lt;br /&gt;
# Download and install Zadig https://linux-sunxi.org/FEL/USBBoot#Using_sunxi-fel_on_Windows&lt;br /&gt;
# Open the CMD prompt and navigate to the extracted Recore folder.&lt;br /&gt;
# Insert the USB drive with Reflash (See instructions further down)&lt;br /&gt;
# Run the following command from the Recore folder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(prefix) sunxi-fel.exe -v -p spl binaries\new\sunxi-spl.bin write 0x44000 binaries\new\bl31.bin write 0x4a000000 binaries\new\u-boot.bin reset64 0x44000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After running that command, you should see the SPL and u-boot being transferred and the board should start to boot from the USB drive.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;[[File:Sunxi-fel-windows.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Instructions==&lt;br /&gt;
This page has step-by-step instructions for using the image. Here is what you should do:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Use [https://www.balena.io/etcher/ Balena Etcher] to download and flash the Reflash image. Here is the URL to the image: &amp;lt;pre&amp;gt;https://github.com/intelligent-agent/Reflash/releases/download/v1.1.0/reflash-v1.1.0.img.xz&amp;lt;/pre&amp;gt;&lt;br /&gt;
You can also download it from here: https://github.com/intelligent-agent/Reflash/releases/tag/v1.1.0&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;[[File:BalenaEthcer.png|center]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
After flashing the image to a USB drive with at least 4 GB of storage, eject the USB drive &amp;lt;b&amp;gt;properly&amp;lt;/b&amp;gt; and insert it in a USB port on the Recore board.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
If you want to get back to Reflash from Rebuild or Refactor, you can do so by having the USB drive inserted during boot. A reboot can be done from Mainsail, Fluidd or OctoPrint.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Once the board has booted from USB, you should be able to access the web interface using the address http://recore.local&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;[[File:Reflash.png|center]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
From the web interface, choose which version of Refactor/Rebuild you want to download. There are two types of images, either with OctoPrint as the web interface, with Mainsail or with Fluidd. You can also choose to upload a custom image using the &amp;quot;Upload file&amp;quot; option.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Once the image has been downloaded (to the USB drive) you can install/flash the image to the eMMC. This will take 3-4 minutes.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Once the image has been flashed on the eMMC drive, you can reboot the board, and it will boot using the image that you chose.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
You can keep the Reflash USB drive in a safe place and reuse it the next time you want to upgrade the software. If you want to upgrade to a later version of Rebuild, the same image can be used again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;A note on USB drives&#039;&#039;&#039;====&lt;br /&gt;
The USB drive matters more than it looks like it should. Reflash runs entirely from it, downloads the image onto it and reads the image back off it while flashing, so a slow or worn drive shows up as a slow first boot and a slow upload - the difference between a good and a bad drive has been measured at 22 seconds against nearly four minutes to reach the web interface. If Reflash is unusually slow, try a different drive before looking for anything else.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What is new in v1.1.0==&lt;br /&gt;
&lt;br /&gt;
===The screen===&lt;br /&gt;
* Reflash now draws its own status screen on the attached panel: the version, what it is doing, and a progress bar, ending in &amp;quot;Flash complete, remove USB drive&amp;quot;. Previously the panel showed the boot console.&lt;br /&gt;
* A splash is shown from the boot partition while U-Boot runs, and U-Boot no longer prints over it.&lt;br /&gt;
* The panel is handed to simpledrm by the shipped DTB, so the screen comes up the same way it does in Rebuild.&lt;br /&gt;
* Removing the USB drive is acknowledged on the panel instead of being silently ignored.&lt;br /&gt;
&lt;br /&gt;
===WiFi===&lt;br /&gt;
* WiFi is managed by iwd, and whether a dongle is present is decided from sysfs rather than from iwd&#039;s transient view - a failed status request no longer claims the dongle was removed.&lt;br /&gt;
* The info panel shows how the board is connected and how strong the signal is. A wired link is preferred over WiFi, so the two interfaces cannot confuse each other.&lt;br /&gt;
* Setting WiFi up on a board that then fails to connect no longer leaves the board unreachable, and every WiFi request has a timeout so a slow scan cannot freeze the dialog.&lt;br /&gt;
* The passphrase is kept out of the log and is no longer served back to the browser.&lt;br /&gt;
* A board with no WiFi adapter at all now skips WiFi gracefully instead of erroring.&lt;br /&gt;
&lt;br /&gt;
===USB console and the control protocol===&lt;br /&gt;
* The USB gadget exposes two ACM functions. &amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; on the host is a login prompt (user &#039;&#039;&#039;debian&#039;&#039;&#039;, password &#039;&#039;&#039;temppwd&#039;&#039;&#039;), and &amp;lt;code&amp;gt;/dev/ttyACM1&amp;lt;/code&amp;gt; is a line-based control protocol for listing, starting and polling a flash without the web UI.&lt;br /&gt;
* This matters on a board with no network - a failed WiFi setup used to leave the UART header inside the case as the only console.&lt;br /&gt;
* The same protocol is available on the board itself through &amp;lt;code&amp;gt;reflash-ctl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Flashing and uploads===&lt;br /&gt;
* An image that fails its integrity check can no longer be installed.&lt;br /&gt;
* A large upload is sent as raw binary with client-side retry, and the destination file is held open across chunks, which fixed uploads timing out part way through.&lt;br /&gt;
* Closing the browser tab cancels the upload instead of leaving the server waiting.&lt;br /&gt;
* Transfer throughput is charted in a popup on the progress bar, with peak and average.&lt;br /&gt;
* If the eMMC stops responding during the final cleanup, Reflash now says so and asks for a power cycle, rather than sitting at 100% forever.&lt;br /&gt;
* A failed image load no longer results in the board booting anyway.&lt;br /&gt;
&lt;br /&gt;
===Board information===&lt;br /&gt;
* Board metrics - temperature, DRAM rail, throughput - are plotted behind a button in the Info dropdown.&lt;br /&gt;
* The over-temperature warning now triggers at the temperature the SoC actually throttles at.&lt;br /&gt;
* If the board revision cannot be read, Reflash says so loudly and keeps the log, instead of guessing.&lt;br /&gt;
* Each board gets its own persistent SSH host key, and identifies itself to DHCP by MAC address, so two boards cannot end up sharing one lease.&lt;br /&gt;
&lt;br /&gt;
===A5 and A6 boards===&lt;br /&gt;
* The DRAM rail is raised at boot and DRAM frequency scaling is disabled on A5 and A6, from the same universal image - no separate build for older boards.&lt;br /&gt;
&lt;br /&gt;
==Reflash image==&lt;br /&gt;
Reflash is an initRamFS Linux image. That is in order to completely remove the boot medium before a reboot occurs. Because of that, Reflash needs to be very small. The application is built in Go which makes it stand alone with very little dependencies. The network management is handled by systemd-networkd and systemd-resolved, and WiFi by iwd. Very few extra programs are installed, and any additional programs that get installed will be lost after a reboot.&lt;br /&gt;
&lt;br /&gt;
The root filesystem is Debian trixie, built with debootstrap &amp;lt;code&amp;gt;--variant=minbase&amp;lt;/code&amp;gt;. The kernel is &#039;&#039;&#039;6.18.33&#039;&#039;&#039;, the same one [[Rebuild]] ships.&lt;br /&gt;
&lt;br /&gt;
SSH is enabled for user &#039;&#039;&#039;debian&#039;&#039;&#039; with password &#039;&#039;&#039;temppwd&#039;&#039;&#039;. The same password is set for &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Known issues==&lt;br /&gt;
===Flash progress not showing any progress===&lt;br /&gt;
Sometimes the flashing process does not work as expected. There is no progress on the progress indicator and the flashing never completes. A workaround is to go back to step 1 and install Reflash again.&lt;br /&gt;
&lt;br /&gt;
===A USB drive that is not detected===&lt;br /&gt;
On some boards the USB drive is not enumerated at boot. Reflash waits for the drive and counts the wait on screen, and names a drive that never appears as broken. If it never appears, power the board off completely - a reset is not always enough - and try again, or try a different drive. This is tracked as [https://github.com/intelligent-agent/Reflash/issues/88 Reflash issue #88].&lt;br /&gt;
&lt;br /&gt;
==Contributing==&lt;br /&gt;
Bug reports and pull requests are welcome at [https://github.com/intelligent-agent/Reflash Reflash on GitHub]. If you use an AI assistant to write the patch, see [[AI-assisted contributions]].&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=AI-assisted_contributions&amp;diff=1661</id>
		<title>AI-assisted contributions</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=AI-assisted_contributions&amp;diff=1661"/>
		<updated>2026-09-11T19:57:47Z</updated>

		<summary type="html">&lt;p&gt;Elias: Create the AI contribution policy from Rebuild#66: AI-generated PRs are allowed, with labelling and testing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The intelligent-agent projects &#039;&#039;&#039;accept pull requests written with the help of AI tools&#039;&#039;&#039;. This page sets out the rules, so contributors do not have to guess and maintainers apply the same standard to everyone.&lt;br /&gt;
&lt;br /&gt;
It applies to every open-source &#039;&#039;&#039;software&#039;&#039;&#039; repository maintained by the intelligent-agent community. It does not apply to the hardware repositories.&lt;br /&gt;
&lt;br /&gt;
== The short version ==&lt;br /&gt;
&lt;br /&gt;
AI-generated contributions are allowed. Label them, test them, and stand behind them.&lt;br /&gt;
&lt;br /&gt;
== Rules ==&lt;br /&gt;
&lt;br /&gt;
=== 1. AI-assisted work is welcome ===&lt;br /&gt;
&lt;br /&gt;
Using an AI tool to write a change is not a reason to reject it. We care about whether a change is correct and tested, not about which editor, generator or assistant produced it.&lt;br /&gt;
&lt;br /&gt;
=== 2. Test it before you submit it ===&lt;br /&gt;
&lt;br /&gt;
Every change must be &#039;&#039;&#039;demonstrably tested&#039;&#039;&#039; before submission, and the pull request should say how. On this codebase that usually means running it on real hardware, because most of what we ship only fails there.&lt;br /&gt;
&lt;br /&gt;
This is the condition the rest of the policy rests on. Current agents are capable, but they are still language models: they misunderstand, and they invent things that look right. A confident explanation is not evidence. A passing test on a real board is.&lt;br /&gt;
&lt;br /&gt;
=== 3. Label it ===&lt;br /&gt;
&lt;br /&gt;
Any pull request containing AI-generated code must be &#039;&#039;&#039;clearly labelled as such&#039;&#039;&#039;. Say which parts were generated and what you did to verify them. This is not a mark against the change — it tells a reviewer where to look hardest.&lt;br /&gt;
&lt;br /&gt;
=== 4. Maintainers may verify or decline ===&lt;br /&gt;
&lt;br /&gt;
Where there is doubt about the testing behind a change, maintainers may test it themselves or decline it. Declining is about missing evidence, not about the use of AI.&lt;br /&gt;
&lt;br /&gt;
=== 5. Reading the code is unrestricted ===&lt;br /&gt;
&lt;br /&gt;
Using AI agents to debug, explore, understand or audit the codebase is &#039;&#039;&#039;unrestricted&#039;&#039;&#039;. It changes nothing in a release, so it needs no permission and no label.&lt;br /&gt;
&lt;br /&gt;
== Labelling a pull request ==&lt;br /&gt;
&lt;br /&gt;
Add a short note to the description. Something like:&lt;br /&gt;
&lt;br /&gt;
 Parts of this change were generated with an AI assistant.&lt;br /&gt;
 Generated: src/foo.c error handling, and its test.&lt;br /&gt;
 Tested: flashed to a Recore A8, ran 30 boot cycles, no regressions.&lt;br /&gt;
&lt;br /&gt;
== Rationale ==&lt;br /&gt;
&lt;br /&gt;
Two failure modes are worth naming, because they are what the rules are aimed at.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Untested code that looks finished.&#039;&#039;&#039; Generated code is fluent by construction, so it passes a reading review more easily than hand-written code of the same quality. That makes the reviewer&#039;s usual defence weaker, and shifts the burden onto evidence of testing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Confident wrongness.&#039;&#039;&#039; A model will explain a mechanism it has invented as readily as one that exists. Claims in a pull request description should be traceable to something observed — a log, a measurement, a test run — rather than to an explanation.&lt;br /&gt;
&lt;br /&gt;
Neither is an argument against using the tools. They are an argument for labelling and testing, which is all this policy asks.&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
&lt;br /&gt;
Derived from the discussion in [https://github.com/intelligent-agent/Rebuild/issues/66 Rebuild issue #66]. The intent is that this page is the canonical statement, and that a matching guidelines document is submitted to each open-source repository.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.1.0&amp;diff=1660</id>
		<title>Rebuild v1.1.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.1.0&amp;diff=1660"/>
		<updated>2026-09-07T20:25:21Z</updated>

		<summary type="html">&lt;p&gt;Elias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Rebuild header.png|center]]&lt;br /&gt;
Rebuild is a complete Linux image for [[Recore A8|Recore]] 3D printer controller boards. Rebuild comes with Klipper installed and the choice of either [https://docs.mainsail.xyz/ MainSail], [https://docs.fluidd.xyz/ Fluidd] or [https://octoprint.org/ OctoPrint]. The name Rebuild is a reflection of the [https://www.armbian.com/ Armbian] build system, but adapted for Recore boards. &lt;br /&gt;
&lt;br /&gt;
Rebuild has now been released as v1.1.0&lt;br /&gt;
&lt;br /&gt;
=Installing Rebuild on Recore=&lt;br /&gt;
Recore has eMMC (embedded MMC), so in order to install sotware on the board, a USB drive must be used. For instructions on making a flasher image, have a look at [[Reflash]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
In order to install Rebuild v1.1.0, you need to use Reflash v1.1.0. There is a blog post explaining this new way to install an image on Recore: https://www.iagent.no/2024/05/08/reflash-a-new-way-to-upgrade-firmware/&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Latest images==&lt;br /&gt;
The latest images for Recore are available from github. You can choose to download an image directly from within Reflash, or you can choose to download first and then upload it. Here are the latest images: https://github.com/intelligent-agent/Rebuild/releases&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
[[File:USB-C.png|thumb]]&lt;br /&gt;
[[File:Ethernet.png|thumb]]&lt;br /&gt;
[[File:Blink.png|thumb]]&lt;br /&gt;
[[File:Http.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
It can be a good idea to test the board on the bench before installing it in the printer. Use the USB-C connector or the 24V power plug to power the board and connect the ethernet cable between the board and your local network. &lt;br /&gt;
&lt;br /&gt;
Once power is applied, you should see a white LED light up in the middle of the board. After a few seconds, there should be activity on the eMMC LED, the CPU LED and on the heartbeat LED. &lt;br /&gt;
&lt;br /&gt;
Once the board is powered up, use a computer to access the web interface provided by OctoPrint/MainSail/Fluidd (the UI). &lt;br /&gt;
In order to get access the UI, a network cable must be connected to the board and to a network switch. It is also possible to use a wifi dongle, be please see &amp;quot;Known issues&amp;quot; at the bottom of the page for issues regarding Hotspot/AP.&lt;br /&gt;
If a network cable is used, the board should respond to the address:&lt;br /&gt;
http://recore.local&lt;br /&gt;
If using a wifi dongle, the default wifi network password is 12345678.&lt;br /&gt;
&lt;br /&gt;
For OctoPrint, once the interface is visible, run through the wizard to set up a new printer. &lt;br /&gt;
After the wizard is done, go to the Klipper tab in OctoPrint and edit the Klipper config file. &lt;br /&gt;
This is where the bulk of the work will happen. &lt;br /&gt;
&lt;br /&gt;
On the MainSail or Fluidd image, there should not need to be any configuration necessary. Verify that the web interface comes up and that Klipper is running as expected.&lt;br /&gt;
&lt;br /&gt;
== Klipper configuration ==&lt;br /&gt;
There is a standard klipper configuration file that comes with Refactor/Rebuild. The configuration file is set up &lt;br /&gt;
to work out of the box without anything connected on the pins of the board. The default Klipper config can be used as a starting point for building a custom config file for the printer at hand. &lt;br /&gt;
&lt;br /&gt;
After the Klipper configuration is complete, do a test print to make sure everything is working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Important&#039;&#039;&#039;====&lt;br /&gt;
If you get in a situation where Klipper is unable to start normally, replace the content of the &amp;quot;printer.cfg&amp;quot; file with the default config file that came with Rebuild. The default config file should be available in the &amp;quot;config examples&amp;quot; folder in Fluidd and Mainsail. You might need to do a full reboot of the board after going back to that default config. This is a good way to get back to a known working image. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Config-examples.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wifi on Recore==&lt;br /&gt;
Recore does not have wifi built in, but wifi can be added by using a USB dongle. There is a great dual band wifi dongle that has been tested with Recore and Rebuild and should work out of the box [[Rexfer_A0]]. Wifi can be set up to be either an access point (Hotspot) or to connect to an existing access point (wifi router). If nothing is set, the default will be to create a wifi hotspot called &amp;quot;Recore&amp;quot; with password 12345678.&lt;br /&gt;
&lt;br /&gt;
=== Wifi access point===&lt;br /&gt;
The first time Rebuild boots up, it will set up the wifi as an Access Point (AP). This is done by automatically changing the configuration of NetworkManager. The Wifi AP is called &#039;&#039;&#039;Recore&#039;&#039;&#039; and the password is &#039;&#039;&#039;12345678&#039;&#039;&#039;. This is meant as a temporary setup, so the password should be changed as soon as access is available. The default IP address for the AP is &#039;&#039;&#039;192.168.50.1&#039;&#039;&#039;. Once you have connected to the AP, either with a computer or a phone, it should be possible to gain ssh access. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh debian@192.168.50.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connecting to an external Wifi access point ===&lt;br /&gt;
If you have a Wifi dongle connected, you can connect to a local Wifi access point by using the &#039;&#039;&#039;nmtui&#039;&#039;&#039;  program. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Using nmtui&#039;&#039;&#039;====&lt;br /&gt;
nmtui is a Text UI tool to assist in managing network settings.&lt;br /&gt;
nmtui is mainly navigated using the arrow, space, enter, tab &amp;amp; escape keys.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
# Use SSH or the serial port to log in to the device.&lt;br /&gt;
# Start &#039;&#039;&#039;nmtui&#039;&#039;&#039;&lt;br /&gt;
# Select Activate connection&lt;br /&gt;
# Select wifi network and enter credentials&lt;br /&gt;
# Exit nmtui and verify connection to the wifi network with &#039;&#039;&#039;ip addr&#039;&#039;&#039; (If you connect via wifi hotspot, you will be disconnected)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Nmtui.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SSH access==&lt;br /&gt;
Most of the configuration for Klipper can be handled via the UI, but sometimes it is necessary to have SSH access to the board. By default, the SSH access is disabled, but it can be enabled in three ways.&lt;br /&gt;
# You can choose &amp;quot;enable SSH on new image&amp;quot; in the Reflash user interface&lt;br /&gt;
# You can start the SSH service from Mainsail/Fluidd&lt;br /&gt;
# You can start the ssh service from the serial port. The ssh service will then be persistent on next boot. &amp;lt;pre&amp;gt;systemctl start ssh&amp;lt;/pre&amp;gt;. &lt;br /&gt;
SSH access is only enabled for user &#039;&#039;&#039;debian&#039;&#039;&#039; using the password &#039;&#039;&#039;temppwd&#039;&#039;&#039;.&lt;br /&gt;
The first time you log in, you will be prompted to change the password. After the password has been changed, you will need to log in again. If you do not log in within an hour of enabling SSH, &#039;&#039;&#039;the SSH access will be disabled&#039;&#039;&#039;. This is for security reasons, it&#039;s not good to have an open SSH port with the default password. If the SSH access is disabled, it can be enabled again from the user interface.&lt;br /&gt;
&lt;br /&gt;
==Serial port acccess==&lt;br /&gt;
The USB-C port can be used to get a serial port interface to the board. Once the board is connected and booted, you should be able to see the board show up as a USB device. The serial interface can be used with Minicom on Linux, and PuTTY on Windows. &lt;br /&gt;
&lt;br /&gt;
===Upgrading Debian via apt upgrade===&lt;br /&gt;
The /boot partition of Rebuild is mounted &amp;quot;read only&amp;quot;, so it will have to be remounted as Read Write before running an upgrade. This is handled automatically by apt in this version: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable host mode on the USB-C connector ===&lt;br /&gt;
On Recore A7, the host mode for the USB C connector is activated using a device tree overlay. On A8, this is handled automatically.&lt;br /&gt;
To enable the host mode on Recore A7 write the following on the command line. First SSH into the board. Recore A6 and A5 can not operate in host mode with +5V output. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mount -o remount,rw /boot&lt;br /&gt;
sudo armbian-add-overlay /boot/overlay-user/sun50i-a64-usb-host.dts&lt;br /&gt;
sudo mount -o remount,ro /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using Moonraker and Mainsail==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Mainsail.png]]&lt;br /&gt;
&lt;br /&gt;
==Using KlipperScreen==&lt;br /&gt;
KlipperScreen is running on X, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /usr/share/X11/xorg.conf.d/90-monitor.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
    Identifier &amp;quot;HDMI-1&amp;quot;&lt;br /&gt;
    Option &amp;quot;Rotate&amp;quot; &amp;quot;left&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
After that, KlipperScreen can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart KlipperScreen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it is necessary to rotate the touch panel as well, here is a useful section that can be added to the bottom of that same file. Uncomment the rotation that matches your setup.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;InputClass&amp;quot;&lt;br /&gt;
            Identifier &amp;quot;Coordinate Transformation Matrix&amp;quot;&lt;br /&gt;
            MatchIsTouchscreen &amp;quot;on&amp;quot;&lt;br /&gt;
            MatchDevicePath &amp;quot;/dev/input/event*&amp;quot;&lt;br /&gt;
            MatchDriver &amp;quot;libinput&amp;quot;&lt;br /&gt;
            Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;1 0 0 0 1 0 0 0 1&amp;quot;    # 0 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 1 0 -1 0 1 0 0 1&amp;quot;  # 90 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;-1 0 1 0 -1 1 0 0 1&amp;quot; # 180 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 -1 1 1 0 0 0 0 1&amp;quot;  # 270 degrees&lt;br /&gt;
&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Recompiling and installing binaries==&lt;br /&gt;
===Update u-boot on Recore===&lt;br /&gt;
This is not something the regular user would need to do, but documented here for convenience. &lt;br /&gt;
Place u-boot-sunxi-with-spl.bin in sector 15 (8KB offset)  &lt;br /&gt;
Flash the binary &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk2 bs=1024 seek=8 conv=notrunc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AR100 firmware===&lt;br /&gt;
The AR100 CPU needs a binary file that is loaded on startup by the systemd file klipper.service&lt;br /&gt;
The AR100 binary file comes pre-compiled in Refactor, so most users should not have to re-compile it. &lt;br /&gt;
For experiments the AR100 binary can be recompiled on Recore (architecture aarch64) or on a host computer (amd64 or similar).  &lt;br /&gt;
&lt;br /&gt;
====Compiling the ar100 binary====&lt;br /&gt;
To configure klipper for AR100 and build the binary:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper/&lt;br /&gt;
cp test/configs/ar100.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will produce a bin file located in out/ar100.bin, so it should be moved to /opt/firmware&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mv out/ar100.bin /opt/firmware/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Once the AR100 binary has been updated, klipper.service can be restarted which then loads the new AR100 binary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for ARM64====&lt;br /&gt;
The AR100 needs a cross compilation toolchain. For ARM64, it can be downloaded from feeds.iagent.no:&lt;br /&gt;
&lt;br /&gt;
http://feeds.iagent.no/toolchains/  &lt;br /&gt;
&lt;br /&gt;
The toolchain has been built with  &lt;br /&gt;
&lt;br /&gt;
https://github.com/richfelker/musl-cross-make&lt;br /&gt;
&lt;br /&gt;
GCC version: 11.2.0&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for x86_64====&lt;br /&gt;
The toolchain used during automatic testing and is the same used for the CRUST firmware project: &lt;br /&gt;
&lt;br /&gt;
https://github.com/crust-firmware/crust#building-the-firmware&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===STM32 firmware===&lt;br /&gt;
&lt;br /&gt;
The firmware for the stm32f031 mcu that is responsible for ADC &lt;br /&gt;
conversions and PWM for heaters and fans comes pre-installed in the flash of the MCU. &lt;br /&gt;
It can be recreated on the board using the Klipper build system.&lt;br /&gt;
&lt;br /&gt;
In the olden days, we used to do it manually.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
cp test/configs/stm32f031.config .config&lt;br /&gt;
make menuconfig&lt;br /&gt;
-&amp;gt; Enable extra low-level configuration options&lt;br /&gt;
-&amp;gt; Processor model (STM32F031)&lt;br /&gt;
-&amp;gt; Bootloader offset (No bootloader)&lt;br /&gt;
-&amp;gt; Clock Reference (Internal clock)&lt;br /&gt;
-&amp;gt; (16) Internal clock trim override&lt;br /&gt;
-&amp;gt; Communication interface (Serial (on USART2 PA15/PA14))&lt;br /&gt;
-&amp;gt; Baud rate for serial port: 250000&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the newer days, you can copy the config that is used by Rebuild. Please note that this is for Recore A8, which has the 32 KB flash version of the STM32.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
wget https://raw.githubusercontent.com/intelligent-agent/Rebuild/refs/heads/main/userpatches/overlay/klipper/stm32f031-32KB-serial.config&lt;br /&gt;
cp stm32f031-32KB-serial.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Flashing STM32 firmware====&lt;br /&gt;
To flash the STM32 firmware:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mv /opt/firmware/stm32-32KB.bin /opt/firmware/stm32-32KB_old.bin&lt;br /&gt;
sudo cp out/klipper.bin /opt/firmware/stm32-32KB.bin&lt;br /&gt;
sudo flash-stm32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Klipper===&lt;br /&gt;
Klipper is run as a systemd service. It should not normally need to be restarted from the command line, but during development it can be necessary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The log for Klipper is located in /tmp. It can be viewed as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tail -f /tmk/klippy.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Klipper can also be restarted from the OctoPrint interface. On the &amp;quot;Klipper&amp;quot; tab, press &amp;quot;Firmware&amp;quot; to restart the Klipper firmware. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Klipper-firmware-press.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Toggle===&lt;br /&gt;
Toggle is started automatically by the systemd service toggle.service. A user is created for Toggle on first boot, but the credentials are not set until a user is created in OctoPrint. Once the wizard has been completed, the Toggle user is active, but the credentials will not be valid until OctoPrint is restarted. Therefore, if Toggle is needed, restart OctoPrint after the wizard is complete.&lt;br /&gt;
&lt;br /&gt;
Toggle is running on Weston, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/xdg/weston/weston.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Edit the section about rotation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[output]&lt;br /&gt;
name=HDMI-A-1&lt;br /&gt;
transform=rotate-90&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
After that, Weston can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart weston&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See the Ubuntu documentation for valid rotations: [https://manpages.ubuntu.com/manpages/jammy/man5/weston.ini.5.html weston.ini]&lt;br /&gt;
== Recore booting ==&lt;br /&gt;
There are several stages to booting Recore, and depending on which media is installed, the boot process will &lt;br /&gt;
try and boot either from eMMC, USB host or USB device (FEL).&lt;br /&gt;
&lt;br /&gt;
The board can be booted by either pressing the &amp;quot;BOOT&amp;quot; button for 2 seconds or by applying power to either the 24V connector or the USB C connector. To shut down the board, either use the &amp;quot;shutdown&amp;quot; button from the UI or press the &amp;quot;BOOT&amp;quot; button once. It&#039;s not ideal to shut off the board by removing power directly as this can cause a corrupted file system. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From eMMC&amp;quot;&amp;gt;&lt;br /&gt;
===Booting Recore from eMMC (the normal way)===&lt;br /&gt;
# Turn on power&lt;br /&gt;
# The BROM will load u-boot SPL from eMMC&lt;br /&gt;
# The u-boot SPL will load u-boot&lt;br /&gt;
# u-boot will load Linux&lt;br /&gt;
# Linux will load the rootfs from eMMC.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From USB&amp;quot;&amp;gt;&lt;br /&gt;
===Loading u-boot from eMMC but load kernel and rootfs from USB===&lt;br /&gt;
Starting with Rebuild v1.0.0, u-boot will do a scan for a USB mass storage device and if a working version of Reflash or Rebuild or Refactor is found, it will boot to that image.&lt;br /&gt;
# Download Refactor/Rebuild/Reflash and flash it to a USB drive.&lt;br /&gt;
# Insert the USB drive in the board. &lt;br /&gt;
# Boot the board normally (Use the Boot button/apply power)&lt;br /&gt;
The board should now be have the kernel/rootfs from the USB drive.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From FEL&amp;quot;&amp;gt;&lt;br /&gt;
===Boot Recore from a USB stick using the FEL button===&lt;br /&gt;
If u-boot should be loaded from a host computer and kernel and rootfs is loaded from a USB drive:&lt;br /&gt;
# Flash the [[Reflash]] Linux distro to a USB drive. &lt;br /&gt;
# Insert the USB drive in the Recore board in one of the two host connectors close to the HDMI.&lt;br /&gt;
# Hold down the FEL button while applying power to the board via the USB-C connector.&lt;br /&gt;
# Download the Recore repository https://github.com/intelligent-agent/Recore&lt;br /&gt;
# Install the sunxi-tools program&lt;br /&gt;
# Run the fel command (&#039;&#039;&#039;make fel&#039;&#039;&#039;) from the host computer. All the necessary binarys are in the Recore repository:&lt;br /&gt;
You can read more about the steps needed to boot aboard in FEL mode on the Sunxi wiki: https://linux-sunxi.org/FEL&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Depending on what linux platform you&#039;re running from, sunxi-tools will require the following dependencies to compile properly:&lt;br /&gt;
* libftd-dev&lt;br /&gt;
* libusbx-dev&lt;br /&gt;
* libudev-dev&lt;br /&gt;
(These are Debian/ubuntu names. For Fedora, change -dev to -devel)&lt;br /&gt;
&lt;br /&gt;
This should upload u-boot from the host computer to the board via the USB cable. u-boot will then boot from the connected USB drive. &lt;br /&gt;
Please note that in some instances, the USB drive is not detected as a mass storage device without also having the VIN power connector inserted. See more in [[Recore_A6#USB_connectors_not_discovered_when_powered_by_USB_device|in the &amp;quot;known errors&amp;quot; section of Recore A6]]&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running OctoPrint===&lt;br /&gt;
OctoPrint is stated on boot. If there is a need to restart the daemon, use this command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart octoprint&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues==&lt;br /&gt;
===Having both Ethernet and Wi-Fi creates problems with mDNS===&lt;br /&gt;
When having both ethernet and Wi-Fi connected there can be a problem with hostname resolution. &lt;br /&gt;
The workaround is to either remove Wi-Fi or ethernet.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.1.0&amp;diff=1659</id>
		<title>Rebuild v1.1.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.1.0&amp;diff=1659"/>
		<updated>2026-09-07T20:23:49Z</updated>

		<summary type="html">&lt;p&gt;Elias: Created page with &amp;quot;center Rebuild is a complete Linux image for Recore 3D printer controller boards. Rebuild comes with Klipper installed and the choice of either [https://docs.mainsail.xyz/ MainSail], [https://docs.fluidd.xyz/ Fluidd] or [https://octoprint.org/ OctoPrint]. The name Rebuild is a reflection of the [https://www.armbian.com/ Armbian] build system, but adapted for Recore boards.   ===Rebuild and Refactor=== Rebuild and Refactor are ver...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Rebuild header.png|center]]&lt;br /&gt;
Rebuild is a complete Linux image for [[Recore A8|Recore]] 3D printer controller boards. Rebuild comes with Klipper installed and the choice of either [https://docs.mainsail.xyz/ MainSail], [https://docs.fluidd.xyz/ Fluidd] or [https://octoprint.org/ OctoPrint]. The name Rebuild is a reflection of the [https://www.armbian.com/ Armbian] build system, but adapted for Recore boards. &lt;br /&gt;
&lt;br /&gt;
===Rebuild and Refactor===&lt;br /&gt;
Rebuild and Refactor are very similar from a user standpoint, but the build system is different. Recore A7 and A6 come with some version of Refactor (v3.1.x), while Recore A8 comes with Rebuild (v1.0.x) pre-installed. &lt;br /&gt;
&lt;br /&gt;
Rebuild has now been released as v1.1.0&lt;br /&gt;
&lt;br /&gt;
=Installing Rebuild on Recore=&lt;br /&gt;
Recore has eMMC (embedded MMC), so in order to install sotware on the board, a USB drive must be used. For instructions on making a flasher image, have a look at [[Reflash]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
In order to install Rebuild v1.0.2, you need to use Reflash v1.0.1. There is a blog post explaining this new way to install an image on Recore: https://www.iagent.no/2024/05/08/reflash-a-new-way-to-upgrade-firmware/&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Latest images==&lt;br /&gt;
The latest images for Recore are available from github. You can choose to download an image directly from within Reflash, or you can choose to download first and then upload it. Here are the latest images: https://github.com/intelligent-agent/Rebuild/releases&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
[[File:USB-C.png|thumb]]&lt;br /&gt;
[[File:Ethernet.png|thumb]]&lt;br /&gt;
[[File:Blink.png|thumb]]&lt;br /&gt;
[[File:Http.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
It can be a good idea to test the board on the bench before installing it in the printer. Use the USB-C connector or the 24V power plug to power the board and connect the ethernet cable between the board and your local network. &lt;br /&gt;
&lt;br /&gt;
Once power is applied, you should see a white LED light up in the middle of the board. After a few seconds, there should be activity on the eMMC LED, the CPU LED and on the heartbeat LED. &lt;br /&gt;
&lt;br /&gt;
Once the board is powered up, use a computer to access the web interface provided by OctoPrint/MainSail/Fluidd (the UI). &lt;br /&gt;
In order to get access the UI, a network cable must be connected to the board and to a network switch. It is also possible to use a wifi dongle, be please see &amp;quot;Known issues&amp;quot; at the bottom of the page for issues regarding Hotspot/AP.&lt;br /&gt;
If a network cable is used, the board should respond to the address:&lt;br /&gt;
http://recore.local&lt;br /&gt;
If using a wifi dongle, the default wifi network password is 12345678.&lt;br /&gt;
&lt;br /&gt;
For OctoPrint, once the interface is visible, run through the wizard to set up a new printer. &lt;br /&gt;
After the wizard is done, go to the Klipper tab in OctoPrint and edit the Klipper config file. &lt;br /&gt;
This is where the bulk of the work will happen. &lt;br /&gt;
&lt;br /&gt;
On the MainSail or Fluidd image, there should not need to be any configuration necessary. Verify that the web interface comes up and that Klipper is running as expected.&lt;br /&gt;
&lt;br /&gt;
== Klipper configuration ==&lt;br /&gt;
There is a standard klipper configuration file that comes with Refactor/Rebuild. The configuration file is set up &lt;br /&gt;
to work out of the box without anything connected on the pins of the board. The default Klipper config can be used as a starting point for building a custom config file for the printer at hand. &lt;br /&gt;
&lt;br /&gt;
After the Klipper configuration is complete, do a test print to make sure everything is working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Important&#039;&#039;&#039;====&lt;br /&gt;
If you get in a situation where Klipper is unable to start normally, replace the content of the &amp;quot;printer.cfg&amp;quot; file with the default config file that came with Rebuild. The default config file should be available in the &amp;quot;config examples&amp;quot; folder in Fluidd and Mainsail. You might need to do a full reboot of the board after going back to that default config. This is a good way to get back to a known working image. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Config-examples.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wifi on Recore==&lt;br /&gt;
Recore does not have wifi built in, but wifi can be added by using a USB dongle. There is a great dual band wifi dongle that has been tested with Recore and Rebuild and should work out of the box [[Rexfer_A0]]. Wifi can be set up to be either an access point (Hotspot) or to connect to an existing access point (wifi router). If nothing is set, the default will be to create a wifi hotspot called &amp;quot;Recore&amp;quot; with password 12345678.&lt;br /&gt;
&lt;br /&gt;
=== Wifi access point===&lt;br /&gt;
The first time Rebuild boots up, it will set up the wifi as an Access Point (AP). This is done by automatically changing the configuration of NetworkManager. The Wifi AP is called &#039;&#039;&#039;Recore&#039;&#039;&#039; and the password is &#039;&#039;&#039;12345678&#039;&#039;&#039;. This is meant as a temporary setup, so the password should be changed as soon as access is available. The default IP address for the AP is &#039;&#039;&#039;192.168.50.1&#039;&#039;&#039;. Once you have connected to the AP, either with a computer or a phone, it should be possible to gain ssh access. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh debian@192.168.50.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connecting to an external Wifi access point ===&lt;br /&gt;
If you have a Wifi dongle connected, you can connect to a local Wifi access point by using the &#039;&#039;&#039;nmtui&#039;&#039;&#039;  program. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Using nmtui&#039;&#039;&#039;====&lt;br /&gt;
nmtui is a Text UI tool to assist in managing network settings.&lt;br /&gt;
nmtui is mainly navigated using the arrow, space, enter, tab &amp;amp; escape keys.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
# Use SSH or the serial port to log in to the device.&lt;br /&gt;
# Start &#039;&#039;&#039;nmtui&#039;&#039;&#039;&lt;br /&gt;
# Select Activate connection&lt;br /&gt;
# Select wifi network and enter credentials&lt;br /&gt;
# Exit nmtui and verify connection to the wifi network with &#039;&#039;&#039;ip addr&#039;&#039;&#039; (If you connect via wifi hotspot, you will be disconnected)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Nmtui.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SSH access==&lt;br /&gt;
Most of the configuration for Klipper can be handled via the UI, but sometimes it is necessary to have SSH access to the board. By default, the SSH access is disabled, but it can be enabled in three ways.&lt;br /&gt;
# You can choose &amp;quot;enable SSH on new image&amp;quot; in the Reflash user interface&lt;br /&gt;
# You can start the SSH service from Mainsail/Fluidd&lt;br /&gt;
# You can start the ssh service from the serial port. The ssh service will then be persistent on next boot. &amp;lt;pre&amp;gt;systemctl start ssh&amp;lt;/pre&amp;gt;. &lt;br /&gt;
SSH access is only enabled for user &#039;&#039;&#039;debian&#039;&#039;&#039; using the password &#039;&#039;&#039;temppwd&#039;&#039;&#039;.&lt;br /&gt;
The first time you log in, you will be prompted to change the password. After the password has been changed, you will need to log in again. If you do not log in within an hour of enabling SSH, &#039;&#039;&#039;the SSH access will be disabled&#039;&#039;&#039;. This is for security reasons, it&#039;s not good to have an open SSH port with the default password. If the SSH access is disabled, it can be enabled again from the user interface.&lt;br /&gt;
&lt;br /&gt;
==Serial port acccess==&lt;br /&gt;
The USB-C port can be used to get a serial port interface to the board. Once the board is connected and booted, you should be able to see the board show up as a USB device. The serial interface can be used with Minicom on Linux, and PuTTY on Windows. &lt;br /&gt;
&lt;br /&gt;
===Upgrading Debian via apt upgrade===&lt;br /&gt;
The /boot partition of Rebuild is mounted &amp;quot;read only&amp;quot;, so it will have to be remounted as Read Write before running an upgrade. This is handled automatically by apt in this version: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable host mode on the USB-C connector ===&lt;br /&gt;
On Recore A7, the host mode for the USB C connector is activated using a device tree overlay. On A8, this is handled automatically.&lt;br /&gt;
To enable the host mode on Recore A7 write the following on the command line. First SSH into the board. Recore A6 and A5 can not operate in host mode with +5V output. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mount -o remount,rw /boot&lt;br /&gt;
sudo armbian-add-overlay /boot/overlay-user/sun50i-a64-usb-host.dts&lt;br /&gt;
sudo mount -o remount,ro /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using Moonraker and Mainsail==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Mainsail.png]]&lt;br /&gt;
&lt;br /&gt;
==Using KlipperScreen==&lt;br /&gt;
KlipperScreen is running on X, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /usr/share/X11/xorg.conf.d/90-monitor.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
    Identifier &amp;quot;HDMI-1&amp;quot;&lt;br /&gt;
    Option &amp;quot;Rotate&amp;quot; &amp;quot;left&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
After that, KlipperScreen can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart KlipperScreen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it is necessary to rotate the touch panel as well, here is a useful section that can be added to the bottom of that same file. Uncomment the rotation that matches your setup.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;InputClass&amp;quot;&lt;br /&gt;
            Identifier &amp;quot;Coordinate Transformation Matrix&amp;quot;&lt;br /&gt;
            MatchIsTouchscreen &amp;quot;on&amp;quot;&lt;br /&gt;
            MatchDevicePath &amp;quot;/dev/input/event*&amp;quot;&lt;br /&gt;
            MatchDriver &amp;quot;libinput&amp;quot;&lt;br /&gt;
            Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;1 0 0 0 1 0 0 0 1&amp;quot;    # 0 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 1 0 -1 0 1 0 0 1&amp;quot;  # 90 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;-1 0 1 0 -1 1 0 0 1&amp;quot; # 180 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 -1 1 1 0 0 0 0 1&amp;quot;  # 270 degrees&lt;br /&gt;
&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Recompiling and installing binaries==&lt;br /&gt;
===Update u-boot on Recore===&lt;br /&gt;
This is not something the regular user would need to do, but documented here for convenience. &lt;br /&gt;
Place u-boot-sunxi-with-spl.bin in sector 15 (8KB offset)  &lt;br /&gt;
Flash the binary &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk2 bs=1024 seek=8 conv=notrunc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AR100 firmware===&lt;br /&gt;
The AR100 CPU needs a binary file that is loaded on startup by the systemd file klipper.service&lt;br /&gt;
The AR100 binary file comes pre-compiled in Refactor, so most users should not have to re-compile it. &lt;br /&gt;
For experiments the AR100 binary can be recompiled on Recore (architecture aarch64) or on a host computer (amd64 or similar).  &lt;br /&gt;
&lt;br /&gt;
====Compiling the ar100 binary====&lt;br /&gt;
To configure klipper for AR100 and build the binary:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper/&lt;br /&gt;
cp test/configs/ar100.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will produce a bin file located in out/ar100.bin, so it should be moved to /opt/firmware&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mv out/ar100.bin /opt/firmware/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Once the AR100 binary has been updated, klipper.service can be restarted which then loads the new AR100 binary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for ARM64====&lt;br /&gt;
The AR100 needs a cross compilation toolchain. For ARM64, it can be downloaded from feeds.iagent.no:&lt;br /&gt;
&lt;br /&gt;
http://feeds.iagent.no/toolchains/  &lt;br /&gt;
&lt;br /&gt;
The toolchain has been built with  &lt;br /&gt;
&lt;br /&gt;
https://github.com/richfelker/musl-cross-make&lt;br /&gt;
&lt;br /&gt;
GCC version: 11.2.0&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for x86_64====&lt;br /&gt;
The toolchain used during automatic testing and is the same used for the CRUST firmware project: &lt;br /&gt;
&lt;br /&gt;
https://github.com/crust-firmware/crust#building-the-firmware&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===STM32 firmware===&lt;br /&gt;
&lt;br /&gt;
The firmware for the stm32f031 mcu that is responsible for ADC &lt;br /&gt;
conversions and PWM for heaters and fans comes pre-installed in the flash of the MCU. &lt;br /&gt;
It can be recreated on the board using the Klipper build system.&lt;br /&gt;
&lt;br /&gt;
In the olden days, we used to do it manually.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
cp test/configs/stm32f031.config .config&lt;br /&gt;
make menuconfig&lt;br /&gt;
-&amp;gt; Enable extra low-level configuration options&lt;br /&gt;
-&amp;gt; Processor model (STM32F031)&lt;br /&gt;
-&amp;gt; Bootloader offset (No bootloader)&lt;br /&gt;
-&amp;gt; Clock Reference (Internal clock)&lt;br /&gt;
-&amp;gt; (16) Internal clock trim override&lt;br /&gt;
-&amp;gt; Communication interface (Serial (on USART2 PA15/PA14))&lt;br /&gt;
-&amp;gt; Baud rate for serial port: 250000&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the newer days, you can copy the config that is used by Rebuild. Please note that this is for Recore A8, which has the 32 KB flash version of the STM32.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
wget https://raw.githubusercontent.com/intelligent-agent/Rebuild/refs/heads/main/userpatches/overlay/klipper/stm32f031-32KB-serial.config&lt;br /&gt;
cp stm32f031-32KB-serial.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Flashing STM32 firmware====&lt;br /&gt;
To flash the STM32 firmware:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mv /opt/firmware/stm32-32KB.bin /opt/firmware/stm32-32KB_old.bin&lt;br /&gt;
sudo cp out/klipper.bin /opt/firmware/stm32-32KB.bin&lt;br /&gt;
sudo flash-stm32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Klipper===&lt;br /&gt;
Klipper is run as a systemd service. It should not normally need to be restarted from the command line, but during development it can be necessary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The log for Klipper is located in /tmp. It can be viewed as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tail -f /tmk/klippy.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Klipper can also be restarted from the OctoPrint interface. On the &amp;quot;Klipper&amp;quot; tab, press &amp;quot;Firmware&amp;quot; to restart the Klipper firmware. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Klipper-firmware-press.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Toggle===&lt;br /&gt;
Toggle is started automatically by the systemd service toggle.service. A user is created for Toggle on first boot, but the credentials are not set until a user is created in OctoPrint. Once the wizard has been completed, the Toggle user is active, but the credentials will not be valid until OctoPrint is restarted. Therefore, if Toggle is needed, restart OctoPrint after the wizard is complete.&lt;br /&gt;
&lt;br /&gt;
Toggle is running on Weston, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/xdg/weston/weston.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Edit the section about rotation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[output]&lt;br /&gt;
name=HDMI-A-1&lt;br /&gt;
transform=rotate-90&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
After that, Weston can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart weston&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See the Ubuntu documentation for valid rotations: [https://manpages.ubuntu.com/manpages/jammy/man5/weston.ini.5.html weston.ini]&lt;br /&gt;
== Recore booting ==&lt;br /&gt;
There are several stages to booting Recore, and depending on which media is installed, the boot process will &lt;br /&gt;
try and boot either from eMMC, USB host or USB device (FEL).&lt;br /&gt;
&lt;br /&gt;
The board can be booted by either pressing the &amp;quot;BOOT&amp;quot; button for 2 seconds or by applying power to either the 24V connector or the USB C connector. To shut down the board, either use the &amp;quot;shutdown&amp;quot; button from the UI or press the &amp;quot;BOOT&amp;quot; button once. It&#039;s not ideal to shut off the board by removing power directly as this can cause a corrupted file system. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From eMMC&amp;quot;&amp;gt;&lt;br /&gt;
===Booting Recore from eMMC (the normal way)===&lt;br /&gt;
# Turn on power&lt;br /&gt;
# The BROM will load u-boot SPL from eMMC&lt;br /&gt;
# The u-boot SPL will load u-boot&lt;br /&gt;
# u-boot will load Linux&lt;br /&gt;
# Linux will load the rootfs from eMMC.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From USB&amp;quot;&amp;gt;&lt;br /&gt;
===Loading u-boot from eMMC but load kernel and rootfs from USB===&lt;br /&gt;
Starting with Rebuild v1.0.0, u-boot will do a scan for a USB mass storage device and if a working version of Reflash or Rebuild or Refactor is found, it will boot to that image.&lt;br /&gt;
# Download Refactor/Rebuild/Reflash and flash it to a USB drive.&lt;br /&gt;
# Insert the USB drive in the board. &lt;br /&gt;
# Boot the board normally (Use the Boot button/apply power)&lt;br /&gt;
The board should now be have the kernel/rootfs from the USB drive.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From FEL&amp;quot;&amp;gt;&lt;br /&gt;
===Boot Recore from a USB stick using the FEL button===&lt;br /&gt;
If u-boot should be loaded from a host computer and kernel and rootfs is loaded from a USB drive:&lt;br /&gt;
# Flash the [[Reflash]] Linux distro to a USB drive. &lt;br /&gt;
# Insert the USB drive in the Recore board in one of the two host connectors close to the HDMI.&lt;br /&gt;
# Hold down the FEL button while applying power to the board via the USB-C connector.&lt;br /&gt;
# Download the Recore repository https://github.com/intelligent-agent/Recore&lt;br /&gt;
# Install the sunxi-tools program&lt;br /&gt;
# Run the fel command (&#039;&#039;&#039;make fel&#039;&#039;&#039;) from the host computer. All the necessary binarys are in the Recore repository:&lt;br /&gt;
You can read more about the steps needed to boot aboard in FEL mode on the Sunxi wiki: https://linux-sunxi.org/FEL&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Depending on what linux platform you&#039;re running from, sunxi-tools will require the following dependencies to compile properly:&lt;br /&gt;
* libftd-dev&lt;br /&gt;
* libusbx-dev&lt;br /&gt;
* libudev-dev&lt;br /&gt;
(These are Debian/ubuntu names. For Fedora, change -dev to -devel)&lt;br /&gt;
&lt;br /&gt;
This should upload u-boot from the host computer to the board via the USB cable. u-boot will then boot from the connected USB drive. &lt;br /&gt;
Please note that in some instances, the USB drive is not detected as a mass storage device without also having the VIN power connector inserted. See more in [[Recore_A6#USB_connectors_not_discovered_when_powered_by_USB_device|in the &amp;quot;known errors&amp;quot; section of Recore A6]]&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running OctoPrint===&lt;br /&gt;
OctoPrint is stated on boot. If there is a need to restart the daemon, use this command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart octoprint&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues==&lt;br /&gt;
===Having both Ethernet and Wi-Fi creates problems with mDNS===&lt;br /&gt;
When having both ethernet and Wi-Fi connected there can be a problem with hostname resolution. &lt;br /&gt;
The workaround is to either remove Wi-Fi or ethernet.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.0.2&amp;diff=1658</id>
		<title>Rebuild v1.0.2</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Rebuild_v1.0.2&amp;diff=1658"/>
		<updated>2026-09-05T09:14:10Z</updated>

		<summary type="html">&lt;p&gt;Elias: /* Wifi on Recore */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Rebuild header.png|center]]&lt;br /&gt;
Rebuild is a complete Linux image for [[Recore A8|Recore]] 3D printer controller boards. Rebuild comes with Klipper installed and the choice of either [https://docs.mainsail.xyz/ MainSail], [https://docs.fluidd.xyz/ Fluidd] or [https://octoprint.org/ OctoPrint]. The name Rebuild is a reflection of the [https://www.armbian.com/ Armbian] build system, but adapted for Recore boards. &lt;br /&gt;
&lt;br /&gt;
===Rebuild and Refactor===&lt;br /&gt;
Rebuild and Refactor are very similar from a user standpoint, but the build system is different. Recore A7 and A6 come with some version of Refactor (v3.1.x), while Recore A8 comes with Rebuild (v1.0.x) pre-installed. &lt;br /&gt;
&lt;br /&gt;
Rebuild has now been released as v1.0.2&lt;br /&gt;
&lt;br /&gt;
=Installing Rebuild on Recore=&lt;br /&gt;
Recore has eMMC (embedded MMC), so in order to install sotware on the board, a USB drive must be used. For instructions on making a flasher image, have a look at [[Reflash]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
In order to install Rebuild v1.0.2, you need to use Reflash v1.0.1. There is a blog post explaining this new way to install an image on Recore: https://www.iagent.no/2024/05/08/reflash-a-new-way-to-upgrade-firmware/&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Latest images==&lt;br /&gt;
The latest images for Recore are available from github. You can choose to download an image directly from within Reflash, or you can choose to download first and then upload it. Here are the latest images: https://github.com/intelligent-agent/Rebuild/releases&lt;br /&gt;
&lt;br /&gt;
=Getting started=&lt;br /&gt;
[[File:USB-C.png|thumb]]&lt;br /&gt;
[[File:Ethernet.png|thumb]]&lt;br /&gt;
[[File:Blink.png|thumb]]&lt;br /&gt;
[[File:Http.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
It can be a good idea to test the board on the bench before installing it in the printer. Use the USB-C connector or the 24V power plug to power the board and connect the ethernet cable between the board and your local network. &lt;br /&gt;
&lt;br /&gt;
Once power is applied, you should see a white LED light up in the middle of the board. After a few seconds, there should be activity on the eMMC LED, the CPU LED and on the heartbeat LED. &lt;br /&gt;
&lt;br /&gt;
Once the board is powered up, use a computer to access the web interface provided by OctoPrint/MainSail/Fluidd (the UI). &lt;br /&gt;
In order to get access the UI, a network cable must be connected to the board and to a network switch. It is also possible to use a wifi dongle, be please see &amp;quot;Known issues&amp;quot; at the bottom of the page for issues regarding Hotspot/AP.&lt;br /&gt;
If a network cable is used, the board should respond to the address:&lt;br /&gt;
http://recore.local&lt;br /&gt;
If using a wifi dongle, the default wifi network password is 12345678.&lt;br /&gt;
&lt;br /&gt;
For OctoPrint, once the interface is visible, run through the wizard to set up a new printer. &lt;br /&gt;
After the wizard is done, go to the Klipper tab in OctoPrint and edit the Klipper config file. &lt;br /&gt;
This is where the bulk of the work will happen. &lt;br /&gt;
&lt;br /&gt;
On the MainSail or Fluidd image, there should not need to be any configuration necessary. Verify that the web interface comes up and that Klipper is running as expected.&lt;br /&gt;
&lt;br /&gt;
== Klipper configuration ==&lt;br /&gt;
There is a standard klipper configuration file that comes with Refactor/Rebuild. The configuration file is set up &lt;br /&gt;
to work out of the box without anything connected on the pins of the board. The default Klipper config can be used as a starting point for building a custom config file for the printer at hand. &lt;br /&gt;
&lt;br /&gt;
After the Klipper configuration is complete, do a test print to make sure everything is working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Important&#039;&#039;&#039;====&lt;br /&gt;
If you get in a situation where Klipper is unable to start normally, replace the content of the &amp;quot;printer.cfg&amp;quot; file with the default config file that came with Rebuild. The default config file should be available in the &amp;quot;config examples&amp;quot; folder in Fluidd and Mainsail. You might need to do a full reboot of the board after going back to that default config. This is a good way to get back to a known working image. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Config-examples.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wifi on Recore==&lt;br /&gt;
Recore does not have wifi built in, but wifi can be added by using a USB dongle. There is a great dual band wifi dongle that has been tested with Recore and Rebuild and should work out of the box [[Rexfer_A0]]. Wifi can be set up to be either an access point (Hotspot) or to connect to an existing access point (wifi router). If nothing is set, the default will be to create a wifi hotspot called &amp;quot;Recore&amp;quot; with password 12345678.&lt;br /&gt;
&lt;br /&gt;
=== Wifi access point===&lt;br /&gt;
The first time Rebuild boots up, it will set up the wifi as an Access Point (AP). This is done by automatically changing the configuration of NetworkManager. The Wifi AP is called &#039;&#039;&#039;Recore&#039;&#039;&#039; and the password is &#039;&#039;&#039;12345678&#039;&#039;&#039;. This is meant as a temporary setup, so the password should be changed as soon as access is available. The default IP address for the AP is &#039;&#039;&#039;192.168.50.1&#039;&#039;&#039;. Once you have connected to the AP, either with a computer or a phone, it should be possible to gain ssh access. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh debian@192.168.50.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connecting to an external Wifi access point ===&lt;br /&gt;
If you have a Wifi dongle connected, you can connect to a local Wifi access point by using the &#039;&#039;&#039;nmtui&#039;&#039;&#039;  program. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-success&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Using nmtui&#039;&#039;&#039;====&lt;br /&gt;
nmtui is a Text UI tool to assist in managing network settings.&lt;br /&gt;
nmtui is mainly navigated using the arrow, space, enter, tab &amp;amp; escape keys.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
# Use SSH or the serial port to log in to the device.&lt;br /&gt;
# Start &#039;&#039;&#039;nmtui&#039;&#039;&#039;&lt;br /&gt;
# Select Activate connection&lt;br /&gt;
# Select wifi network and enter credentials&lt;br /&gt;
# Exit nmtui and verify connection to the wifi network with &#039;&#039;&#039;ip addr&#039;&#039;&#039; (If you connect via wifi hotspot, you will be disconnected)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Nmtui.gif]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SSH access==&lt;br /&gt;
Most of the configuration for Klipper can be handled via the UI, but sometimes it is necessary to have SSH access to the board. By default, the SSH access is disabled, but it can be enabled in three ways.&lt;br /&gt;
# You can choose &amp;quot;enable SSH on new image&amp;quot; in the Reflash user interface&lt;br /&gt;
# You can start the SSH service from Mainsail/Fluidd&lt;br /&gt;
# You can start the ssh service from the serial port. The ssh service will then be persistent on next boot. &amp;lt;pre&amp;gt;systemctl start ssh&amp;lt;/pre&amp;gt;. &lt;br /&gt;
SSH access is only enabled for user &#039;&#039;&#039;debian&#039;&#039;&#039; using the password &#039;&#039;&#039;temppwd&#039;&#039;&#039;.&lt;br /&gt;
The first time you log in, you will be prompted to change the password. After the password has been changed, you will need to log in again. If you do not log in within an hour of enabling SSH, &#039;&#039;&#039;the SSH access will be disabled&#039;&#039;&#039;. This is for security reasons, it&#039;s not good to have an open SSH port with the default password. If the SSH access is disabled, it can be enabled again from the user interface.&lt;br /&gt;
&lt;br /&gt;
==Serial port acccess==&lt;br /&gt;
The USB-C port can be used to get a serial port interface to the board. Once the board is connected and booted, you should be able to see the board show up as a USB device. The serial interface can be used with Minicom on Linux, and PuTTY on Windows. &lt;br /&gt;
&lt;br /&gt;
===Upgrading Debian via apt upgrade===&lt;br /&gt;
The /boot partition of Rebuild is mounted &amp;quot;read only&amp;quot;, so it will have to be remounted as Read Write before running an upgrade. This is handled automatically by apt in this version: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable host mode on the USB-C connector ===&lt;br /&gt;
On Recore A7, the host mode for the USB C connector is activated using a device tree overlay. On A8, this is handled automatically.&lt;br /&gt;
To enable the host mode on Recore A7 write the following on the command line. First SSH into the board. Recore A6 and A5 can not operate in host mode with +5V output. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mount -o remount,rw /boot&lt;br /&gt;
sudo armbian-add-overlay /boot/overlay-user/sun50i-a64-usb-host.dts&lt;br /&gt;
sudo mount -o remount,ro /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using Moonraker and Mainsail==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Mainsail.png]]&lt;br /&gt;
&lt;br /&gt;
==Using KlipperScreen==&lt;br /&gt;
KlipperScreen is running on X, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /usr/share/X11/xorg.conf.d/90-monitor.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
    Identifier &amp;quot;HDMI-1&amp;quot;&lt;br /&gt;
    Option &amp;quot;Rotate&amp;quot; &amp;quot;left&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
After that, KlipperScreen can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart KlipperScreen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it is necessary to rotate the touch panel as well, here is a useful section that can be added to the bottom of that same file. Uncomment the rotation that matches your setup.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Section &amp;quot;InputClass&amp;quot;&lt;br /&gt;
            Identifier &amp;quot;Coordinate Transformation Matrix&amp;quot;&lt;br /&gt;
            MatchIsTouchscreen &amp;quot;on&amp;quot;&lt;br /&gt;
            MatchDevicePath &amp;quot;/dev/input/event*&amp;quot;&lt;br /&gt;
            MatchDriver &amp;quot;libinput&amp;quot;&lt;br /&gt;
            Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;1 0 0 0 1 0 0 0 1&amp;quot;    # 0 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 1 0 -1 0 1 0 0 1&amp;quot;  # 90 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;-1 0 1 0 -1 1 0 0 1&amp;quot; # 180 degrees&lt;br /&gt;
            #Option &amp;quot;CalibrationMatrix&amp;quot; &amp;quot;0 -1 1 1 0 0 0 0 1&amp;quot;  # 270 degrees&lt;br /&gt;
&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Recompiling and installing binaries==&lt;br /&gt;
===Update u-boot on Recore===&lt;br /&gt;
This is not something the regular user would need to do, but documented here for convenience. &lt;br /&gt;
Place u-boot-sunxi-with-spl.bin in sector 15 (8KB offset)  &lt;br /&gt;
Flash the binary &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk2 bs=1024 seek=8 conv=notrunc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AR100 firmware===&lt;br /&gt;
The AR100 CPU needs a binary file that is loaded on startup by the systemd file klipper.service&lt;br /&gt;
The AR100 binary file comes pre-compiled in Refactor, so most users should not have to re-compile it. &lt;br /&gt;
For experiments the AR100 binary can be recompiled on Recore (architecture aarch64) or on a host computer (amd64 or similar).  &lt;br /&gt;
&lt;br /&gt;
====Compiling the ar100 binary====&lt;br /&gt;
To configure klipper for AR100 and build the binary:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper/&lt;br /&gt;
cp test/configs/ar100.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will produce a bin file located in out/ar100.bin, so it should be moved to /opt/firmware&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mv out/ar100.bin /opt/firmware/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Once the AR100 binary has been updated, klipper.service can be restarted which then loads the new AR100 binary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for ARM64====&lt;br /&gt;
The AR100 needs a cross compilation toolchain. For ARM64, it can be downloaded from feeds.iagent.no:&lt;br /&gt;
&lt;br /&gt;
http://feeds.iagent.no/toolchains/  &lt;br /&gt;
&lt;br /&gt;
The toolchain has been built with  &lt;br /&gt;
&lt;br /&gt;
https://github.com/richfelker/musl-cross-make&lt;br /&gt;
&lt;br /&gt;
GCC version: 11.2.0&lt;br /&gt;
&lt;br /&gt;
====Cross compilation toolchain for x86_64====&lt;br /&gt;
The toolchain used during automatic testing and is the same used for the CRUST firmware project: &lt;br /&gt;
&lt;br /&gt;
https://github.com/crust-firmware/crust#building-the-firmware&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===STM32 firmware===&lt;br /&gt;
&lt;br /&gt;
The firmware for the stm32f031 mcu that is responsible for ADC &lt;br /&gt;
conversions and PWM for heaters and fans comes pre-installed in the flash of the MCU. &lt;br /&gt;
It can be recreated on the board using the Klipper build system.&lt;br /&gt;
&lt;br /&gt;
In the olden days, we used to do it manually.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
cp test/configs/stm32f031.config .config&lt;br /&gt;
make menuconfig&lt;br /&gt;
-&amp;gt; Enable extra low-level configuration options&lt;br /&gt;
-&amp;gt; Processor model (STM32F031)&lt;br /&gt;
-&amp;gt; Bootloader offset (No bootloader)&lt;br /&gt;
-&amp;gt; Clock Reference (Internal clock)&lt;br /&gt;
-&amp;gt; (16) Internal clock trim override&lt;br /&gt;
-&amp;gt; Communication interface (Serial (on USART2 PA15/PA14))&lt;br /&gt;
-&amp;gt; Baud rate for serial port: 250000&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the newer days, you can copy the config that is used by Rebuild. Please note that this is for Recore A8, which has the 32 KB flash version of the STM32.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
wget https://raw.githubusercontent.com/intelligent-agent/Rebuild/refs/heads/main/userpatches/overlay/klipper/stm32f031-32KB-serial.config&lt;br /&gt;
cp stm32f031-32KB-serial.config .config&lt;br /&gt;
make olddefconfig&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Flashing STM32 firmware====&lt;br /&gt;
To flash the STM32 firmware:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mv /opt/firmware/stm32-32KB.bin /opt/firmware/stm32-32KB_old.bin&lt;br /&gt;
sudo cp out/klipper.bin /opt/firmware/stm32-32KB.bin&lt;br /&gt;
sudo flash-stm32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Klipper===&lt;br /&gt;
Klipper is run as a systemd service. It should not normally need to be restarted from the command line, but during development it can be necessary. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart klipper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The log for Klipper is located in /tmp. It can be viewed as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tail -f /tmk/klippy.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Klipper can also be restarted from the OctoPrint interface. On the &amp;quot;Klipper&amp;quot; tab, press &amp;quot;Firmware&amp;quot; to restart the Klipper firmware. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Klipper-firmware-press.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running Toggle===&lt;br /&gt;
Toggle is started automatically by the systemd service toggle.service. A user is created for Toggle on first boot, but the credentials are not set until a user is created in OctoPrint. Once the wizard has been completed, the Toggle user is active, but the credentials will not be valid until OctoPrint is restarted. Therefore, if Toggle is needed, restart OctoPrint after the wizard is complete.&lt;br /&gt;
&lt;br /&gt;
Toggle is running on Weston, so a new config should allow rotating the screen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/xdg/weston/weston.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Edit the section about rotation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[output]&lt;br /&gt;
name=HDMI-A-1&lt;br /&gt;
transform=rotate-90&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
After that, Weston can be restarted. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart weston&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See the Ubuntu documentation for valid rotations: [https://manpages.ubuntu.com/manpages/jammy/man5/weston.ini.5.html weston.ini]&lt;br /&gt;
== Recore booting ==&lt;br /&gt;
There are several stages to booting Recore, and depending on which media is installed, the boot process will &lt;br /&gt;
try and boot either from eMMC, USB host or USB device (FEL).&lt;br /&gt;
&lt;br /&gt;
The board can be booted by either pressing the &amp;quot;BOOT&amp;quot; button for 2 seconds or by applying power to either the 24V connector or the USB C connector. To shut down the board, either use the &amp;quot;shutdown&amp;quot; button from the UI or press the &amp;quot;BOOT&amp;quot; button once. It&#039;s not ideal to shut off the board by removing power directly as this can cause a corrupted file system. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From eMMC&amp;quot;&amp;gt;&lt;br /&gt;
===Booting Recore from eMMC (the normal way)===&lt;br /&gt;
# Turn on power&lt;br /&gt;
# The BROM will load u-boot SPL from eMMC&lt;br /&gt;
# The u-boot SPL will load u-boot&lt;br /&gt;
# u-boot will load Linux&lt;br /&gt;
# Linux will load the rootfs from eMMC.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From USB&amp;quot;&amp;gt;&lt;br /&gt;
===Loading u-boot from eMMC but load kernel and rootfs from USB===&lt;br /&gt;
Starting with Rebuild v1.0.0, u-boot will do a scan for a USB mass storage device and if a working version of Reflash or Rebuild or Refactor is found, it will boot to that image.&lt;br /&gt;
# Download Refactor/Rebuild/Reflash and flash it to a USB drive.&lt;br /&gt;
# Insert the USB drive in the board. &lt;br /&gt;
# Boot the board normally (Use the Boot button/apply power)&lt;br /&gt;
The board should now be have the kernel/rootfs from the USB drive.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;From FEL&amp;quot;&amp;gt;&lt;br /&gt;
===Boot Recore from a USB stick using the FEL button===&lt;br /&gt;
If u-boot should be loaded from a host computer and kernel and rootfs is loaded from a USB drive:&lt;br /&gt;
# Flash the [[Reflash]] Linux distro to a USB drive. &lt;br /&gt;
# Insert the USB drive in the Recore board in one of the two host connectors close to the HDMI.&lt;br /&gt;
# Hold down the FEL button while applying power to the board via the USB-C connector.&lt;br /&gt;
# Download the Recore repository https://github.com/intelligent-agent/Recore&lt;br /&gt;
# Install the sunxi-tools program&lt;br /&gt;
# Run the fel command (&#039;&#039;&#039;make fel&#039;&#039;&#039;) from the host computer. All the necessary binarys are in the Recore repository:&lt;br /&gt;
You can read more about the steps needed to boot aboard in FEL mode on the Sunxi wiki: https://linux-sunxi.org/FEL&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Depending on what linux platform you&#039;re running from, sunxi-tools will require the following dependencies to compile properly:&lt;br /&gt;
* libftd-dev&lt;br /&gt;
* libusbx-dev&lt;br /&gt;
* libudev-dev&lt;br /&gt;
(These are Debian/ubuntu names. For Fedora, change -dev to -devel)&lt;br /&gt;
&lt;br /&gt;
This should upload u-boot from the host computer to the board via the USB cable. u-boot will then boot from the connected USB drive. &lt;br /&gt;
Please note that in some instances, the USB drive is not detected as a mass storage device without also having the VIN power connector inserted. See more in [[Recore_A6#USB_connectors_not_discovered_when_powered_by_USB_device|in the &amp;quot;known errors&amp;quot; section of Recore A6]]&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running OctoPrint===&lt;br /&gt;
OctoPrint is stated on boot. If there is a need to restart the daemon, use this command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart octoprint&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Known issues==&lt;br /&gt;
===Having both Ethernet and Wi-Fi creates problems with mDNS===&lt;br /&gt;
When having both ethernet and Wi-Fi connected there can be a problem with hostname resolution. &lt;br /&gt;
The workaround is to either remove Wi-Fi or ethernet.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Webcams&amp;diff=1657</id>
		<title>Webcams</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Webcams&amp;diff=1657"/>
		<updated>2026-08-23T17:30:07Z</updated>

		<summary type="html">&lt;p&gt;Elias: Correct board to A7 and add build number; add section on one camera (shipped ustreamer) vs several (crowsnest)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recore can run one or more USB webcams for monitoring prints. This page covers how to choose a camera, how many will work at once, and how to diagnose the common failures.&lt;br /&gt;
&lt;br /&gt;
All figures on this page were measured on a &#039;&#039;&#039;Recore A7&#039;&#039;&#039; running &#039;&#039;&#039;&amp;lt;code&amp;gt;rebuild-fluidd-1adfb1e&amp;lt;/code&amp;gt;&#039;&#039;&#039; (kernel 6.18.33) in August 2026, with three USB cameras attached.&lt;br /&gt;
&lt;br /&gt;
== The short version ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Buy a camera that supports MJPEG in hardware.&#039;&#039;&#039; This matters more than resolution, brand or price. A camera without it can cost 20x the USB bandwidth and forces the CPU to compress every frame.&lt;br /&gt;
* &#039;&#039;&#039;Roughly three cameras at 640x480, or two at 1280x720.&#039;&#039;&#039; The limit is USB bandwidth, not the processor.&lt;br /&gt;
* If a camera will not start, check &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt; for &amp;lt;code&amp;gt;Failed to submit URB 0 (-28)&amp;lt;/code&amp;gt; before suspecting anything else.&lt;br /&gt;
&lt;br /&gt;
== One camera, or several ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;One camera works out of the box.&#039;&#039;&#039; Rebuild ships [https://github.com/pikvm/ustreamer ustreamer] and a udev rule that creates &amp;lt;code&amp;gt;/dev/webcam&amp;lt;/code&amp;gt; for the first USB camera it finds. Plug a camera in and it is served on port 8080 as &amp;lt;code&amp;gt;/webcam/&amp;lt;/code&amp;gt;, with nothing to configure. This is handled by &amp;lt;code&amp;gt;ustreamer.service&amp;lt;/code&amp;gt;, which starts automatically when a camera appears.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Several cameras need [https://docs.mainsail.xyz/crowsnest/ crowsnest], which is not included in the image.&#039;&#039;&#039; The shipped ustreamer service is hard-wired to one device and one port:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/home/printer/ustreamer/ustreamer --device /dev/webcam --host=0.0.0.0 --port=8080 -m MJPEG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crowsnest is a supervisor that launches one streamer process per camera, each on its own port, from a single configuration file. Moonraker already permits controlling it - it is listed in &amp;lt;code&amp;gt;moonraker.asvc&amp;lt;/code&amp;gt; - so it can be installed without further changes to the image.&lt;br /&gt;
&lt;br /&gt;
When installing crowsnest, &#039;&#039;&#039;disable the shipped ustreamer service first&#039;&#039;&#039;. Otherwise the two compete for the same camera and for port 8080:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl disable --now ustreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! One camera !! Several cameras&lt;br /&gt;
|-&lt;br /&gt;
| Software || ustreamer (shipped) || crowsnest (installed separately)&lt;br /&gt;
|-&lt;br /&gt;
| Configuration || none needed || &amp;lt;code&amp;gt;~/printer_data/config/crowsnest.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Ports || 8080 only || 8080, 8081, 8082, ...&lt;br /&gt;
|-&lt;br /&gt;
| URLs || &amp;lt;code&amp;gt;/webcam/&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/webcam/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/webcam2/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/webcam3/&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The rest of this page applies to both, except where crowsnest configuration is shown explicitly.&lt;br /&gt;
&lt;br /&gt;
== Why MJPEG matters ==&lt;br /&gt;
&lt;br /&gt;
USB cameras deliver frames in one of two ways:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;MJPEG&#039;&#039;&#039; (&amp;lt;code&amp;gt;MJPG&amp;lt;/code&amp;gt;) - the camera compresses each frame itself. The Recore copies compressed frames straight to the browser without touching them.&lt;br /&gt;
* &#039;&#039;&#039;Raw&#039;&#039;&#039; (&amp;lt;code&amp;gt;YUYV&amp;lt;/code&amp;gt;) - the camera sends uncompressed pixels. Every frame must then be JPEG-compressed in software on the Recore&#039;s CPU.&lt;br /&gt;
&lt;br /&gt;
A single 640x480 raw frame is 614 kB. The same frame as MJPEG is typically 20-40 kB. That difference applies to both the USB bus and the processor.&lt;br /&gt;
&lt;br /&gt;
Measured on the same board, same bus:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Camera !! MJPEG? !! Result&lt;br /&gt;
|-&lt;br /&gt;
| Logitech BRIO || yes || 1280x720 @ 54 fps, hardware passthrough&lt;br /&gt;
|-&lt;br /&gt;
| AUKEY PC-W1 || yes || 1280x720 @ 30 fps, hardware passthrough&lt;br /&gt;
|-&lt;br /&gt;
| Vimicro &amp;quot;Venus&amp;quot; || &#039;&#039;&#039;no&#039;&#039;&#039; || never obtained USB bandwidth alongside the others, even at 320x240&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The raw-only camera could not be made to work as a third camera at any resolution. It was not scaling its USB bandwidth request with frame size.&lt;br /&gt;
&lt;br /&gt;
=== Checking a camera before buying ===&lt;br /&gt;
&lt;br /&gt;
If you can plug it into any Linux machine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v4l2-ctl --list-formats-ext -d /dev/video0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Look for this line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[1]: &#039;MJPG&#039; (Motion-JPEG, compressed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If only &amp;lt;code&amp;gt;&#039;YUYV&#039;&amp;lt;/code&amp;gt; appears, the camera has no hardware compression. It will work as a single camera at low resolution, but it is a poor choice for a Recore.&lt;br /&gt;
&lt;br /&gt;
Some cameras also list &amp;lt;code&amp;gt;H264&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;HEVC&amp;lt;/code&amp;gt;. These are not currently used - the streaming software (ustreamer) handles MJPEG only - but a camera offering H.264 will almost always offer MJPEG as well.&lt;br /&gt;
&lt;br /&gt;
== How many cameras can run at once ==&lt;br /&gt;
&lt;br /&gt;
The A64 has a &#039;&#039;&#039;single USB host controller&#039;&#039;&#039;, and every USB device on a Recore sits behind one hub connected to it. USB 2.0 reserves bandwidth for cameras up front, when the stream starts, and the total is fixed.&lt;br /&gt;
&lt;br /&gt;
Measured with three MJPEG cameras:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Configuration !! Result&lt;br /&gt;
|-&lt;br /&gt;
| 3 cameras @ 640x480 || &#039;&#039;&#039;all three work&#039;&#039;&#039; - 27, 20 and 30 fps&lt;br /&gt;
|-&lt;br /&gt;
| 3 cameras @ 1280x720 || only the first starts; other two fail immediately&lt;br /&gt;
|-&lt;br /&gt;
| 2 cameras @ 1280x720 || both work - 53 and 30 fps&lt;br /&gt;
|-&lt;br /&gt;
| 2 cameras @ 1920x1080 || first works, second fails&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bandwidth is claimed on a first-come basis. Whichever camera starts first gets what it asks for, and later cameras get whatever is left - which may be nothing.&lt;br /&gt;
&lt;br /&gt;
=== The signature of running out of bandwidth ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ dmesg | grep URB&lt;br /&gt;
uvcvideo 1-1.3:1.1: Failed to submit URB 0 (-28).&lt;br /&gt;
uvcvideo 1-1.1:1.1: Failed to submit URB 0 (-28).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-28&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;ENOSPC&amp;lt;/code&amp;gt;. In this context it does not mean disk space - it means the USB controller could not reserve enough bandwidth for the stream.&lt;br /&gt;
&lt;br /&gt;
This failure is &#039;&#039;&#039;immediate and unrelated to system load&#039;&#039;&#039;. If a camera fails this way it will fail on an idle machine just as reliably. The fix is to lower resolution or frame rate, or to use fewer cameras.&lt;br /&gt;
&lt;br /&gt;
== CPU cost ==&lt;br /&gt;
&lt;br /&gt;
With hardware MJPEG the CPU cost is close to nothing. Three cameras at 640x480, all three being watched in Fluidd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cpu0  9%    cpu1  5%    cpu2  8%    cpu3  6%      (softirq 0% on all cores)&lt;br /&gt;
&lt;br /&gt;
ustreamer processes:  ~3.6% each, about 11% of one core in total&lt;br /&gt;
klipper (python):     7.7%          &amp;lt;- more than all three cameras combined&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Every frame captured reached the browser (&amp;lt;code&amp;gt;queued_fps&amp;lt;/code&amp;gt; equalled &amp;lt;code&amp;gt;captured_fps&amp;lt;/code&amp;gt; on all three streams), so nothing was being dropped.&lt;br /&gt;
&lt;br /&gt;
A raw YUYV camera changes this picture completely, because ustreamer must then run a software JPEG encoder - it starts four worker threads for a single 640x480 stream.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Conclusion:&#039;&#039;&#039; on a Recore, multiple cameras are limited by USB bandwidth, not by the processor. Three cameras left the SoC around 90% idle.&lt;br /&gt;
&lt;br /&gt;
== Low frame rate from a single camera ==&lt;br /&gt;
&lt;br /&gt;
If one camera runs far below its rated frame rate, the cause is usually &#039;&#039;&#039;exposure time&#039;&#039;&#039;, not bandwidth.&lt;br /&gt;
&lt;br /&gt;
In dim light a camera on automatic exposure will lengthen its exposure, and exposure time puts a hard ceiling on frame rate: 140 ms per frame is at most 7 fps, no matter what else is configured.&lt;br /&gt;
&lt;br /&gt;
Measured on a Vimicro camera at 640x480 (Recore A7):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting !! Frame rate&lt;br /&gt;
|-&lt;br /&gt;
| auto exposure (default) || 7.2 fps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exposure_time_absolute=100&amp;lt;/code&amp;gt; (~10 ms) || 19.9 fps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exposure_time_absolute=30&amp;lt;/code&amp;gt; (~3 ms) || 30.0 fps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note the trade-off: shorter exposure means a darker image. More light on the subject is the better fix where possible.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The diagnostic that distinguishes the two causes:&#039;&#039;&#039; lower the resolution and re-measure.&lt;br /&gt;
* Frame rate improves roughly in proportion - the limit was &#039;&#039;&#039;bandwidth&#039;&#039;&#039;.&lt;br /&gt;
* Frame rate does not change - the limit is &#039;&#039;&#039;exposure&#039;&#039;&#039; (or something else per-frame).&lt;br /&gt;
&lt;br /&gt;
In the case above, 320x240 gave exactly the same 7 fps as 640x480, which ruled out bandwidth before anything was changed.&lt;br /&gt;
&lt;br /&gt;
Setting exposure manually in crowsnest:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[cam 1]&lt;br /&gt;
v4l2ctl: auto_exposure=1,exposure_time_absolute=100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Use stable device paths ===&lt;br /&gt;
&lt;br /&gt;
Do &#039;&#039;&#039;not&#039;&#039;&#039; use &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/dev/video2&amp;lt;/code&amp;gt; and so on in configuration. These numbers change whenever a camera is added, removed or replugged - on the test board &amp;lt;code&amp;gt;/dev/webcam&amp;lt;/code&amp;gt; moved from &amp;lt;code&amp;gt;video2&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;video5&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;video7&amp;lt;/code&amp;gt; in a single afternoon as cameras were swapped, silently changing which camera was being streamed.&lt;br /&gt;
&lt;br /&gt;
Use the by-id path instead:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ls /dev/v4l/by-id/&lt;br /&gt;
usb-046d_Logitech_BRIO_E76A9283-video-index0&lt;br /&gt;
usb-Sonix_Technology_Co.__Ltd._AUKEY_PC-W1_SN0001-video-index0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;index0&amp;lt;/code&amp;gt; matters: a UVC camera exposes several device nodes and only the first is the capture device. The BRIO exposes four; the rest carry metadata.&lt;br /&gt;
&lt;br /&gt;
=== Example crowsnest configuration ===&lt;br /&gt;
&lt;br /&gt;
Three cameras, all MJPEG, at a resolution where all three fit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[crowsnest]&lt;br /&gt;
log_level: verbose&lt;br /&gt;
rollover_on_start: false&lt;br /&gt;
no_proxy: false&lt;br /&gt;
&lt;br /&gt;
[cam 1]&lt;br /&gt;
mode: ustreamer&lt;br /&gt;
port: 8080&lt;br /&gt;
device: /dev/v4l/by-id/usb-046d_Logitech_BRIO_E76A9283-video-index0&lt;br /&gt;
resolution: 640x480&lt;br /&gt;
max_fps: 30&lt;br /&gt;
custom_flags: --format=MJPEG --drop-same-frames=30&lt;br /&gt;
&lt;br /&gt;
[cam 2]&lt;br /&gt;
mode: ustreamer&lt;br /&gt;
port: 8081&lt;br /&gt;
device: /dev/v4l/by-id/usb-Sonix_Technology_Co.__Ltd._AUKEY_PC-W1_SN0001-video-index0&lt;br /&gt;
resolution: 640x480&lt;br /&gt;
max_fps: 30&lt;br /&gt;
custom_flags: --format=MJPEG --drop-same-frames=30&lt;br /&gt;
&lt;br /&gt;
[cam 3]&lt;br /&gt;
mode: ustreamer&lt;br /&gt;
port: 8082&lt;br /&gt;
device: /dev/v4l/by-id/usb-Linux_Foundation_Webcam_gadget-video-index0&lt;br /&gt;
resolution: 640x480&lt;br /&gt;
max_fps: 30&lt;br /&gt;
custom_flags: --format=MJPEG --drop-same-frames=30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ports map to URLs: 8080 is &amp;lt;code&amp;gt;/webcam/&amp;lt;/code&amp;gt;, 8081 is &amp;lt;code&amp;gt;/webcam2/&amp;lt;/code&amp;gt;, 8082 is &amp;lt;code&amp;gt;/webcam3/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Adding cameras to Fluidd ===&lt;br /&gt;
&lt;br /&gt;
Each camera has to be registered in Moonraker before it appears in the interface. In Fluidd: &#039;&#039;&#039;Settings -&amp;gt; Camera -&amp;gt; Add Camera&#039;&#039;&#039;, then set the stream URL to &amp;lt;code&amp;gt;/webcam2/?action=stream&amp;lt;/code&amp;gt; and the snapshot URL to &amp;lt;code&amp;gt;/webcam2/?action=snapshot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Choose service &#039;&#039;&#039;&amp;quot;MJPEG Stream&amp;quot;&#039;&#039;&#039; rather than &#039;&#039;&#039;&amp;quot;MJPEG Stream (Adaptive)&amp;quot;&#039;&#039;&#039;. In adaptive mode the browser fetches individual snapshots at its own pace instead of consuming the stream, and it throttles to &amp;lt;code&amp;gt;target_fps_idle&amp;lt;/code&amp;gt; - 5 fps by default - whenever the printer is not printing. A camera capturing at 20 fps can appear to run at 2 fps for this reason alone, with nothing wrong on the Recore at all.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! Likely cause !! Check&lt;br /&gt;
|-&lt;br /&gt;
| Second or third camera never starts || USB bandwidth || &amp;lt;code&amp;gt;dmesg &amp;amp;#124; grep URB&amp;lt;/code&amp;gt; for &amp;lt;code&amp;gt;-28&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Low fps, unchanged by lowering resolution || exposure time || &amp;lt;code&amp;gt;v4l2-ctl -d /dev/webcam --list-ctrls&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Low fps, improves when resolution is lowered || USB bandwidth || reduce resolution or camera count&lt;br /&gt;
|-&lt;br /&gt;
| Fluidd shows ~2-5 fps, board reports more || Fluidd adaptive mode || set service to plain &amp;quot;MJPEG Stream&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| High CPU from ustreamer || camera has no MJPEG || &amp;lt;code&amp;gt;v4l2-ctl --list-formats-ext&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Camera works, then stops after replug || device path changed || use &amp;lt;code&amp;gt;/dev/v4l/by-id/&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| All cameras stop after adding one || crowsnest crash - see below || &amp;lt;code&amp;gt;journalctl -u crowsnest&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Useful commands ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# What formats and frame rates does this camera support?&lt;br /&gt;
v4l2-ctl --list-formats-ext -d /dev/video2&lt;br /&gt;
&lt;br /&gt;
# What controls does it have (exposure, brightness, ...)?&lt;br /&gt;
v4l2-ctl --list-ctrls -d /dev/video2&lt;br /&gt;
&lt;br /&gt;
# What is the stream actually doing right now?&lt;br /&gt;
curl -s http://localhost:8080/state&lt;br /&gt;
&lt;br /&gt;
# Which USB devices are attached, and at what speed?&lt;br /&gt;
for d in /sys/bus/usb/devices/[0-9]*-[0-9]*; do&lt;br /&gt;
    echo &amp;quot;$(basename $d) $(cat $d/speed)M $(cat $d/product 2&amp;gt;/dev/null)&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;/state&amp;lt;/code&amp;gt; endpoint is the quickest way to see what is happening:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;encoder&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;HW&amp;quot;}          &amp;lt;- hardware MJPEG, no CPU cost&lt;br /&gt;
&amp;quot;encoder&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;CPU&amp;quot;}         &amp;lt;- software encoding, camera has no MJPEG&lt;br /&gt;
&amp;quot;online&amp;quot;: false                    &amp;lt;- camera not delivering frames at all&lt;br /&gt;
&amp;quot;captured_fps&amp;quot;: 27                 &amp;lt;- what the camera produces&lt;br /&gt;
&amp;quot;queued_fps&amp;quot;: 27                   &amp;lt;- what reaches viewers; lower means drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Known issue: one camera can prevent all others from starting ===&lt;br /&gt;
&lt;br /&gt;
Crowsnest v5.0.11 crashes on startup if any attached camera exposes a V4L2 control without a &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; value, which is legal and occurs on some cameras:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
File &amp;quot;crowsnest/camera/types/uvc.py&amp;quot;, line 72, in get_controls_string&lt;br /&gt;
    line += f&amp;quot; default={data[&#039;default&#039;]}&amp;quot;&lt;br /&gt;
KeyError: &#039;default&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The crash happens before &#039;&#039;&#039;any&#039;&#039;&#039; camera starts, so a single unusual camera takes down every stream on the machine. Changing the log level does not avoid it, because the controls are enumerated regardless.&lt;br /&gt;
&lt;br /&gt;
Workaround, until fixed upstream - in &amp;lt;code&amp;gt;crowsnest/camera/types/uvc.py&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
line += f&amp;quot; default={data.get(&#039;default&#039;, &#039;n/a&#039;)}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Background: why the USB bus is the limit ==&lt;br /&gt;
&lt;br /&gt;
The Allwinner A64 has one EHCI host controller. Every USB device on a Recore - cameras, WiFi dongles, USB storage, USB serial - shares it.&lt;br /&gt;
&lt;br /&gt;
USB 2.0 gives cameras &#039;&#039;isochronous&#039;&#039; transfers: guaranteed, reserved bandwidth, claimed when the stream opens. The specification caps this at 80% of the bus, and the reservation is made up front based on the requested resolution and frame rate. This is why a camera either starts successfully or fails immediately, rather than degrading gradually.&lt;br /&gt;
&lt;br /&gt;
It was previously suspected that USB interrupt handling on a single CPU core was the constraint. Measurement does not support this for cameras:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ grep ehci /proc/interrupts&lt;br /&gt;
 57:   429   992573   0   0   GICv2 106 Level   ehci_hcd:usb1&lt;br /&gt;
      cpu0    cpu1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The interrupt is handled on one core, but with three cameras streaming to three viewers that core was only 5% busy, and softirq time was zero across all cores.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;However&#039;&#039;&#039;, high single-core load &#039;&#039;has&#039;&#039; been measured on Recore when networking runs over a &#039;&#039;&#039;USB WiFi dongle&#039;&#039;&#039; - 73% of one core to receive 1.2 MB/s. In that case the USB completion handling and the entire network stack land on the same core. Cameras over Ethernet do not have this problem, because Ethernet on the A64 is a separate peripheral that does not use USB at all.&lt;br /&gt;
&lt;br /&gt;
So: &#039;&#039;&#039;a Recore with cameras and a USB WiFi dongle is a meaningfully heavier configuration than one using Ethernet.&#039;&#039;&#039; If cameras behave badly over WiFi but well over Ethernet, this is why.&lt;br /&gt;
&lt;br /&gt;
== H.264 and HEVC ==&lt;br /&gt;
&lt;br /&gt;
Some cameras offer H.264 or HEVC in addition to MJPEG. These are &#039;&#039;&#039;far&#039;&#039;&#039; more efficient than MJPEG, but they &#039;&#039;&#039;cannot currently be used on Recore&#039;&#039;&#039;. This section records why, so the question does not need re-investigating.&lt;br /&gt;
&lt;br /&gt;
=== The efficiency is dramatic ===&lt;br /&gt;
&lt;br /&gt;
Measured on a 4K microscope camera, same board, same bus, 45 frames per run:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Format !! Resolution !! Frame rate !! Per frame&lt;br /&gt;
|-&lt;br /&gt;
| MJPEG || 1920x1080 || 29.9 fps || 395 kB&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;H.264&#039;&#039;&#039; || 1920x1080 || 29.8 fps || &#039;&#039;&#039;18 kB&#039;&#039;&#039; (22x smaller)&lt;br /&gt;
|-&lt;br /&gt;
| H.264 || 3840x2160 || 26.3 fps || 89 kB&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;HEVC&#039;&#039;&#039; || 3840x2160 || &#039;&#039;&#039;30.0 fps&#039;&#039;&#039; || &#039;&#039;&#039;73 kB&#039;&#039;&#039; (25x smaller)&lt;br /&gt;
|-&lt;br /&gt;
| MJPEG || 3840x2160 || 12.7 fps || 1871 kB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4K HEVC at a full 30 fps uses about five times less bandwidth than 1080p MJPEG.&#039;&#039;&#039; Note also that MJPEG at 4K cannot reach 30 fps at all - it manages 12.7 fps because it saturates the USB bus, while HEVC at the same resolution runs at the full rate.&lt;br /&gt;
&lt;br /&gt;
If these codecs worked, the bandwidth limits described above would largely disappear.&lt;br /&gt;
&lt;br /&gt;
=== Why it does not work ===&lt;br /&gt;
&lt;br /&gt;
The blocker is &#039;&#039;&#039;camera-streamer&#039;&#039;&#039;, not crowsnest and not ustreamer.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ustreamer&#039;&#039;&#039; handles MJPEG only, by design. It is not the limitation, because crowsnest can launch camera-streamer instead.&lt;br /&gt;
* &#039;&#039;&#039;camera-streamer&#039;&#039;&#039; does support H.264 and captures it correctly - it negotiates &amp;lt;code&amp;gt;1920x1080/H264&amp;lt;/code&amp;gt; without trouble - but it then fails to start:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
device/buffer_list.c: CAMERA:capture: Using: 1920x1080/H264, buffers=3    &amp;lt;- capture works&lt;br /&gt;
device/camera/camera_decoder.c: CAMERA: Cannot find &#039;H264&#039; decoder&lt;br /&gt;
device/camera/camera_output.c: CAMERA: Cannot find source for &#039;SNAPSHOT&#039; for one of the formats &#039;JPEG, MJPG&#039;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things combine to make this a hard stop:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. The snapshot output cannot be disabled.&#039;&#039;&#039; camera-streamer 0.4.2.4 provides &amp;lt;code&amp;gt;--camera-stream.disabled&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;--camera-video.disabled&amp;lt;/code&amp;gt;, but there is no equivalent for snapshot. Snapshot must be JPEG or MJPG, so H.264 input has to be decoded to satisfy it. Disabling the other two outputs does not help - it still exits.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. The A64&#039;s video decoder is the wrong kind.&#039;&#039;&#039; The SoC does have a hardware decoder (&amp;lt;code&amp;gt;cedrus&amp;lt;/code&amp;gt;), and it does handle H.264 and HEVC, but note the formats it accepts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ v4l2-ctl -d /dev/video0 --list-formats-out&lt;br /&gt;
	[1]: &#039;S264&#039; (H.264 Parsed Slice Data, compressed)&lt;br /&gt;
	[2]: &#039;S265&#039; (HEVC Parsed Slice Data, compressed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parsed Slice Data&amp;quot; means this is a &#039;&#039;&#039;stateless&#039;&#039;&#039; decoder. Userspace has to parse the bitstream itself, extract the sequence and picture parameter sets, and drive the hardware slice by slice through the Media Request API. camera-streamer expects a &#039;&#039;&#039;stateful&#039;&#039;&#039; decoder - the kind found on the Raspberry Pi, where a stream goes in and frames come out. These are fundamentally different programming models, so camera-streamer cannot use cedrus even though the hardware is capable.&lt;br /&gt;
&lt;br /&gt;
This is not a missing driver, a missing package or a configuration mistake.&lt;br /&gt;
&lt;br /&gt;
=== What would be needed ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Patch camera-streamer&#039;&#039;&#039; to allow the snapshot output to be disabled, then pass H.264 through to WebRTC without decoding at all. This is the smallest change and would deliver the bandwidth saving. The drawback is that WebRTC is the only viable output - Fluidd displays cameras with an ordinary image element, which cannot show H.264.&lt;br /&gt;
* &#039;&#039;&#039;Use a decoder that speaks stateless V4L2&#039;&#039;&#039; - ffmpeg with the Request API, or libva - to convert H.264 to MJPEG on the board. This keeps compatibility with existing interfaces, but re-introduces a per-frame cost, which is much of what the codec was meant to avoid.&lt;br /&gt;
&lt;br /&gt;
Until one of those exists, &#039;&#039;&#039;use MJPEG&#039;&#039;&#039;, and treat a camera&#039;s H.264 or HEVC support as a bonus that is not currently usable. A camera offering H.264 will almost always offer MJPEG too, so such cameras are still fine to buy.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/intelligent-agent/Rebuild/issues/76 Rebuild issue #76] - USB interrupt handling and multi-camera investigation, with measurements&lt;br /&gt;
* [https://docs.mainsail.xyz/crowsnest/ Crowsnest documentation]&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Webcams&amp;diff=1656</id>
		<title>Webcams</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Webcams&amp;diff=1656"/>
		<updated>2026-08-23T17:23:39Z</updated>

		<summary type="html">&lt;p&gt;Elias: Add H.264/HEVC section: measured efficiency and why camera-streamer cannot use them on A64&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recore can run one or more USB webcams for monitoring prints. This page covers how to choose a camera, how many will work at once, and how to diagnose the common failures.&lt;br /&gt;
&lt;br /&gt;
All figures here were measured on a Recore A5 running &amp;lt;code&amp;gt;rebuild-fluidd&amp;lt;/code&amp;gt; (kernel 6.18.33) in August 2026, with three cameras attached.&lt;br /&gt;
&lt;br /&gt;
== The short version ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Buy a camera that supports MJPEG in hardware.&#039;&#039;&#039; This matters more than resolution, brand or price. A camera without it can cost 20x the USB bandwidth and forces the CPU to compress every frame.&lt;br /&gt;
* &#039;&#039;&#039;Roughly three cameras at 640x480, or two at 1280x720.&#039;&#039;&#039; The limit is USB bandwidth, not the processor.&lt;br /&gt;
* If a camera will not start, check &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt; for &amp;lt;code&amp;gt;Failed to submit URB 0 (-28)&amp;lt;/code&amp;gt; before suspecting anything else.&lt;br /&gt;
&lt;br /&gt;
== Why MJPEG matters ==&lt;br /&gt;
&lt;br /&gt;
USB cameras deliver frames in one of two ways:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;MJPEG&#039;&#039;&#039; (&amp;lt;code&amp;gt;MJPG&amp;lt;/code&amp;gt;) - the camera compresses each frame itself. The Recore copies compressed frames straight to the browser without touching them.&lt;br /&gt;
* &#039;&#039;&#039;Raw&#039;&#039;&#039; (&amp;lt;code&amp;gt;YUYV&amp;lt;/code&amp;gt;) - the camera sends uncompressed pixels. Every frame must then be JPEG-compressed in software on the Recore&#039;s CPU.&lt;br /&gt;
&lt;br /&gt;
A single 640x480 raw frame is 614 kB. The same frame as MJPEG is typically 20-40 kB. That difference applies to both the USB bus and the processor.&lt;br /&gt;
&lt;br /&gt;
Measured on the same board, same bus:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Camera !! MJPEG? !! Result&lt;br /&gt;
|-&lt;br /&gt;
| Logitech BRIO || yes || 1280x720 @ 54 fps, hardware passthrough&lt;br /&gt;
|-&lt;br /&gt;
| AUKEY PC-W1 || yes || 1280x720 @ 30 fps, hardware passthrough&lt;br /&gt;
|-&lt;br /&gt;
| Vimicro &amp;quot;Venus&amp;quot; || &#039;&#039;&#039;no&#039;&#039;&#039; || never obtained USB bandwidth alongside the others, even at 320x240&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The raw-only camera could not be made to work as a third camera at any resolution. It was not scaling its USB bandwidth request with frame size.&lt;br /&gt;
&lt;br /&gt;
=== Checking a camera before buying ===&lt;br /&gt;
&lt;br /&gt;
If you can plug it into any Linux machine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v4l2-ctl --list-formats-ext -d /dev/video0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Look for this line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[1]: &#039;MJPG&#039; (Motion-JPEG, compressed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If only &amp;lt;code&amp;gt;&#039;YUYV&#039;&amp;lt;/code&amp;gt; appears, the camera has no hardware compression. It will work as a single camera at low resolution, but it is a poor choice for a Recore.&lt;br /&gt;
&lt;br /&gt;
Some cameras also list &amp;lt;code&amp;gt;H264&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;HEVC&amp;lt;/code&amp;gt;. These are not currently used - the streaming software (ustreamer) handles MJPEG only - but a camera offering H.264 will almost always offer MJPEG as well.&lt;br /&gt;
&lt;br /&gt;
== How many cameras can run at once ==&lt;br /&gt;
&lt;br /&gt;
The A64 has a &#039;&#039;&#039;single USB host controller&#039;&#039;&#039;, and every USB device on a Recore sits behind one hub connected to it. USB 2.0 reserves bandwidth for cameras up front, when the stream starts, and the total is fixed.&lt;br /&gt;
&lt;br /&gt;
Measured with three MJPEG cameras:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Configuration !! Result&lt;br /&gt;
|-&lt;br /&gt;
| 3 cameras @ 640x480 || &#039;&#039;&#039;all three work&#039;&#039;&#039; - 27, 20 and 30 fps&lt;br /&gt;
|-&lt;br /&gt;
| 3 cameras @ 1280x720 || only the first starts; other two fail immediately&lt;br /&gt;
|-&lt;br /&gt;
| 2 cameras @ 1280x720 || both work - 53 and 30 fps&lt;br /&gt;
|-&lt;br /&gt;
| 2 cameras @ 1920x1080 || first works, second fails&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bandwidth is claimed on a first-come basis. Whichever camera starts first gets what it asks for, and later cameras get whatever is left - which may be nothing.&lt;br /&gt;
&lt;br /&gt;
=== The signature of running out of bandwidth ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ dmesg | grep URB&lt;br /&gt;
uvcvideo 1-1.3:1.1: Failed to submit URB 0 (-28).&lt;br /&gt;
uvcvideo 1-1.1:1.1: Failed to submit URB 0 (-28).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-28&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;ENOSPC&amp;lt;/code&amp;gt;. In this context it does not mean disk space - it means the USB controller could not reserve enough bandwidth for the stream.&lt;br /&gt;
&lt;br /&gt;
This failure is &#039;&#039;&#039;immediate and unrelated to system load&#039;&#039;&#039;. If a camera fails this way it will fail on an idle machine just as reliably. The fix is to lower resolution or frame rate, or to use fewer cameras.&lt;br /&gt;
&lt;br /&gt;
== CPU cost ==&lt;br /&gt;
&lt;br /&gt;
With hardware MJPEG the CPU cost is close to nothing. Three cameras at 640x480, all three being watched in Fluidd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cpu0  9%    cpu1  5%    cpu2  8%    cpu3  6%      (softirq 0% on all cores)&lt;br /&gt;
&lt;br /&gt;
ustreamer processes:  ~3.6% each, about 11% of one core in total&lt;br /&gt;
klipper (python):     7.7%          &amp;lt;- more than all three cameras combined&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Every frame captured reached the browser (&amp;lt;code&amp;gt;queued_fps&amp;lt;/code&amp;gt; equalled &amp;lt;code&amp;gt;captured_fps&amp;lt;/code&amp;gt; on all three streams), so nothing was being dropped.&lt;br /&gt;
&lt;br /&gt;
A raw YUYV camera changes this picture completely, because ustreamer must then run a software JPEG encoder - it starts four worker threads for a single 640x480 stream.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Conclusion:&#039;&#039;&#039; on a Recore, multiple cameras are limited by USB bandwidth, not by the processor. Three cameras left the SoC around 90% idle.&lt;br /&gt;
&lt;br /&gt;
== Low frame rate from a single camera ==&lt;br /&gt;
&lt;br /&gt;
If one camera runs far below its rated frame rate, the cause is usually &#039;&#039;&#039;exposure time&#039;&#039;&#039;, not bandwidth.&lt;br /&gt;
&lt;br /&gt;
In dim light a camera on automatic exposure will lengthen its exposure, and exposure time puts a hard ceiling on frame rate: 140 ms per frame is at most 7 fps, no matter what else is configured.&lt;br /&gt;
&lt;br /&gt;
Measured on a Vimicro camera at 640x480:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting !! Frame rate&lt;br /&gt;
|-&lt;br /&gt;
| auto exposure (default) || 7.2 fps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exposure_time_absolute=100&amp;lt;/code&amp;gt; (~10 ms) || 19.9 fps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exposure_time_absolute=30&amp;lt;/code&amp;gt; (~3 ms) || 30.0 fps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note the trade-off: shorter exposure means a darker image. More light on the subject is the better fix where possible.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The diagnostic that distinguishes the two causes:&#039;&#039;&#039; lower the resolution and re-measure.&lt;br /&gt;
* Frame rate improves roughly in proportion - the limit was &#039;&#039;&#039;bandwidth&#039;&#039;&#039;.&lt;br /&gt;
* Frame rate does not change - the limit is &#039;&#039;&#039;exposure&#039;&#039;&#039; (or something else per-frame).&lt;br /&gt;
&lt;br /&gt;
In the case above, 320x240 gave exactly the same 7 fps as 640x480, which ruled out bandwidth before anything was changed.&lt;br /&gt;
&lt;br /&gt;
Setting exposure manually in crowsnest:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[cam 1]&lt;br /&gt;
v4l2ctl: auto_exposure=1,exposure_time_absolute=100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Use stable device paths ===&lt;br /&gt;
&lt;br /&gt;
Do &#039;&#039;&#039;not&#039;&#039;&#039; use &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/dev/video2&amp;lt;/code&amp;gt; and so on in configuration. These numbers change whenever a camera is added, removed or replugged - on the test board &amp;lt;code&amp;gt;/dev/webcam&amp;lt;/code&amp;gt; moved from &amp;lt;code&amp;gt;video2&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;video5&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;video7&amp;lt;/code&amp;gt; in a single afternoon as cameras were swapped, silently changing which camera was being streamed.&lt;br /&gt;
&lt;br /&gt;
Use the by-id path instead:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ls /dev/v4l/by-id/&lt;br /&gt;
usb-046d_Logitech_BRIO_E76A9283-video-index0&lt;br /&gt;
usb-Sonix_Technology_Co.__Ltd._AUKEY_PC-W1_SN0001-video-index0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;index0&amp;lt;/code&amp;gt; matters: a UVC camera exposes several device nodes and only the first is the capture device. The BRIO exposes four; the rest carry metadata.&lt;br /&gt;
&lt;br /&gt;
=== Example crowsnest configuration ===&lt;br /&gt;
&lt;br /&gt;
Three cameras, all MJPEG, at a resolution where all three fit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[crowsnest]&lt;br /&gt;
log_level: verbose&lt;br /&gt;
rollover_on_start: false&lt;br /&gt;
no_proxy: false&lt;br /&gt;
&lt;br /&gt;
[cam 1]&lt;br /&gt;
mode: ustreamer&lt;br /&gt;
port: 8080&lt;br /&gt;
device: /dev/v4l/by-id/usb-046d_Logitech_BRIO_E76A9283-video-index0&lt;br /&gt;
resolution: 640x480&lt;br /&gt;
max_fps: 30&lt;br /&gt;
custom_flags: --format=MJPEG --drop-same-frames=30&lt;br /&gt;
&lt;br /&gt;
[cam 2]&lt;br /&gt;
mode: ustreamer&lt;br /&gt;
port: 8081&lt;br /&gt;
device: /dev/v4l/by-id/usb-Sonix_Technology_Co.__Ltd._AUKEY_PC-W1_SN0001-video-index0&lt;br /&gt;
resolution: 640x480&lt;br /&gt;
max_fps: 30&lt;br /&gt;
custom_flags: --format=MJPEG --drop-same-frames=30&lt;br /&gt;
&lt;br /&gt;
[cam 3]&lt;br /&gt;
mode: ustreamer&lt;br /&gt;
port: 8082&lt;br /&gt;
device: /dev/v4l/by-id/usb-Linux_Foundation_Webcam_gadget-video-index0&lt;br /&gt;
resolution: 640x480&lt;br /&gt;
max_fps: 30&lt;br /&gt;
custom_flags: --format=MJPEG --drop-same-frames=30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ports map to URLs: 8080 is &amp;lt;code&amp;gt;/webcam/&amp;lt;/code&amp;gt;, 8081 is &amp;lt;code&amp;gt;/webcam2/&amp;lt;/code&amp;gt;, 8082 is &amp;lt;code&amp;gt;/webcam3/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Adding cameras to Fluidd ===&lt;br /&gt;
&lt;br /&gt;
Each camera has to be registered in Moonraker before it appears in the interface. In Fluidd: &#039;&#039;&#039;Settings -&amp;gt; Camera -&amp;gt; Add Camera&#039;&#039;&#039;, then set the stream URL to &amp;lt;code&amp;gt;/webcam2/?action=stream&amp;lt;/code&amp;gt; and the snapshot URL to &amp;lt;code&amp;gt;/webcam2/?action=snapshot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Choose service &#039;&#039;&#039;&amp;quot;MJPEG Stream&amp;quot;&#039;&#039;&#039; rather than &#039;&#039;&#039;&amp;quot;MJPEG Stream (Adaptive)&amp;quot;&#039;&#039;&#039;. In adaptive mode the browser fetches individual snapshots at its own pace instead of consuming the stream, and it throttles to &amp;lt;code&amp;gt;target_fps_idle&amp;lt;/code&amp;gt; - 5 fps by default - whenever the printer is not printing. A camera capturing at 20 fps can appear to run at 2 fps for this reason alone, with nothing wrong on the Recore at all.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! Likely cause !! Check&lt;br /&gt;
|-&lt;br /&gt;
| Second or third camera never starts || USB bandwidth || &amp;lt;code&amp;gt;dmesg &amp;amp;#124; grep URB&amp;lt;/code&amp;gt; for &amp;lt;code&amp;gt;-28&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Low fps, unchanged by lowering resolution || exposure time || &amp;lt;code&amp;gt;v4l2-ctl -d /dev/webcam --list-ctrls&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Low fps, improves when resolution is lowered || USB bandwidth || reduce resolution or camera count&lt;br /&gt;
|-&lt;br /&gt;
| Fluidd shows ~2-5 fps, board reports more || Fluidd adaptive mode || set service to plain &amp;quot;MJPEG Stream&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| High CPU from ustreamer || camera has no MJPEG || &amp;lt;code&amp;gt;v4l2-ctl --list-formats-ext&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Camera works, then stops after replug || device path changed || use &amp;lt;code&amp;gt;/dev/v4l/by-id/&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| All cameras stop after adding one || crowsnest crash - see below || &amp;lt;code&amp;gt;journalctl -u crowsnest&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Useful commands ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# What formats and frame rates does this camera support?&lt;br /&gt;
v4l2-ctl --list-formats-ext -d /dev/video2&lt;br /&gt;
&lt;br /&gt;
# What controls does it have (exposure, brightness, ...)?&lt;br /&gt;
v4l2-ctl --list-ctrls -d /dev/video2&lt;br /&gt;
&lt;br /&gt;
# What is the stream actually doing right now?&lt;br /&gt;
curl -s http://localhost:8080/state&lt;br /&gt;
&lt;br /&gt;
# Which USB devices are attached, and at what speed?&lt;br /&gt;
for d in /sys/bus/usb/devices/[0-9]*-[0-9]*; do&lt;br /&gt;
    echo &amp;quot;$(basename $d) $(cat $d/speed)M $(cat $d/product 2&amp;gt;/dev/null)&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;/state&amp;lt;/code&amp;gt; endpoint is the quickest way to see what is happening:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;encoder&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;HW&amp;quot;}          &amp;lt;- hardware MJPEG, no CPU cost&lt;br /&gt;
&amp;quot;encoder&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;CPU&amp;quot;}         &amp;lt;- software encoding, camera has no MJPEG&lt;br /&gt;
&amp;quot;online&amp;quot;: false                    &amp;lt;- camera not delivering frames at all&lt;br /&gt;
&amp;quot;captured_fps&amp;quot;: 27                 &amp;lt;- what the camera produces&lt;br /&gt;
&amp;quot;queued_fps&amp;quot;: 27                   &amp;lt;- what reaches viewers; lower means drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Known issue: one camera can prevent all others from starting ===&lt;br /&gt;
&lt;br /&gt;
Crowsnest v5.0.11 crashes on startup if any attached camera exposes a V4L2 control without a &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; value, which is legal and occurs on some cameras:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
File &amp;quot;crowsnest/camera/types/uvc.py&amp;quot;, line 72, in get_controls_string&lt;br /&gt;
    line += f&amp;quot; default={data[&#039;default&#039;]}&amp;quot;&lt;br /&gt;
KeyError: &#039;default&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The crash happens before &#039;&#039;&#039;any&#039;&#039;&#039; camera starts, so a single unusual camera takes down every stream on the machine. Changing the log level does not avoid it, because the controls are enumerated regardless.&lt;br /&gt;
&lt;br /&gt;
Workaround, until fixed upstream - in &amp;lt;code&amp;gt;crowsnest/camera/types/uvc.py&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
line += f&amp;quot; default={data.get(&#039;default&#039;, &#039;n/a&#039;)}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Background: why the USB bus is the limit ==&lt;br /&gt;
&lt;br /&gt;
The Allwinner A64 has one EHCI host controller. Every USB device on a Recore - cameras, WiFi dongles, USB storage, USB serial - shares it.&lt;br /&gt;
&lt;br /&gt;
USB 2.0 gives cameras &#039;&#039;isochronous&#039;&#039; transfers: guaranteed, reserved bandwidth, claimed when the stream opens. The specification caps this at 80% of the bus, and the reservation is made up front based on the requested resolution and frame rate. This is why a camera either starts successfully or fails immediately, rather than degrading gradually.&lt;br /&gt;
&lt;br /&gt;
It was previously suspected that USB interrupt handling on a single CPU core was the constraint. Measurement does not support this for cameras:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ grep ehci /proc/interrupts&lt;br /&gt;
 57:   429   992573   0   0   GICv2 106 Level   ehci_hcd:usb1&lt;br /&gt;
      cpu0    cpu1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The interrupt is handled on one core, but with three cameras streaming to three viewers that core was only 5% busy, and softirq time was zero across all cores.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;However&#039;&#039;&#039;, high single-core load &#039;&#039;has&#039;&#039; been measured on Recore when networking runs over a &#039;&#039;&#039;USB WiFi dongle&#039;&#039;&#039; - 73% of one core to receive 1.2 MB/s. In that case the USB completion handling and the entire network stack land on the same core. Cameras over Ethernet do not have this problem, because Ethernet on the A64 is a separate peripheral that does not use USB at all.&lt;br /&gt;
&lt;br /&gt;
So: &#039;&#039;&#039;a Recore with cameras and a USB WiFi dongle is a meaningfully heavier configuration than one using Ethernet.&#039;&#039;&#039; If cameras behave badly over WiFi but well over Ethernet, this is why.&lt;br /&gt;
&lt;br /&gt;
== H.264 and HEVC ==&lt;br /&gt;
&lt;br /&gt;
Some cameras offer H.264 or HEVC in addition to MJPEG. These are &#039;&#039;&#039;far&#039;&#039;&#039; more efficient than MJPEG, but they &#039;&#039;&#039;cannot currently be used on Recore&#039;&#039;&#039;. This section records why, so the question does not need re-investigating.&lt;br /&gt;
&lt;br /&gt;
=== The efficiency is dramatic ===&lt;br /&gt;
&lt;br /&gt;
Measured on a 4K microscope camera, same board, same bus, 45 frames per run:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Format !! Resolution !! Frame rate !! Per frame&lt;br /&gt;
|-&lt;br /&gt;
| MJPEG || 1920x1080 || 29.9 fps || 395 kB&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;H.264&#039;&#039;&#039; || 1920x1080 || 29.8 fps || &#039;&#039;&#039;18 kB&#039;&#039;&#039; (22x smaller)&lt;br /&gt;
|-&lt;br /&gt;
| H.264 || 3840x2160 || 26.3 fps || 89 kB&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;HEVC&#039;&#039;&#039; || 3840x2160 || &#039;&#039;&#039;30.0 fps&#039;&#039;&#039; || &#039;&#039;&#039;73 kB&#039;&#039;&#039; (25x smaller)&lt;br /&gt;
|-&lt;br /&gt;
| MJPEG || 3840x2160 || 12.7 fps || 1871 kB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4K HEVC at a full 30 fps uses about five times less bandwidth than 1080p MJPEG.&#039;&#039;&#039; Note also that MJPEG at 4K cannot reach 30 fps at all - it manages 12.7 fps because it saturates the USB bus, while HEVC at the same resolution runs at the full rate.&lt;br /&gt;
&lt;br /&gt;
If these codecs worked, the bandwidth limits described above would largely disappear.&lt;br /&gt;
&lt;br /&gt;
=== Why it does not work ===&lt;br /&gt;
&lt;br /&gt;
The blocker is &#039;&#039;&#039;camera-streamer&#039;&#039;&#039;, not crowsnest and not ustreamer.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ustreamer&#039;&#039;&#039; handles MJPEG only, by design. It is not the limitation, because crowsnest can launch camera-streamer instead.&lt;br /&gt;
* &#039;&#039;&#039;camera-streamer&#039;&#039;&#039; does support H.264 and captures it correctly - it negotiates &amp;lt;code&amp;gt;1920x1080/H264&amp;lt;/code&amp;gt; without trouble - but it then fails to start:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
device/buffer_list.c: CAMERA:capture: Using: 1920x1080/H264, buffers=3    &amp;lt;- capture works&lt;br /&gt;
device/camera/camera_decoder.c: CAMERA: Cannot find &#039;H264&#039; decoder&lt;br /&gt;
device/camera/camera_output.c: CAMERA: Cannot find source for &#039;SNAPSHOT&#039; for one of the formats &#039;JPEG, MJPG&#039;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things combine to make this a hard stop:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. The snapshot output cannot be disabled.&#039;&#039;&#039; camera-streamer 0.4.2.4 provides &amp;lt;code&amp;gt;--camera-stream.disabled&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;--camera-video.disabled&amp;lt;/code&amp;gt;, but there is no equivalent for snapshot. Snapshot must be JPEG or MJPG, so H.264 input has to be decoded to satisfy it. Disabling the other two outputs does not help - it still exits.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. The A64&#039;s video decoder is the wrong kind.&#039;&#039;&#039; The SoC does have a hardware decoder (&amp;lt;code&amp;gt;cedrus&amp;lt;/code&amp;gt;), and it does handle H.264 and HEVC, but note the formats it accepts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ v4l2-ctl -d /dev/video0 --list-formats-out&lt;br /&gt;
	[1]: &#039;S264&#039; (H.264 Parsed Slice Data, compressed)&lt;br /&gt;
	[2]: &#039;S265&#039; (HEVC Parsed Slice Data, compressed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parsed Slice Data&amp;quot; means this is a &#039;&#039;&#039;stateless&#039;&#039;&#039; decoder. Userspace has to parse the bitstream itself, extract the sequence and picture parameter sets, and drive the hardware slice by slice through the Media Request API. camera-streamer expects a &#039;&#039;&#039;stateful&#039;&#039;&#039; decoder - the kind found on the Raspberry Pi, where a stream goes in and frames come out. These are fundamentally different programming models, so camera-streamer cannot use cedrus even though the hardware is capable.&lt;br /&gt;
&lt;br /&gt;
This is not a missing driver, a missing package or a configuration mistake.&lt;br /&gt;
&lt;br /&gt;
=== What would be needed ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Patch camera-streamer&#039;&#039;&#039; to allow the snapshot output to be disabled, then pass H.264 through to WebRTC without decoding at all. This is the smallest change and would deliver the bandwidth saving. The drawback is that WebRTC is the only viable output - Fluidd displays cameras with an ordinary image element, which cannot show H.264.&lt;br /&gt;
* &#039;&#039;&#039;Use a decoder that speaks stateless V4L2&#039;&#039;&#039; - ffmpeg with the Request API, or libva - to convert H.264 to MJPEG on the board. This keeps compatibility with existing interfaces, but re-introduces a per-frame cost, which is much of what the codec was meant to avoid.&lt;br /&gt;
&lt;br /&gt;
Until one of those exists, &#039;&#039;&#039;use MJPEG&#039;&#039;&#039;, and treat a camera&#039;s H.264 or HEVC support as a bonus that is not currently usable. A camera offering H.264 will almost always offer MJPEG too, so such cameras are still fine to buy.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/intelligent-agent/Rebuild/issues/76 Rebuild issue #76] - USB interrupt handling and multi-camera investigation, with measurements&lt;br /&gt;
* [https://docs.mainsail.xyz/crowsnest/ Crowsnest documentation]&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Webcams&amp;diff=1655</id>
		<title>Webcams</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Webcams&amp;diff=1655"/>
		<updated>2026-08-23T17:05:43Z</updated>

		<summary type="html">&lt;p&gt;Elias: Best practice and measured results for USB webcams on Recore&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recore can run one or more USB webcams for monitoring prints. This page covers how to choose a camera, how many will work at once, and how to diagnose the common failures.&lt;br /&gt;
&lt;br /&gt;
All figures here were measured on a Recore A5 running &amp;lt;code&amp;gt;rebuild-fluidd&amp;lt;/code&amp;gt; (kernel 6.18.33) in August 2026, with three cameras attached.&lt;br /&gt;
&lt;br /&gt;
== The short version ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Buy a camera that supports MJPEG in hardware.&#039;&#039;&#039; This matters more than resolution, brand or price. A camera without it can cost 20x the USB bandwidth and forces the CPU to compress every frame.&lt;br /&gt;
* &#039;&#039;&#039;Roughly three cameras at 640x480, or two at 1280x720.&#039;&#039;&#039; The limit is USB bandwidth, not the processor.&lt;br /&gt;
* If a camera will not start, check &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt; for &amp;lt;code&amp;gt;Failed to submit URB 0 (-28)&amp;lt;/code&amp;gt; before suspecting anything else.&lt;br /&gt;
&lt;br /&gt;
== Why MJPEG matters ==&lt;br /&gt;
&lt;br /&gt;
USB cameras deliver frames in one of two ways:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;MJPEG&#039;&#039;&#039; (&amp;lt;code&amp;gt;MJPG&amp;lt;/code&amp;gt;) - the camera compresses each frame itself. The Recore copies compressed frames straight to the browser without touching them.&lt;br /&gt;
* &#039;&#039;&#039;Raw&#039;&#039;&#039; (&amp;lt;code&amp;gt;YUYV&amp;lt;/code&amp;gt;) - the camera sends uncompressed pixels. Every frame must then be JPEG-compressed in software on the Recore&#039;s CPU.&lt;br /&gt;
&lt;br /&gt;
A single 640x480 raw frame is 614 kB. The same frame as MJPEG is typically 20-40 kB. That difference applies to both the USB bus and the processor.&lt;br /&gt;
&lt;br /&gt;
Measured on the same board, same bus:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Camera !! MJPEG? !! Result&lt;br /&gt;
|-&lt;br /&gt;
| Logitech BRIO || yes || 1280x720 @ 54 fps, hardware passthrough&lt;br /&gt;
|-&lt;br /&gt;
| AUKEY PC-W1 || yes || 1280x720 @ 30 fps, hardware passthrough&lt;br /&gt;
|-&lt;br /&gt;
| Vimicro &amp;quot;Venus&amp;quot; || &#039;&#039;&#039;no&#039;&#039;&#039; || never obtained USB bandwidth alongside the others, even at 320x240&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The raw-only camera could not be made to work as a third camera at any resolution. It was not scaling its USB bandwidth request with frame size.&lt;br /&gt;
&lt;br /&gt;
=== Checking a camera before buying ===&lt;br /&gt;
&lt;br /&gt;
If you can plug it into any Linux machine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v4l2-ctl --list-formats-ext -d /dev/video0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Look for this line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[1]: &#039;MJPG&#039; (Motion-JPEG, compressed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If only &amp;lt;code&amp;gt;&#039;YUYV&#039;&amp;lt;/code&amp;gt; appears, the camera has no hardware compression. It will work as a single camera at low resolution, but it is a poor choice for a Recore.&lt;br /&gt;
&lt;br /&gt;
Some cameras also list &amp;lt;code&amp;gt;H264&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;HEVC&amp;lt;/code&amp;gt;. These are not currently used - the streaming software (ustreamer) handles MJPEG only - but a camera offering H.264 will almost always offer MJPEG as well.&lt;br /&gt;
&lt;br /&gt;
== How many cameras can run at once ==&lt;br /&gt;
&lt;br /&gt;
The A64 has a &#039;&#039;&#039;single USB host controller&#039;&#039;&#039;, and every USB device on a Recore sits behind one hub connected to it. USB 2.0 reserves bandwidth for cameras up front, when the stream starts, and the total is fixed.&lt;br /&gt;
&lt;br /&gt;
Measured with three MJPEG cameras:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Configuration !! Result&lt;br /&gt;
|-&lt;br /&gt;
| 3 cameras @ 640x480 || &#039;&#039;&#039;all three work&#039;&#039;&#039; - 27, 20 and 30 fps&lt;br /&gt;
|-&lt;br /&gt;
| 3 cameras @ 1280x720 || only the first starts; other two fail immediately&lt;br /&gt;
|-&lt;br /&gt;
| 2 cameras @ 1280x720 || both work - 53 and 30 fps&lt;br /&gt;
|-&lt;br /&gt;
| 2 cameras @ 1920x1080 || first works, second fails&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bandwidth is claimed on a first-come basis. Whichever camera starts first gets what it asks for, and later cameras get whatever is left - which may be nothing.&lt;br /&gt;
&lt;br /&gt;
=== The signature of running out of bandwidth ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ dmesg | grep URB&lt;br /&gt;
uvcvideo 1-1.3:1.1: Failed to submit URB 0 (-28).&lt;br /&gt;
uvcvideo 1-1.1:1.1: Failed to submit URB 0 (-28).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-28&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;ENOSPC&amp;lt;/code&amp;gt;. In this context it does not mean disk space - it means the USB controller could not reserve enough bandwidth for the stream.&lt;br /&gt;
&lt;br /&gt;
This failure is &#039;&#039;&#039;immediate and unrelated to system load&#039;&#039;&#039;. If a camera fails this way it will fail on an idle machine just as reliably. The fix is to lower resolution or frame rate, or to use fewer cameras.&lt;br /&gt;
&lt;br /&gt;
== CPU cost ==&lt;br /&gt;
&lt;br /&gt;
With hardware MJPEG the CPU cost is close to nothing. Three cameras at 640x480, all three being watched in Fluidd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cpu0  9%    cpu1  5%    cpu2  8%    cpu3  6%      (softirq 0% on all cores)&lt;br /&gt;
&lt;br /&gt;
ustreamer processes:  ~3.6% each, about 11% of one core in total&lt;br /&gt;
klipper (python):     7.7%          &amp;lt;- more than all three cameras combined&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Every frame captured reached the browser (&amp;lt;code&amp;gt;queued_fps&amp;lt;/code&amp;gt; equalled &amp;lt;code&amp;gt;captured_fps&amp;lt;/code&amp;gt; on all three streams), so nothing was being dropped.&lt;br /&gt;
&lt;br /&gt;
A raw YUYV camera changes this picture completely, because ustreamer must then run a software JPEG encoder - it starts four worker threads for a single 640x480 stream.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Conclusion:&#039;&#039;&#039; on a Recore, multiple cameras are limited by USB bandwidth, not by the processor. Three cameras left the SoC around 90% idle.&lt;br /&gt;
&lt;br /&gt;
== Low frame rate from a single camera ==&lt;br /&gt;
&lt;br /&gt;
If one camera runs far below its rated frame rate, the cause is usually &#039;&#039;&#039;exposure time&#039;&#039;&#039;, not bandwidth.&lt;br /&gt;
&lt;br /&gt;
In dim light a camera on automatic exposure will lengthen its exposure, and exposure time puts a hard ceiling on frame rate: 140 ms per frame is at most 7 fps, no matter what else is configured.&lt;br /&gt;
&lt;br /&gt;
Measured on a Vimicro camera at 640x480:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting !! Frame rate&lt;br /&gt;
|-&lt;br /&gt;
| auto exposure (default) || 7.2 fps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exposure_time_absolute=100&amp;lt;/code&amp;gt; (~10 ms) || 19.9 fps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exposure_time_absolute=30&amp;lt;/code&amp;gt; (~3 ms) || 30.0 fps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note the trade-off: shorter exposure means a darker image. More light on the subject is the better fix where possible.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The diagnostic that distinguishes the two causes:&#039;&#039;&#039; lower the resolution and re-measure.&lt;br /&gt;
* Frame rate improves roughly in proportion - the limit was &#039;&#039;&#039;bandwidth&#039;&#039;&#039;.&lt;br /&gt;
* Frame rate does not change - the limit is &#039;&#039;&#039;exposure&#039;&#039;&#039; (or something else per-frame).&lt;br /&gt;
&lt;br /&gt;
In the case above, 320x240 gave exactly the same 7 fps as 640x480, which ruled out bandwidth before anything was changed.&lt;br /&gt;
&lt;br /&gt;
Setting exposure manually in crowsnest:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[cam 1]&lt;br /&gt;
v4l2ctl: auto_exposure=1,exposure_time_absolute=100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Use stable device paths ===&lt;br /&gt;
&lt;br /&gt;
Do &#039;&#039;&#039;not&#039;&#039;&#039; use &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/dev/video2&amp;lt;/code&amp;gt; and so on in configuration. These numbers change whenever a camera is added, removed or replugged - on the test board &amp;lt;code&amp;gt;/dev/webcam&amp;lt;/code&amp;gt; moved from &amp;lt;code&amp;gt;video2&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;video5&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;video7&amp;lt;/code&amp;gt; in a single afternoon as cameras were swapped, silently changing which camera was being streamed.&lt;br /&gt;
&lt;br /&gt;
Use the by-id path instead:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ls /dev/v4l/by-id/&lt;br /&gt;
usb-046d_Logitech_BRIO_E76A9283-video-index0&lt;br /&gt;
usb-Sonix_Technology_Co.__Ltd._AUKEY_PC-W1_SN0001-video-index0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;index0&amp;lt;/code&amp;gt; matters: a UVC camera exposes several device nodes and only the first is the capture device. The BRIO exposes four; the rest carry metadata.&lt;br /&gt;
&lt;br /&gt;
=== Example crowsnest configuration ===&lt;br /&gt;
&lt;br /&gt;
Three cameras, all MJPEG, at a resolution where all three fit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[crowsnest]&lt;br /&gt;
log_level: verbose&lt;br /&gt;
rollover_on_start: false&lt;br /&gt;
no_proxy: false&lt;br /&gt;
&lt;br /&gt;
[cam 1]&lt;br /&gt;
mode: ustreamer&lt;br /&gt;
port: 8080&lt;br /&gt;
device: /dev/v4l/by-id/usb-046d_Logitech_BRIO_E76A9283-video-index0&lt;br /&gt;
resolution: 640x480&lt;br /&gt;
max_fps: 30&lt;br /&gt;
custom_flags: --format=MJPEG --drop-same-frames=30&lt;br /&gt;
&lt;br /&gt;
[cam 2]&lt;br /&gt;
mode: ustreamer&lt;br /&gt;
port: 8081&lt;br /&gt;
device: /dev/v4l/by-id/usb-Sonix_Technology_Co.__Ltd._AUKEY_PC-W1_SN0001-video-index0&lt;br /&gt;
resolution: 640x480&lt;br /&gt;
max_fps: 30&lt;br /&gt;
custom_flags: --format=MJPEG --drop-same-frames=30&lt;br /&gt;
&lt;br /&gt;
[cam 3]&lt;br /&gt;
mode: ustreamer&lt;br /&gt;
port: 8082&lt;br /&gt;
device: /dev/v4l/by-id/usb-Linux_Foundation_Webcam_gadget-video-index0&lt;br /&gt;
resolution: 640x480&lt;br /&gt;
max_fps: 30&lt;br /&gt;
custom_flags: --format=MJPEG --drop-same-frames=30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ports map to URLs: 8080 is &amp;lt;code&amp;gt;/webcam/&amp;lt;/code&amp;gt;, 8081 is &amp;lt;code&amp;gt;/webcam2/&amp;lt;/code&amp;gt;, 8082 is &amp;lt;code&amp;gt;/webcam3/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Adding cameras to Fluidd ===&lt;br /&gt;
&lt;br /&gt;
Each camera has to be registered in Moonraker before it appears in the interface. In Fluidd: &#039;&#039;&#039;Settings -&amp;gt; Camera -&amp;gt; Add Camera&#039;&#039;&#039;, then set the stream URL to &amp;lt;code&amp;gt;/webcam2/?action=stream&amp;lt;/code&amp;gt; and the snapshot URL to &amp;lt;code&amp;gt;/webcam2/?action=snapshot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Choose service &#039;&#039;&#039;&amp;quot;MJPEG Stream&amp;quot;&#039;&#039;&#039; rather than &#039;&#039;&#039;&amp;quot;MJPEG Stream (Adaptive)&amp;quot;&#039;&#039;&#039;. In adaptive mode the browser fetches individual snapshots at its own pace instead of consuming the stream, and it throttles to &amp;lt;code&amp;gt;target_fps_idle&amp;lt;/code&amp;gt; - 5 fps by default - whenever the printer is not printing. A camera capturing at 20 fps can appear to run at 2 fps for this reason alone, with nothing wrong on the Recore at all.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! Likely cause !! Check&lt;br /&gt;
|-&lt;br /&gt;
| Second or third camera never starts || USB bandwidth || &amp;lt;code&amp;gt;dmesg &amp;amp;#124; grep URB&amp;lt;/code&amp;gt; for &amp;lt;code&amp;gt;-28&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Low fps, unchanged by lowering resolution || exposure time || &amp;lt;code&amp;gt;v4l2-ctl -d /dev/webcam --list-ctrls&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Low fps, improves when resolution is lowered || USB bandwidth || reduce resolution or camera count&lt;br /&gt;
|-&lt;br /&gt;
| Fluidd shows ~2-5 fps, board reports more || Fluidd adaptive mode || set service to plain &amp;quot;MJPEG Stream&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| High CPU from ustreamer || camera has no MJPEG || &amp;lt;code&amp;gt;v4l2-ctl --list-formats-ext&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Camera works, then stops after replug || device path changed || use &amp;lt;code&amp;gt;/dev/v4l/by-id/&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| All cameras stop after adding one || crowsnest crash - see below || &amp;lt;code&amp;gt;journalctl -u crowsnest&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Useful commands ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# What formats and frame rates does this camera support?&lt;br /&gt;
v4l2-ctl --list-formats-ext -d /dev/video2&lt;br /&gt;
&lt;br /&gt;
# What controls does it have (exposure, brightness, ...)?&lt;br /&gt;
v4l2-ctl --list-ctrls -d /dev/video2&lt;br /&gt;
&lt;br /&gt;
# What is the stream actually doing right now?&lt;br /&gt;
curl -s http://localhost:8080/state&lt;br /&gt;
&lt;br /&gt;
# Which USB devices are attached, and at what speed?&lt;br /&gt;
for d in /sys/bus/usb/devices/[0-9]*-[0-9]*; do&lt;br /&gt;
    echo &amp;quot;$(basename $d) $(cat $d/speed)M $(cat $d/product 2&amp;gt;/dev/null)&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;/state&amp;lt;/code&amp;gt; endpoint is the quickest way to see what is happening:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;encoder&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;HW&amp;quot;}          &amp;lt;- hardware MJPEG, no CPU cost&lt;br /&gt;
&amp;quot;encoder&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;CPU&amp;quot;}         &amp;lt;- software encoding, camera has no MJPEG&lt;br /&gt;
&amp;quot;online&amp;quot;: false                    &amp;lt;- camera not delivering frames at all&lt;br /&gt;
&amp;quot;captured_fps&amp;quot;: 27                 &amp;lt;- what the camera produces&lt;br /&gt;
&amp;quot;queued_fps&amp;quot;: 27                   &amp;lt;- what reaches viewers; lower means drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Known issue: one camera can prevent all others from starting ===&lt;br /&gt;
&lt;br /&gt;
Crowsnest v5.0.11 crashes on startup if any attached camera exposes a V4L2 control without a &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; value, which is legal and occurs on some cameras:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
File &amp;quot;crowsnest/camera/types/uvc.py&amp;quot;, line 72, in get_controls_string&lt;br /&gt;
    line += f&amp;quot; default={data[&#039;default&#039;]}&amp;quot;&lt;br /&gt;
KeyError: &#039;default&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The crash happens before &#039;&#039;&#039;any&#039;&#039;&#039; camera starts, so a single unusual camera takes down every stream on the machine. Changing the log level does not avoid it, because the controls are enumerated regardless.&lt;br /&gt;
&lt;br /&gt;
Workaround, until fixed upstream - in &amp;lt;code&amp;gt;crowsnest/camera/types/uvc.py&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
line += f&amp;quot; default={data.get(&#039;default&#039;, &#039;n/a&#039;)}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Background: why the USB bus is the limit ==&lt;br /&gt;
&lt;br /&gt;
The Allwinner A64 has one EHCI host controller. Every USB device on a Recore - cameras, WiFi dongles, USB storage, USB serial - shares it.&lt;br /&gt;
&lt;br /&gt;
USB 2.0 gives cameras &#039;&#039;isochronous&#039;&#039; transfers: guaranteed, reserved bandwidth, claimed when the stream opens. The specification caps this at 80% of the bus, and the reservation is made up front based on the requested resolution and frame rate. This is why a camera either starts successfully or fails immediately, rather than degrading gradually.&lt;br /&gt;
&lt;br /&gt;
It was previously suspected that USB interrupt handling on a single CPU core was the constraint. Measurement does not support this for cameras:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ grep ehci /proc/interrupts&lt;br /&gt;
 57:   429   992573   0   0   GICv2 106 Level   ehci_hcd:usb1&lt;br /&gt;
      cpu0    cpu1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The interrupt is handled on one core, but with three cameras streaming to three viewers that core was only 5% busy, and softirq time was zero across all cores.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;However&#039;&#039;&#039;, high single-core load &#039;&#039;has&#039;&#039; been measured on Recore when networking runs over a &#039;&#039;&#039;USB WiFi dongle&#039;&#039;&#039; - 73% of one core to receive 1.2 MB/s. In that case the USB completion handling and the entire network stack land on the same core. Cameras over Ethernet do not have this problem, because Ethernet on the A64 is a separate peripheral that does not use USB at all.&lt;br /&gt;
&lt;br /&gt;
So: &#039;&#039;&#039;a Recore with cameras and a USB WiFi dongle is a meaningfully heavier configuration than one using Ethernet.&#039;&#039;&#039; If cameras behave badly over WiFi but well over Ethernet, this is why.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/intelligent-agent/Rebuild/issues/76 Rebuild issue #76] - USB interrupt handling and multi-camera investigation, with measurements&lt;br /&gt;
* [https://docs.mainsail.xyz/crowsnest/ Crowsnest documentation]&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Main_Page&amp;diff=1654</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Main_Page&amp;diff=1654"/>
		<updated>2026-08-23T16:12:20Z</updated>

		<summary type="html">&lt;p&gt;Elias: /* HowTo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#tweekihide:navbar-right}}&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Delta H.jpg]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the documentation for Recore, Manga Screen 1 and 2, Refactor and Toggle hardware and software products developed by made by Intelligent Agent. All software is free and open source. Recore is open schematic hardware and can be conveniently purchased in the store. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mediawiki&amp;quot; style=&amp;quot;width: 100%; vertical-align:top;&amp;quot;&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
* [[Recore A8]]&lt;br /&gt;
* [[Recore A7]]&lt;br /&gt;
* [[Recore A6]]&lt;br /&gt;
* [[Remove A1]]&lt;br /&gt;
* [[Restep A1]]&lt;br /&gt;
* [[Rexfer A0]]&lt;br /&gt;
* [[Relit A0]]&lt;br /&gt;
* [[Revolt A2]]&lt;br /&gt;
* [[Rebase A0]]&lt;br /&gt;
* [[Retool_A2]]&lt;br /&gt;
* [[Renits_A5]] WIP&lt;br /&gt;
* [[Reheat_A0]] WIP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
* [[Rebuild]] Current Linux OS for Recore&lt;br /&gt;
* [[Refactor]] Legacy Linux OS for Recore&lt;br /&gt;
* [[Reflash]] Image to install Refactor/Rebuild&lt;br /&gt;
* [[Mainline Klipper]] How to use the main Klipper release on Recore&lt;br /&gt;
* [[Toggle]] User interface for OctoPrint&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
==HowTo==&lt;br /&gt;
* [[Getting started]]&lt;br /&gt;
* [[Connecting | Connecting to the board]]&lt;br /&gt;
* [[Webcams]]&lt;br /&gt;
* [[Printer_101 | Printer 101]]&lt;br /&gt;
* [[FAQ]]&lt;br /&gt;
* [https://discord.gg/bCnp9H5SB5 Discord]&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
====Old hardware====&lt;br /&gt;
* [[Replicape Rev B]]&lt;br /&gt;
* [[Replicape Rev A]]&lt;br /&gt;
* [[Manga Screen 2]]&lt;br /&gt;
* [[Manga Screen 1]]&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
====Off site====&lt;br /&gt;
* [https://www.klipper3d.org/ Klipper] The &amp;quot;firmware&amp;quot; for Replicape/Recore&lt;br /&gt;
* [https://docs.mainsail.xyz/ Mainsail] A modern and responsive user interface for Klipper&lt;br /&gt;
* [https://octoprint.org/ OctoPrint ] A snappy web interface for 3D printers&lt;br /&gt;
* [https://docs.fluidd.xyz/ Fluidd] Responsive web based user interface for Klipper.&lt;br /&gt;
* [https://klipperscreen.readthedocs.io/en/latest/ KlipperScreen] A touchscreen GUI that interfaces with Klipper&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
====Guides====&lt;br /&gt;
* [[BLTouch | Using BLTouch with Replicape]]&lt;br /&gt;
* [[Adding a Servo | Adding a Servo to Replicape]]&lt;br /&gt;
* [[Adding a Probe for G29/G33]]&lt;br /&gt;
* [[Cartesian | Cartesian configuration guide]]&lt;br /&gt;
* [[Corexy | CoreXY configuration guide]]&lt;br /&gt;
* [[OEM_customization | OEM display customisation on Recore]]&lt;br /&gt;
* [[Voron_2.4 | Voron 2.4 wiring]]&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
* [[ Dev Team Bios | Development Team ]]&lt;br /&gt;
* [[Beta Testing | Running the Develop Branch on Your Printer]]&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Contributing ==&lt;br /&gt;
* [[Special:CreateAccount | Add new users to this wiki]]&lt;br /&gt;
* [[Formatting | Formatting on this wiki]]&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
== Legacy Information ==&lt;br /&gt;
* [[Thing]]&lt;br /&gt;
* [[Thing Delta]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1653</id>
		<title>Reheat A0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1653"/>
		<updated>2026-06-16T17:19:19Z</updated>

		<summary type="html">&lt;p&gt;Elias: /* Config tool */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reheat is a 6 output heater board with temperature sensors and fans for multi material printing.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reheat A0.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
* [https://github.com/intelligent-agent/Recore/blob/master/Schematics/Reheat_A0.pdf Reheat A0 Schematics (PDF)]&lt;br /&gt;
==Rewire layout and config==&lt;br /&gt;
* [https://rewire.iagent.no/#cfg=zH4sIAAAAAAAAA5VWy24bMQy85ysE5CqgepCi5FuLOkgvTpAHelwYyCY14NiG46JtDv32crUrU0bieHuyPZwhhxS13vO_atv-Wmxb9WU93z40N-2Pdr5rPhv1c_GgPKr5TkV0OjqjtuudMmfne8X17X3PCh3L-aDR4RvWbP36umybr9v503r1uPyTJWA7SYhGB-NHSlwnsRZQY4KRGp81LjnWjLUGuWcPLIkjJXlMFiD-R5k8tBTp3TIX81UD5vm5p9KQ3mmIPdfG4-yYR0tGwzCmj8gpN-sCZz5JRtNPM3TsdJJt-_NyxEbsSXY-3RTgSIvT1UPzsltvenI-1miiTsFlsqPjZBhce2b3rpNRj8vFRtmjmn7vrdfWgDlZIfRs1JbbPcmmnm05t7En2XGf2xCeZPfHaSM7gfgOe9auN4vf7bJ5Wayelm0WhXKsqJPHcQMK_eE6DF0XNFLkBhF0Y4WRouEKYzddF0aKoLIX3VtRloCdXBp-xk0uKwwK5gQLBfOCuYKBYL5gKBgWLNR17zJ2d1B3wA7qDthB3QE7qDtgB3UHrKobJxcZu6jqUsGEh6Zgkq_7BXynOXKAeb65NQapaKUP9JPpbQant1IZSdCKi4JK1xgFlb4xCCpOMQkaaq9c3H2aTa-aq3seTTCT7vu3mXhHqHyK0WArWNjBCZwErXJEQasJUO3p-vsNwyF_ZnxTbyVnc5pSKhHZTUUJNaEvEdlQfoZaTZZKRPZUWZNIh7gvJOvaXZWoyccSkq3l_x1-zlIEsVeWVxEmjgSxV1ZYJX7qEzixVxZZdY-xOiT7zCb4FaKyLmutrI_A_ZL4K9utLKLV0ey7kiXnI-J-gy0RWXXO142C_6KsTZyYcOBUq892IOjgOw6_DJAveaqrwN1EHg75KjTcCJXAa3L7s5N7oYgSv_aASl1aMqKtt0F5Z7R10Z_9A9wE4zCjCQAA Reheat A0 in Rewire]&lt;br /&gt;
&lt;br /&gt;
==pin description==&lt;br /&gt;
This is temporary while waiting for a proper pinout&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reheat A0 pinout.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Wire diagram==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Rewire-Reheat_A0.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
* RP2354B microcontroller (ARM Cortex-M33, 150 MHz)&lt;br /&gt;
* 6x heater outputs (24 V, MOSFET-switched)&lt;br /&gt;
* 6x fan outputs (24 V PWM) with tachometer inputs&lt;br /&gt;
* 6x thermistor/temperature sensor inputs&lt;br /&gt;
** Supports: NTC 10K, NTC 100K, PT100, PT1000, Type K thermocouple&lt;br /&gt;
** Jumper-selectable per channel&lt;br /&gt;
* 12x endstop inputs (5 V tolerant, TVS-protected)&lt;br /&gt;
** ENDSTOP-12 supports a bidirectional signal (e.g. filament encoder)&lt;br /&gt;
* USB-C interface (USB 2.0)&lt;br /&gt;
* 24 V power input with onboard 5 V (3 A) and 3.3 V regulation&lt;br /&gt;
* Overcurrent detection on fan bus&lt;br /&gt;
&lt;br /&gt;
==Pinout==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! GPIO !! Signal !! Connector&lt;br /&gt;
|-&lt;br /&gt;
| GPIO0 || HEATER-1 || J2&lt;br /&gt;
|-&lt;br /&gt;
| GPIO1 || HEATER-2 || J3&lt;br /&gt;
|-&lt;br /&gt;
| GPIO2 || HEATER-3 || J6&lt;br /&gt;
|-&lt;br /&gt;
| GPIO3 || HEATER-4 || J11&lt;br /&gt;
|-&lt;br /&gt;
| GPIO4 || HEATER-5 || J12&lt;br /&gt;
|-&lt;br /&gt;
| GPIO5 || HEATER-6 || J13&lt;br /&gt;
|-&lt;br /&gt;
| GPIO6 || FAN-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO7 || FAN-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO8 || FAN-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO9 || FAN-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO10 || FAN-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO11 || FAN-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO12 || TACH-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO13 || TACH-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO14 || TACH-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO15 || TACH-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO16 || TACH-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO17 || TACH-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO18 || ENDSTOP-1 || J14&lt;br /&gt;
|-&lt;br /&gt;
| GPIO19 || ENDSTOP-2 || J15&lt;br /&gt;
|-&lt;br /&gt;
| GPIO20 || ENDSTOP-3 || J16&lt;br /&gt;
|-&lt;br /&gt;
| GPIO21 || ENDSTOP-4 || J17&lt;br /&gt;
|-&lt;br /&gt;
| GPIO22 || ENDSTOP-5 || J18&lt;br /&gt;
|-&lt;br /&gt;
| GPIO23 || ENDSTOP-6 || J19&lt;br /&gt;
|-&lt;br /&gt;
| GPIO24 || ENDSTOP-7 || J20&lt;br /&gt;
|-&lt;br /&gt;
| GPIO25 || ENDSTOP-8 || J21&lt;br /&gt;
|-&lt;br /&gt;
| GPIO26 || ENDSTOP-9 || J22&lt;br /&gt;
|-&lt;br /&gt;
| GPIO27 || ENDSTOP-10 || J23&lt;br /&gt;
|-&lt;br /&gt;
| GPIO28 || ENDSTOP-11 || J24&lt;br /&gt;
|-&lt;br /&gt;
| GPIO29 || ENDSTOP-12 || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO30 || MUX-S0 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO31 || MUX-S1 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO32 || MUX-S2 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO33 || PWM-GAIN || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO34 || PWM-OFFSET || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO35 || PWM-CURRENT || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO36 || EN-PULLUP || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO37 || ENDSTOP-12-DIR || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO38 || FAN-OC (overcurrent) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO40 / ADC0 || THERM-1 || J27&lt;br /&gt;
|-&lt;br /&gt;
| GPIO41 / ADC1 || THERM-2 || J28&lt;br /&gt;
|-&lt;br /&gt;
| GPIO42 / ADC2 || THERM-3 || J29&lt;br /&gt;
|-&lt;br /&gt;
| GPIO43 / ADC3 || THERM-4 || J30&lt;br /&gt;
|-&lt;br /&gt;
| GPIO44 / ADC4 || THERM-5 || J31&lt;br /&gt;
|-&lt;br /&gt;
| GPIO45 / ADC5 || THERM-6 || J32&lt;br /&gt;
|-&lt;br /&gt;
| GPIO46 / ADC6 || ADC (MUX output) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO47 / ADC7 || CURRENT sense || Internal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Hardware connections==&lt;br /&gt;
&lt;br /&gt;
===Power===&lt;br /&gt;
The board takes 24 V DC on a 4-pin connector (J33). A fuse (F1) and a 2 mΩ current-sense resistor (R98) protect the input. Onboard regulators provide +5 V (TPS54302 buck converter, 3 A) and +3.3 V (AMS1117-3.3, 1 A) for logic and sensor pull-ups.&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
Six heater outputs use 2SK3019 N-channel MOSFETs driven from GPIO0–GPIO5. Each output has a 2-pin female connector and a flyback Schottky diode. The heater voltage is 24 V.&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
Six fan outputs (GPIO6–GPIO11) use N-channel MOSFETs with a 24 V supply. Each has a 3-pin connector (V+, GND, TACH). Tachometer signals are read on GPIO12–GPIO17. An LM393 comparator monitors the fan bus for overcurrent and signals FAN-OC on GPIO38.&lt;br /&gt;
&lt;br /&gt;
===Thermistors===&lt;br /&gt;
Each thermistor channel has a 3-pin connector (J27–J32) with a jumper (JP1–JP6) to select the measurement mode. An analog MUX (CD4051) and op-amp signal conditioning chain feed the ADC inputs (GPIO40–GPIO45). The signal conditioning supports:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sensor type !! Measurement method&lt;br /&gt;
|-&lt;br /&gt;
| NTC 10K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| NTC 100K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| PT100 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| PT1000 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| Type K thermocouple || ×101 gain amplifier, buffered&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For NTC thermistor or PT1000 measurements, close jumpers JP1–JP6 to connect the 4.7 K pull-up resistors. With the jumpers closed, ADC0–ADC5 (GPIO40–GPIO45) can be used as standard thermistor inputs with a 4.7 K pull-up to 3.3 V, without the need for any additional signal conditioning.&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;br /&gt;
# VUSB is unconnected, so the board requires 24 V power to operate even when connected over USB.&lt;br /&gt;
&lt;br /&gt;
==Klipper configuration==&lt;br /&gt;
&lt;br /&gt;
The Reheat A0 connects to the host over USB and is configured as an MCU in Klipper. Find the serial path with &amp;lt;code&amp;gt;ls /dev/serial/by-id/&amp;lt;/code&amp;gt; and add to &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_XXXXXXXXXXXX-if00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[heater_generic heater1]&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio40&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio41&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[fan_generic fan1]&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
&lt;br /&gt;
[fan_generic fan2]&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Endstops===&lt;br /&gt;
Endstop pins can be referenced in the relevant stepper sections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[stepper_x]&lt;br /&gt;
endstop_pin: reheat:gpio18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Flashing Klipper==&lt;br /&gt;
&lt;br /&gt;
# Put the board in BOOTSEL mode: hold the BOOT button while plugging in USB (or hold BOOT, press RESET, then release BOOT).&lt;br /&gt;
# Build and flash from the Klipper source directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make menuconfig&lt;br /&gt;
# Processor model: rp2350&lt;br /&gt;
# Bootloader offset: No bootloader&lt;br /&gt;
# Communication interface: USBSERIAL&lt;br /&gt;
make&lt;br /&gt;
picotool load out/klipper.uf2 --force&lt;br /&gt;
picotool reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The board will reboot and appear as &amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; (or similar).&lt;br /&gt;
&lt;br /&gt;
==Full config file==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  Reheat_A0.cfg  —  Complete Klipper configuration for the Reheat A0&lt;br /&gt;
#  MCU: RP2354B (RP2350 family, ARM Cortex-M33, 150 MHz, 48 GPIO, 8 ADC)&lt;br /&gt;
#  Source: https://wiki.iagent.no/wiki/Reheat_A0&lt;br /&gt;
#&lt;br /&gt;
#  Board functions:&lt;br /&gt;
#    6x heater outputs (24V MOSFET)        GPIO0..GPIO5&lt;br /&gt;
#    6x fan outputs (24V PWM)              GPIO6..GPIO11&lt;br /&gt;
#    6x fan tachometer inputs              GPIO12..GPIO17&lt;br /&gt;
#    12x endstop inputs (5V tolerant)      GPIO18..GPIO29 (+ GPIO37 dir)&lt;br /&gt;
#    6x thermistor/temperature ADC inputs  GPIO40..GPIO45 (ADC0..ADC5)&lt;br /&gt;
#    analog mux + PWM bias control         GPIO30..GPIO35&lt;br /&gt;
#    endstop pull-up enable                GPIO36&lt;br /&gt;
#    fan over-current flag                 GPIO38&lt;br /&gt;
#    ADC mux output / input-current sense  GPIO46/GPIO47 (ADC6/ADC7)&lt;br /&gt;
#&lt;br /&gt;
#  Each fan is paired with its matching heater (FAN1&amp;lt;-&amp;gt;HEATER1, ...).&lt;br /&gt;
#&lt;br /&gt;
#  Build firmware:  RP2350 (ARM) processor, USB communication.&lt;br /&gt;
#  Flash:  hold BOOT while plugging in USB-C to enter BOOTSEL.&lt;br /&gt;
#  ERRATA: RUN pin is hardwired -&amp;gt; Klipper cannot software-reset the MCU&lt;br /&gt;
#          (re-enter BOOTSEL manually to reflash). USB DP/DM are swapped.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
#  MCU&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
# USB-C, enumerates over USB. Use the stable by-id path:&lt;br /&gt;
#   ls /dev/serial/by-id/*&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_21745F8FD0431B3A-if00&lt;br /&gt;
restart_method: command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
#  Endstop pull-up enable (GPIO36)&lt;br /&gt;
#  Drive high at boot so the 12 endstop inputs read correctly.&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
[static_digital_output endstop_pullup_enable]&lt;br /&gt;
pins: reheat:gpio36&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  HEATERS  (24V MOSFET outputs, paired with ADC thermistors)&lt;br /&gt;
#  Sensor types supported by the board: NTC 10K, NTC 100K, PT100,&lt;br /&gt;
#  PT1000, Type-K thermocouple. NTC 100K -&amp;gt; &amp;quot;Generic 3950&amp;quot;.&lt;br /&gt;
#  Pairing of heater&amp;lt;-&amp;gt;thermistor is arbitrary; reassign as needed.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater1]                # HEATER1 / THERM1&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_pin: reheat:gpio40               # ADC0&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]                # HEATER2 / THERM2&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_pin: reheat:gpio41               # ADC1&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater3]                # HEATER3 / THERM3&lt;br /&gt;
heater_pin: reheat:gpio2&lt;br /&gt;
sensor_pin: reheat:gpio42               # ADC2&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater4]                # HEATER4 / THERM4&lt;br /&gt;
heater_pin: reheat:gpio3&lt;br /&gt;
sensor_pin: reheat:gpio43               # ADC3&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater5]                # HEATER5 / THERM5&lt;br /&gt;
heater_pin: reheat:gpio4&lt;br /&gt;
sensor_pin: reheat:gpio44               # ADC4&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater6]                # HEATER6 / THERM6&lt;br /&gt;
heater_pin: reheat:gpio5&lt;br /&gt;
sensor_pin: reheat:gpio45               # ADC5&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  FANS  (24V PWM)&lt;br /&gt;
#  Each fan follows its matching heater (FAN1&amp;lt;-&amp;gt;HEATER1, FAN2&amp;lt;-&amp;gt;HEATER2,&lt;br /&gt;
#  ... FAN6&amp;lt;-&amp;gt;HEATER6) and turns on when that heater is active.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan1]                       # FAN1 -&amp;gt; HEATER1&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
heater: heater1&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan2]                       # FAN2 -&amp;gt; HEATER2&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
heater: heater2&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan3]                       # FAN3 -&amp;gt; HEATER3&lt;br /&gt;
pin: reheat:gpio8&lt;br /&gt;
heater: heater3&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan4]                       # FAN4 -&amp;gt; HEATER4&lt;br /&gt;
pin: reheat:gpio9&lt;br /&gt;
heater: heater4&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan5]                       # FAN5 -&amp;gt; HEATER5&lt;br /&gt;
pin: reheat:gpio10&lt;br /&gt;
heater: heater5&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan6]                       # FAN6 -&amp;gt; HEATER6&lt;br /&gt;
pin: reheat:gpio11&lt;br /&gt;
heater: heater6&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  ENDSTOPS  (11 inputs, 5V tolerant)  +  NeoPixel on EP12&lt;br /&gt;
#  This board has no stepper drivers, so endstops are exposed as&lt;br /&gt;
#  runtime-readable buttons. To use one as a homing endstop instead,&lt;br /&gt;
#  reference its pin from a stepper on your motion board, e.g.:&lt;br /&gt;
#     [stepper_x]&lt;br /&gt;
#     endstop_pin: reheat:gpio18&lt;br /&gt;
#  Endstop 12 (GPIO29) is wired to a NeoPixel data line (see below).&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
# Each endstop is exposed as a button so its state is queryable. The&lt;br /&gt;
# press/release gcode is intentionally empty (just reads the input).&lt;br /&gt;
[gcode_button endstop1]&lt;br /&gt;
pin: reheat:gpio18&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop2]&lt;br /&gt;
pin: reheat:gpio19&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop3]&lt;br /&gt;
pin: reheat:gpio20&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop4]&lt;br /&gt;
pin: reheat:gpio21&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop5]&lt;br /&gt;
pin: reheat:gpio22&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop6]&lt;br /&gt;
pin: reheat:gpio23&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop7]&lt;br /&gt;
pin: reheat:gpio24&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop8]&lt;br /&gt;
pin: reheat:gpio25&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop9]&lt;br /&gt;
pin: reheat:gpio26&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop10]&lt;br /&gt;
pin: reheat:gpio27&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop11]&lt;br /&gt;
pin: reheat:gpio28&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
# NeoPixel on the EP12 connector (GPIO29 data line).&lt;br /&gt;
[neopixel reheat_led]&lt;br /&gt;
pin: reheat:gpio29&lt;br /&gt;
chain_count: 1&lt;br /&gt;
color_order: GRB&lt;br /&gt;
initial_RED: 0.0&lt;br /&gt;
initial_GREEN: 0.0&lt;br /&gt;
initial_BLUE: 0.0&lt;br /&gt;
&lt;br /&gt;
# EP12 direction line (GPIO37) — drive the level-shifter towards the&lt;br /&gt;
# NeoPixel (output direction).&lt;br /&gt;
[static_digital_output endstop12_dir]&lt;br /&gt;
pins: reheat:gpio37&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  ANALOG MUX + PWM BIAS  (board-internal sensor front-end)&lt;br /&gt;
#  MUX_S0..S2 select one of the multiplexed analog channels, read back&lt;br /&gt;
#  on ADC_MUX (GPIO46/ADC6). PWM_GAIN/OFFSET/CURRENT set the analog&lt;br /&gt;
#  amplifier bias used for PT100/thermocouple measurement.&lt;br /&gt;
#  These are exposed as raw pins; exact scaling is board-specific.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s0]&lt;br /&gt;
pin: reheat:gpio30&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s1]&lt;br /&gt;
pin: reheat:gpio31&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s2]&lt;br /&gt;
pin: reheat:gpio32&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_gain]&lt;br /&gt;
pin: reheat:gpio33&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_offset]&lt;br /&gt;
pin: reheat:gpio34&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_current]&lt;br /&gt;
pin: reheat:gpio35&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  PROTECTION / MONITORING&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
# Fan over-current flag (GPIO38) — reads active on an over-current event.&lt;br /&gt;
[gcode_button fan_overcurrent]&lt;br /&gt;
pin: reheat:gpio38&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
# Input-current sense (GPIO47 / ADC7) via the 2 mΩ shunt.&lt;br /&gt;
# Scale: 1 A = 0.1 V  -&amp;gt;  3.3 V full-scale = 33 A. The reported&lt;br /&gt;
# &amp;quot;temperature&amp;quot; value is therefore the input current in amps.&lt;br /&gt;
[adc_temperature reheat_current]&lt;br /&gt;
temperature1: 0&lt;br /&gt;
voltage1: 0&lt;br /&gt;
temperature2: 33&lt;br /&gt;
voltage2: 3.3&lt;br /&gt;
&lt;br /&gt;
[temperature_sensor input_current]&lt;br /&gt;
adc_voltage: 3.3&lt;br /&gt;
sensor_pin: reheat:gpio47&lt;br /&gt;
sensor_type: reheat_current&lt;br /&gt;
min_temp: -1&lt;br /&gt;
max_temp: 40&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]]&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Voron_2.4&amp;diff=1652</id>
		<title>Voron 2.4</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Voron_2.4&amp;diff=1652"/>
		<updated>2026-06-16T08:36:31Z</updated>

		<summary type="html">&lt;p&gt;Elias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Using Recore A8 in a Voron 2.4&lt;br /&gt;
&lt;br /&gt;
===Wire diagram===&lt;br /&gt;
This shows a logical representation of the wiring of the board.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Voron-wire-diagram.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Rewire interactive wire diagram===&lt;br /&gt;
[https://rewire.iagent.no/#cfg=zH4sIAAAAAAAAA41Wy27bOBTdz1cI6JZAycu3ds3UQYICSRDV06XgxEwjwLEMWW4ei377XJKSRdnSTBdh5MtzeF_nUvr0O2vca9W47KJeNevy3j3WjSu_mOxQrTOWrdrMSkaUkVlTtxn969MZoa3rTfkFAgE8gRnFieYmMnDduMy9tc1h7ZoJ_t5t1z2fB77QQLS0sx5_1Zu2Z4jIYJZYUGeMonW7nWsCUkYkcMJon04Mbh9R5VvCXGBQ-7beBaqKaVFJjBaBCXrOjQ5YCcq74VNu3ufcmEClmhNpzFkul6ttebGpX_EEQV9eAsMGhgZNrIjZY5TR227VtAn7zm3aKqUy6rlAsR5KjOLcReiJ64EYVMGskUenHfG5bn0vn1bbmdqwXh9s6NasPm7qj4-NK782q5_19mnzHk-ICtFMEqXp_5xwvV0fHtvqlyt3Tf3gSib7FKJqDNNECnZW6RtX76o3tyn31fYnHh0oUT5WKiyX7hw_bapdxuaSjaphyswq4WNOCSyqiElKpIX_lDULqjEi6E1PepmN0Mb5FvNUmKECjVrFTiJXTXJ5wr1yq9atywf8A6D_xDOikPzoqomhuneb1XtZFPcRHKSjJRCp6ORsqF6gEDRigBIGUqShPfgLZJYWRcEElgOE_XNeUIbV2rtjY0k-rw779mQgptQFnVZA4OifX7WFQxnX2_JbtXUvq7Z63EdWVAkoIEKds-6KZYQFhQDniKIThT7ibMQJosVUQ37gIJZyV23jVR0UoIREAZyP0AmWxeapP8GGRvtXyBT2b8bLp8M-Vo3HywDAx3D-uvBCK_evVfv4HOGxwZSHgRzgAczzZXFR3i6_0wzC4_XNsCnyQmUyLwaLyheFRy4KlqJ0plOUCSiGqzjaIL9kmc0vaWK5QxDFNQUBymGM8kdBejzkV2jiuB5N-Ctk8D0xifz65mufmn9MU4P8ZnEbN5kMz-kuywuOF1nqlOljUvTz6WksBGlG-LxgeNOcmABvkLHpimPD0lSA-VRw4QnqEnPgaVmYrxSIExPDqRybFgV87jLFTTWRaWj6reiUMKqRyZcMBY9rGl1nG0W8pD6LxMaPtjEXUOgjrultCc72NhjZol8YcWnwNOZG2wh39-Pe19T_S6QfrN1uekKwixO0CAHw1Jm30WAb4yAEIEY2HoJPbLxPMtp2k6OIIsR7SeDHDbNMEW168DADCMGLEL87u51Buzg2zF89wIatTqaZseFS0sNOp1acSOq3BB22OtXiZDJ8udDEVa_LTFv8tjGDo16dGCMYYnVC6USaGQ7EWpH5z1LiQz3WIe0LHiAs0fjiVZIT_A7pCzBqU6YM3m6C9vkk3fLnY0JAk62uaf5FzokxyU7XpkwDI4DH_QuZwjoIKQwAAA Rewire diagram]&lt;br /&gt;
===Layout===&lt;br /&gt;
This shows the layout of the wiring of the board.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Voron-2.4-layout-small.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3D models ===&lt;br /&gt;
The 3D models used to organize the cables are available here as step files and FreeCad source files.&lt;br /&gt;
All the files are available from the Recore public repository: &amp;lt;br&amp;gt;&lt;br /&gt;
[https://github.com/intelligent-agent/Recore/tree/master/3D-files/Voron-2.4/Clamps https://github.com/intelligent-agent/Recore/tree/master/3D-files/Voron-2.4/Clamps]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Clamps-1.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Power supplies ===&lt;br /&gt;
24 V PSU: LRS-200-24&amp;lt;br&amp;gt;&lt;br /&gt;
48 V PSU: LRS-2002N-48&lt;br /&gt;
&lt;br /&gt;
=== Peripherals ===&lt;br /&gt;
&lt;br /&gt;
Control board: [[Recore A8]]&amp;lt;br&amp;gt;&lt;br /&gt;
Extruder control board: [[Retool A2]]&amp;lt;br&amp;gt;&lt;br /&gt;
Bed light: [[Relit A0]]&amp;lt;br&amp;gt;&lt;br /&gt;
Screen: [[Renits A5]]&amp;lt;br&amp;gt;&lt;br /&gt;
Camera: Logitech C270&amp;lt;br&amp;gt;&lt;br /&gt;
Debug port: MH USB to TTL&amp;lt;br&amp;gt;&lt;br /&gt;
On-off button: LP0115CCKW015CB&lt;br /&gt;
&lt;br /&gt;
=== Wires ===&lt;br /&gt;
Black wire for 24 V and 48 V: 1007-16-1-2000-001-1-TS&amp;lt;br&amp;gt;&lt;br /&gt;
Red wire for 24 V and 48 V: 1007-16-1-2000-004-1-TS&amp;lt;br&amp;gt;&lt;br /&gt;
4 conductor black multicore for steppers: Molex 1552200064&amp;lt;br&amp;gt;&lt;br /&gt;
2 conductor black multicore fo4r fans: Tensility 30-00695&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Wire gauges ====&lt;br /&gt;
Cabling from PSU to board: 16 AWG/1.31 mm² (10.0 A)&amp;lt;br&amp;gt;&lt;br /&gt;
For steppers on the control board: Minumum 24 AWG/0.2 mm² (3.0A): &amp;lt;br&amp;gt;&lt;br /&gt;
For steppers on Revolt: Minumum 22 AWG/0.33 mm² (2.0A): 1552200064&amp;lt;br&amp;gt;&lt;br /&gt;
For cabling for fans: 26 AWG/0.13 mm² (1.0 A)&amp;lt;br&amp;gt;&lt;br /&gt;
For 220 V: 22 AWG&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Connectors====&lt;br /&gt;
Cable lugs: Wurth elektronik 55804025&amp;lt;br&amp;gt; &lt;br /&gt;
USB connector for debug: 1131380000&amp;lt;br&amp;gt;&lt;br /&gt;
Quick connect for button: TE 60118-1&amp;lt;br&amp;gt;&lt;br /&gt;
Ferrules for 220 V: Weidmüller 0542500000&lt;br /&gt;
Ferrules for 24 and 48 V: Weidmüller 0372700000&lt;br /&gt;
&lt;br /&gt;
==== Wire lengths ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Function !! Length (cm) !! Gauge (AWG/mm²) !! Conductors !! Diameter (mm) !! Manufacturer !! MPN !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Stepper X ||  || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Y ||  || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Z (S3) || 9 || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Z1 (S0) || 56 || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Z2 (S1) || 63 || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Z3 (S2) || 35 || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Endstop X &amp;amp; Y ||  || 28 || 4 || 3.78 || Tensility || 30-03409 || &lt;br /&gt;
|-&lt;br /&gt;
| Endstop Z ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Fan F0 ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Fan F1 ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Fan F2 ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Fan F3 ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Inductive probe ||  || 24 || 3 || 3.4 || Tensility || 30-00006 || &lt;br /&gt;
|-&lt;br /&gt;
| Relit ||  || 24 || 3 || 3.4 || Tensility || 30-00006 || &lt;br /&gt;
|-&lt;br /&gt;
| PSU 24 V ||  || 16 || 4x1 || 2.31 || CNC Tech || 1007-16-1-2000-001-1-TS || &lt;br /&gt;
|-&lt;br /&gt;
| PSU 48 V || 8 || 16 || 2x1 || 2.31 || CNC Tech || 1007-16-1-2000-001-1-TS || &lt;br /&gt;
|-&lt;br /&gt;
| Control SSR || 24 || 26 || 2x1 || 2.31 || CNC Tech || 1007-16-1-2000-001-1-TS || &lt;br /&gt;
|-&lt;br /&gt;
| Thermistor bed ||  || 26 || 2 ||  ||  ||  || Included&lt;br /&gt;
|-&lt;br /&gt;
| 220 V to PSU 24 V || 20 || 18 || 3x1 || 2.8 || Qualtek || 311007-01 || &lt;br /&gt;
|-&lt;br /&gt;
| 220 V to PSU 48 V || 30 || 18 || 3x1 || 2.8 || Qualtek || 311007-01 || &lt;br /&gt;
|-&lt;br /&gt;
| 220 V to SSR  || 20 || 18 || 1 || 2.8 || Qualtek || 311007-01 || &lt;br /&gt;
|-&lt;br /&gt;
| 220 V to bed ||  ||  || 2 ||  ||  ||  || Included&lt;br /&gt;
|-&lt;br /&gt;
| USB to connector || 100 ||  || 4 ||  || Same Sky || CBL-UA-UA-10BP || &lt;br /&gt;
|-&lt;br /&gt;
| USB to Screen || 50 ||  || 4 ||  || Assmann || A-USB31C-20A-050A || &lt;br /&gt;
|-&lt;br /&gt;
| USB to camera ||  ||  || 4 || 3 ||  ||  || Included&lt;br /&gt;
|-&lt;br /&gt;
| USB to Resend || 100 ||  || 24 || 5 || GlobTek, Inc. || A-USB32C1-32C1-150-B || &lt;br /&gt;
|-&lt;br /&gt;
| USB to Remote || 100 ||  || 24 || 5 || GlobTek, Inc. || USBCM31EM1M0USBCMMMBKR || &lt;br /&gt;
|-&lt;br /&gt;
| RJ45 to connector || 60.1 ||  || 8 ||  || Amphenol ICC || RJE1Y22610152401 || &lt;br /&gt;
|-&lt;br /&gt;
| HDMI to Screen || 50 ||  || 19 || 6 || Phoenix Contact || 1332078 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Connections===&lt;br /&gt;
====XY steppers (2x)====&lt;br /&gt;
JST XH &amp;lt;-&amp;gt; JST PH&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Connectors Stepper XY.png]]&lt;br /&gt;
&lt;br /&gt;
====Z steppers (4x)====&lt;br /&gt;
JST PH &amp;lt;-&amp;gt; JST PH&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Connectors Stepper Z.png]]&lt;br /&gt;
&lt;br /&gt;
====XY Endstops====&lt;br /&gt;
JST PH &amp;lt;-&amp;gt; JST XH&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Connectors Endstops XY.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
If using the [[Retool A2]], this is not needed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====DBG Header====&lt;br /&gt;
[[File:Connectors Button Debug.png]]&lt;br /&gt;
&lt;br /&gt;
====Relit A1====&lt;br /&gt;
[[File:Connectors Relit.png]]&lt;br /&gt;
&lt;br /&gt;
====24 V and 48 V====&lt;br /&gt;
[[File:Connectors 24V.png]]&lt;br /&gt;
====220 V====&lt;br /&gt;
[[File:Connectors 220V.png]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
Cable cutter and stripper: Klein tools 11046&amp;lt;br&amp;gt;&lt;br /&gt;
Ratchet crimper frame: Klein tools VDV200-010&amp;lt;br&amp;gt;&lt;br /&gt;
Ferrule crimper die Set: Klein tools VDV205-039&amp;lt;br&amp;gt;&lt;br /&gt;
Lugs crimper dies set: Klein tools VDV205-044&amp;lt;br&amp;gt;&lt;br /&gt;
JST crimping tool: Engineer PA-09&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Tools small.jpg]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Voron_2.4&amp;diff=1651</id>
		<title>Voron 2.4</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Voron_2.4&amp;diff=1651"/>
		<updated>2026-06-16T06:08:03Z</updated>

		<summary type="html">&lt;p&gt;Elias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Using Recore A8 in a Voron 2.4&lt;br /&gt;
&lt;br /&gt;
===Wire diagram===&lt;br /&gt;
This shows a logical representation of the wiring of the board.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Voron-wire-diagram.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[https://rewire.iagent.no/#cfg=zH4sIAAAAAAAAA41Wy27bOBTdz1cI6JZAycu3ds3UQYICSRDV06XgxEwjwLEMWW4ei377XJKSRdnSTBdh5MtzeF_nUvr0O2vca9W47KJeNevy3j3WjSu_mOxQrTOWrdrMSkaUkVlTtxn969MZoa3rTfkFAgE8gRnFieYmMnDduMy9tc1h7ZoJ_t5t1z2fB77QQLS0sx5_1Zu2Z4jIYJZYUGeMonW7nWsCUkYkcMJon04Mbh9R5VvCXGBQ-7beBaqKaVFJjBaBCXrOjQ5YCcq74VNu3ufcmEClmhNpzFkul6ttebGpX_EEQV9eAsMGhgZNrIjZY5TR227VtAn7zm3aKqUy6rlAsR5KjOLcReiJ64EYVMGskUenHfG5bn0vn1bbmdqwXh9s6NasPm7qj4-NK782q5_19mnzHk-ICtFMEqXp_5xwvV0fHtvqlyt3Tf3gSib7FKJqDNNECnZW6RtX76o3tyn31fYnHh0oUT5WKiyX7hw_bapdxuaSjaphyswq4WNOCSyqiElKpIX_lDULqjEi6E1PepmN0Mb5FvNUmKECjVrFTiJXTXJ5wr1yq9atywf8A6D_xDOikPzoqomhuneb1XtZFPcRHKSjJRCp6ORsqF6gEDRigBIGUqShPfgLZJYWRcEElgOE_XNeUIbV2rtjY0k-rw779mQgptQFnVZA4OifX7WFQxnX2_JbtXUvq7Z63EdWVAkoIEKds-6KZYQFhQDniKIThT7ibMQJosVUQ37gIJZyV23jVR0UoIREAZyP0AmWxeapP8GGRvtXyBT2b8bLp8M-Vo3HywDAx3D-uvBCK_evVfv4HOGxwZSHgRzgAczzZXFR3i6_0wzC4_XNsCnyQmUyLwaLyheFRy4KlqJ0plOUCSiGqzjaIL9kmc0vaWK5QxDFNQUBymGM8kdBejzkV2jiuB5N-Ctk8D0xifz65mufmn9MU4P8ZnEbN5kMz-kuywuOF1nqlOljUvTz6WksBGlG-LxgeNOcmABvkLHpimPD0lSA-VRw4QnqEnPgaVmYrxSIExPDqRybFgV87jLFTTWRaWj6reiUMKqRyZcMBY9rGl1nG0W8pD6LxMaPtjEXUOgjrultCc72NhjZol8YcWnwNOZG2wh39-Pe19T_S6QfrN1uekKwixO0CAHw1Jm30WAb4yAEIEY2HoJPbLxPMtp2k6OIIsR7SeDHDbNMEW168DADCMGLEL87u51Buzg2zF89wIatTqaZseFS0sNOp1acSOq3BB22OtXiZDJ8udDEVa_LTFv8tjGDo16dGCMYYnVC6USaGQ7EWpH5z1LiQz3WIe0LHiAs0fjiVZIT_A7pCzBqU6YM3m6C9vkk3fLnY0JAk62uaf5FzokxyU7XpkwDI4DH_QuZwjoIKQwAAA Rewire diagram]&lt;br /&gt;
===Layout===&lt;br /&gt;
This shows the layout of the wiring of the board.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Voron-2.4-layout-small.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3D models ===&lt;br /&gt;
The 3D models used to organize the cables are available here as step files and FreeCad source files.&lt;br /&gt;
All the files are available from the Recore public repository: &amp;lt;br&amp;gt;&lt;br /&gt;
[https://github.com/intelligent-agent/Recore/tree/master/3D-files/Voron-2.4/Clamps https://github.com/intelligent-agent/Recore/tree/master/3D-files/Voron-2.4/Clamps]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Clamps-1.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Power supplies ===&lt;br /&gt;
24 V PSU: LRS-200-24&amp;lt;br&amp;gt;&lt;br /&gt;
48 V PSU: LRS-2002N-48&lt;br /&gt;
&lt;br /&gt;
=== Peripherals ===&lt;br /&gt;
&lt;br /&gt;
Control board: [[Recore A8]]&amp;lt;br&amp;gt;&lt;br /&gt;
Extruder control board: [[Retool A2]]&amp;lt;br&amp;gt;&lt;br /&gt;
Bed light: [[Relit A0]]&amp;lt;br&amp;gt;&lt;br /&gt;
Screen: [[Renits A5]]&amp;lt;br&amp;gt;&lt;br /&gt;
Camera: Logitech C270&amp;lt;br&amp;gt;&lt;br /&gt;
Debug port: MH USB to TTL&amp;lt;br&amp;gt;&lt;br /&gt;
On-off button: LP0115CCKW015CB&lt;br /&gt;
&lt;br /&gt;
=== Wires ===&lt;br /&gt;
Black wire for 24 V and 48 V: 1007-16-1-2000-001-1-TS&amp;lt;br&amp;gt;&lt;br /&gt;
Red wire for 24 V and 48 V: 1007-16-1-2000-004-1-TS&amp;lt;br&amp;gt;&lt;br /&gt;
4 conductor black multicore for steppers: Molex 1552200064&amp;lt;br&amp;gt;&lt;br /&gt;
2 conductor black multicore fo4r fans: Tensility 30-00695&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Wire gauges ====&lt;br /&gt;
Cabling from PSU to board: 16 AWG/1.31 mm² (10.0 A)&amp;lt;br&amp;gt;&lt;br /&gt;
For steppers on the control board: Minumum 24 AWG/0.2 mm² (3.0A): &amp;lt;br&amp;gt;&lt;br /&gt;
For steppers on Revolt: Minumum 22 AWG/0.33 mm² (2.0A): 1552200064&amp;lt;br&amp;gt;&lt;br /&gt;
For cabling for fans: 26 AWG/0.13 mm² (1.0 A)&amp;lt;br&amp;gt;&lt;br /&gt;
For 220 V: 22 AWG&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Connectors====&lt;br /&gt;
Cable lugs: Wurth elektronik 55804025&amp;lt;br&amp;gt; &lt;br /&gt;
USB connector for debug: 1131380000&amp;lt;br&amp;gt;&lt;br /&gt;
Quick connect for button: TE 60118-1&amp;lt;br&amp;gt;&lt;br /&gt;
Ferrules for 220 V: Weidmüller 0542500000&lt;br /&gt;
Ferrules for 24 and 48 V: Weidmüller 0372700000&lt;br /&gt;
&lt;br /&gt;
==== Wire lengths ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Function !! Length (cm) !! Gauge (AWG/mm²) !! Conductors !! Diameter (mm) !! Manufacturer !! MPN !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Stepper X ||  || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Y ||  || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Z (S3) || 9 || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Z1 (S0) || 56 || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Z2 (S1) || 63 || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Z3 (S2) || 35 || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Endstop X &amp;amp; Y ||  || 28 || 4 || 3.78 || Tensility || 30-03409 || &lt;br /&gt;
|-&lt;br /&gt;
| Endstop Z ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Fan F0 ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Fan F1 ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Fan F2 ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Fan F3 ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Inductive probe ||  || 24 || 3 || 3.4 || Tensility || 30-00006 || &lt;br /&gt;
|-&lt;br /&gt;
| Relit ||  || 24 || 3 || 3.4 || Tensility || 30-00006 || &lt;br /&gt;
|-&lt;br /&gt;
| PSU 24 V ||  || 16 || 4x1 || 2.31 || CNC Tech || 1007-16-1-2000-001-1-TS || &lt;br /&gt;
|-&lt;br /&gt;
| PSU 48 V || 8 || 16 || 2x1 || 2.31 || CNC Tech || 1007-16-1-2000-001-1-TS || &lt;br /&gt;
|-&lt;br /&gt;
| Control SSR || 24 || 26 || 2x1 || 2.31 || CNC Tech || 1007-16-1-2000-001-1-TS || &lt;br /&gt;
|-&lt;br /&gt;
| Thermistor bed ||  || 26 || 2 ||  ||  ||  || Included&lt;br /&gt;
|-&lt;br /&gt;
| 220 V to PSU 24 V || 20 || 18 || 3x1 || 2.8 || Qualtek || 311007-01 || &lt;br /&gt;
|-&lt;br /&gt;
| 220 V to PSU 48 V || 30 || 18 || 3x1 || 2.8 || Qualtek || 311007-01 || &lt;br /&gt;
|-&lt;br /&gt;
| 220 V to SSR  || 20 || 18 || 1 || 2.8 || Qualtek || 311007-01 || &lt;br /&gt;
|-&lt;br /&gt;
| 220 V to bed ||  ||  || 2 ||  ||  ||  || Included&lt;br /&gt;
|-&lt;br /&gt;
| USB to connector || 100 ||  || 4 ||  || Same Sky || CBL-UA-UA-10BP || &lt;br /&gt;
|-&lt;br /&gt;
| USB to Screen || 50 ||  || 4 ||  || Assmann || A-USB31C-20A-050A || &lt;br /&gt;
|-&lt;br /&gt;
| USB to camera ||  ||  || 4 || 3 ||  ||  || Included&lt;br /&gt;
|-&lt;br /&gt;
| USB to Resend || 100 ||  || 24 || 5 || GlobTek, Inc. || A-USB32C1-32C1-150-B || &lt;br /&gt;
|-&lt;br /&gt;
| USB to Remote || 100 ||  || 24 || 5 || GlobTek, Inc. || USBCM31EM1M0USBCMMMBKR || &lt;br /&gt;
|-&lt;br /&gt;
| RJ45 to connector || 60.1 ||  || 8 ||  || Amphenol ICC || RJE1Y22610152401 || &lt;br /&gt;
|-&lt;br /&gt;
| HDMI to Screen || 50 ||  || 19 || 6 || Phoenix Contact || 1332078 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Connections===&lt;br /&gt;
====XY steppers (2x)====&lt;br /&gt;
JST XH &amp;lt;-&amp;gt; JST PH&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Connectors Stepper XY.png]]&lt;br /&gt;
&lt;br /&gt;
====Z steppers (4x)====&lt;br /&gt;
JST PH &amp;lt;-&amp;gt; JST PH&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Connectors Stepper Z.png]]&lt;br /&gt;
&lt;br /&gt;
====XY Endstops====&lt;br /&gt;
JST PH &amp;lt;-&amp;gt; JST XH&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Connectors Endstops XY.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
If using the [[Retool A2]], this is not needed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====DBG Header====&lt;br /&gt;
[[File:Connectors Button Debug.png]]&lt;br /&gt;
&lt;br /&gt;
====Relit A1====&lt;br /&gt;
[[File:Connectors Relit.png]]&lt;br /&gt;
&lt;br /&gt;
====24 V and 48 V====&lt;br /&gt;
[[File:Connectors 24V.png]]&lt;br /&gt;
====220 V====&lt;br /&gt;
[[File:Connectors 220V.png]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
Cable cutter and stripper: Klein tools 11046&amp;lt;br&amp;gt;&lt;br /&gt;
Ratchet crimper frame: Klein tools VDV200-010&amp;lt;br&amp;gt;&lt;br /&gt;
Ferrule crimper die Set: Klein tools VDV205-039&amp;lt;br&amp;gt;&lt;br /&gt;
Lugs crimper dies set: Klein tools VDV205-044&amp;lt;br&amp;gt;&lt;br /&gt;
JST crimping tool: Engineer PA-09&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Tools small.jpg]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Voron_2.4&amp;diff=1650</id>
		<title>Voron 2.4</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Voron_2.4&amp;diff=1650"/>
		<updated>2026-06-15T22:30:05Z</updated>

		<summary type="html">&lt;p&gt;Elias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Using Recore A8 in a Voron 2.4&lt;br /&gt;
&lt;br /&gt;
===Wire diagram===&lt;br /&gt;
This shows a logical representation of the wiring of the board.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Voron-wire-diagram.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[http://127.0.0.1:8765/#cfg=zH4sIAAAAAAAAA41UTU_jMBC98ysicbWEZ_yZ3EC0Aq1UEIG9RoEaiBSSKE356GF_-_qDgtsmyx5queP3ZuaNn3P8J-nNW9Wb5Kwt-2VxYx7a3hSnOllXywSSckik1ERKlvTtkNCj4wPC0LZ1cYqegI4AglGSChUYdq1NYt6Hfr00_Qh_ZZrlls88HzUSydLJiq9tPWwZ3LeYKgKY0gNGPpiuM71HiiCGE-BcxL2tAqh4j4gz29NqaDvPlL4rrlMCNJWeimqqjHJgzZgro8bKfEyV0Z5JkQhxqH1eNsVZ3b7ZBJy-vHhC6vtiqSYAPFwQaJo81lVnr84X7cp-iLJcm3qo4hRAfQ6FSLSQcbtdgO618E303gAp7OSB6Zj53A7uSh_LZmJE8GkTdI2j-MEni3azqU1x3pdPbfNYf4QUwSmMKaIl_JDhslmuH4bq1RRd396bAsRWBA83q4CobZa4smm76t3UxapqnmxqTxFBN3Kilfyn4cD7JmXONoqNWWEzZQXwLkpBEyF_KOJdI8EXGbX1Bqao3j8KpaPqUSpOUJEGl-N0VRZRL0w5mGVxb3-I9HdIAZ_fCpuCj7ypG1OXH0We3wS0t4wdBrFSRx-H3DoTvTWYcL2lPO7t3n0_JmnBC5Q7nlb_z_OG4Fo4mt514nO5Xg17D2HMVOidoqUav25jzds2xa-qMS_lUD2sAsl7RKVAdDQRz2DZXX5WXN3d0gT99nLxfcizXCYiy78jMpvlDjnLIUapRMUo7VFgV_4Vw2wOSZrNaRS5tiBq1xiE9nuxi3KpME6P2YUNMbt-hew_r-A2CvHscnG-lea2sTTMFrOrcAjC7-NTyHJmH2VcFNSXKHqynw18k3oHn-Vg381eCO172A1dMOvYWAqCk2IXFqHmVgOLxwJuUsj3QmA9thua5XjyqdQeygOlbHvpFut3V-HKumjKdvxKkRTV0V9iH-xtBAgAAA Rewire diagram]&lt;br /&gt;
===Layout===&lt;br /&gt;
This shows the layout of the wiring of the board.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Voron-2.4-layout-small.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3D models ===&lt;br /&gt;
The 3D models used to organize the cables are available here as step files and FreeCad source files.&lt;br /&gt;
All the files are available from the Recore public repository: &amp;lt;br&amp;gt;&lt;br /&gt;
[https://github.com/intelligent-agent/Recore/tree/master/3D-files/Voron-2.4/Clamps https://github.com/intelligent-agent/Recore/tree/master/3D-files/Voron-2.4/Clamps]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Clamps-1.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Power supplies ===&lt;br /&gt;
24 V PSU: LRS-200-24&amp;lt;br&amp;gt;&lt;br /&gt;
48 V PSU: LRS-2002N-48&lt;br /&gt;
&lt;br /&gt;
=== Peripherals ===&lt;br /&gt;
&lt;br /&gt;
Control board: [[Recore A8]]&amp;lt;br&amp;gt;&lt;br /&gt;
Extruder control board: [[Retool A2]]&amp;lt;br&amp;gt;&lt;br /&gt;
Bed light: [[Relit A0]]&amp;lt;br&amp;gt;&lt;br /&gt;
Screen: [[Renits A5]]&amp;lt;br&amp;gt;&lt;br /&gt;
Camera: Logitech C270&amp;lt;br&amp;gt;&lt;br /&gt;
Debug port: MH USB to TTL&amp;lt;br&amp;gt;&lt;br /&gt;
On-off button: LP0115CCKW015CB&lt;br /&gt;
&lt;br /&gt;
=== Wires ===&lt;br /&gt;
Black wire for 24 V and 48 V: 1007-16-1-2000-001-1-TS&amp;lt;br&amp;gt;&lt;br /&gt;
Red wire for 24 V and 48 V: 1007-16-1-2000-004-1-TS&amp;lt;br&amp;gt;&lt;br /&gt;
4 conductor black multicore for steppers: Molex 1552200064&amp;lt;br&amp;gt;&lt;br /&gt;
2 conductor black multicore fo4r fans: Tensility 30-00695&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Wire gauges ====&lt;br /&gt;
Cabling from PSU to board: 16 AWG/1.31 mm² (10.0 A)&amp;lt;br&amp;gt;&lt;br /&gt;
For steppers on the control board: Minumum 24 AWG/0.2 mm² (3.0A): &amp;lt;br&amp;gt;&lt;br /&gt;
For steppers on Revolt: Minumum 22 AWG/0.33 mm² (2.0A): 1552200064&amp;lt;br&amp;gt;&lt;br /&gt;
For cabling for fans: 26 AWG/0.13 mm² (1.0 A)&amp;lt;br&amp;gt;&lt;br /&gt;
For 220 V: 22 AWG&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Connectors====&lt;br /&gt;
Cable lugs: Wurth elektronik 55804025&amp;lt;br&amp;gt; &lt;br /&gt;
USB connector for debug: 1131380000&amp;lt;br&amp;gt;&lt;br /&gt;
Quick connect for button: TE 60118-1&amp;lt;br&amp;gt;&lt;br /&gt;
Ferrules for 220 V: Weidmüller 0542500000&lt;br /&gt;
Ferrules for 24 and 48 V: Weidmüller 0372700000&lt;br /&gt;
&lt;br /&gt;
==== Wire lengths ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Function !! Length (cm) !! Gauge (AWG/mm²) !! Conductors !! Diameter (mm) !! Manufacturer !! MPN !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Stepper X ||  || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Y ||  || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Z (S3) || 9 || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Z1 (S0) || 56 || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Z2 (S1) || 63 || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Stepper Z3 (S2) || 35 || 22 || 4 || 5.1 || Molex || 1552200064 || &lt;br /&gt;
|-&lt;br /&gt;
| Endstop X &amp;amp; Y ||  || 28 || 4 || 3.78 || Tensility || 30-03409 || &lt;br /&gt;
|-&lt;br /&gt;
| Endstop Z ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Fan F0 ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Fan F1 ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Fan F2 ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Fan F3 ||  || 26 || 2 || 3.81 || Tensility || 30-00695 || &lt;br /&gt;
|-&lt;br /&gt;
| Inductive probe ||  || 24 || 3 || 3.4 || Tensility || 30-00006 || &lt;br /&gt;
|-&lt;br /&gt;
| Relit ||  || 24 || 3 || 3.4 || Tensility || 30-00006 || &lt;br /&gt;
|-&lt;br /&gt;
| PSU 24 V ||  || 16 || 4x1 || 2.31 || CNC Tech || 1007-16-1-2000-001-1-TS || &lt;br /&gt;
|-&lt;br /&gt;
| PSU 48 V || 8 || 16 || 2x1 || 2.31 || CNC Tech || 1007-16-1-2000-001-1-TS || &lt;br /&gt;
|-&lt;br /&gt;
| Control SSR || 24 || 26 || 2x1 || 2.31 || CNC Tech || 1007-16-1-2000-001-1-TS || &lt;br /&gt;
|-&lt;br /&gt;
| Thermistor bed ||  || 26 || 2 ||  ||  ||  || Included&lt;br /&gt;
|-&lt;br /&gt;
| 220 V to PSU 24 V || 20 || 18 || 3x1 || 2.8 || Qualtek || 311007-01 || &lt;br /&gt;
|-&lt;br /&gt;
| 220 V to PSU 48 V || 30 || 18 || 3x1 || 2.8 || Qualtek || 311007-01 || &lt;br /&gt;
|-&lt;br /&gt;
| 220 V to SSR  || 20 || 18 || 1 || 2.8 || Qualtek || 311007-01 || &lt;br /&gt;
|-&lt;br /&gt;
| 220 V to bed ||  ||  || 2 ||  ||  ||  || Included&lt;br /&gt;
|-&lt;br /&gt;
| USB to connector || 100 ||  || 4 ||  || Same Sky || CBL-UA-UA-10BP || &lt;br /&gt;
|-&lt;br /&gt;
| USB to Screen || 50 ||  || 4 ||  || Assmann || A-USB31C-20A-050A || &lt;br /&gt;
|-&lt;br /&gt;
| USB to camera ||  ||  || 4 || 3 ||  ||  || Included&lt;br /&gt;
|-&lt;br /&gt;
| USB to Resend || 100 ||  || 24 || 5 || GlobTek, Inc. || A-USB32C1-32C1-150-B || &lt;br /&gt;
|-&lt;br /&gt;
| USB to Remote || 100 ||  || 24 || 5 || GlobTek, Inc. || USBCM31EM1M0USBCMMMBKR || &lt;br /&gt;
|-&lt;br /&gt;
| RJ45 to connector || 60.1 ||  || 8 ||  || Amphenol ICC || RJE1Y22610152401 || &lt;br /&gt;
|-&lt;br /&gt;
| HDMI to Screen || 50 ||  || 19 || 6 || Phoenix Contact || 1332078 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Connections===&lt;br /&gt;
====XY steppers (2x)====&lt;br /&gt;
JST XH &amp;lt;-&amp;gt; JST PH&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Connectors Stepper XY.png]]&lt;br /&gt;
&lt;br /&gt;
====Z steppers (4x)====&lt;br /&gt;
JST PH &amp;lt;-&amp;gt; JST PH&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Connectors Stepper Z.png]]&lt;br /&gt;
&lt;br /&gt;
====XY Endstops====&lt;br /&gt;
JST PH &amp;lt;-&amp;gt; JST XH&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Connectors Endstops XY.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
If using the [[Retool A2]], this is not needed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====DBG Header====&lt;br /&gt;
[[File:Connectors Button Debug.png]]&lt;br /&gt;
&lt;br /&gt;
====Relit A1====&lt;br /&gt;
[[File:Connectors Relit.png]]&lt;br /&gt;
&lt;br /&gt;
====24 V and 48 V====&lt;br /&gt;
[[File:Connectors 24V.png]]&lt;br /&gt;
====220 V====&lt;br /&gt;
[[File:Connectors 220V.png]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
Cable cutter and stripper: Klein tools 11046&amp;lt;br&amp;gt;&lt;br /&gt;
Ratchet crimper frame: Klein tools VDV200-010&amp;lt;br&amp;gt;&lt;br /&gt;
Ferrule crimper die Set: Klein tools VDV205-039&amp;lt;br&amp;gt;&lt;br /&gt;
Lugs crimper dies set: Klein tools VDV205-044&amp;lt;br&amp;gt;&lt;br /&gt;
JST crimping tool: Engineer PA-09&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Tools small.jpg]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Revolt_A2&amp;diff=1649</id>
		<title>Revolt A2</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Revolt_A2&amp;diff=1649"/>
		<updated>2026-06-13T13:31:05Z</updated>

		<summary type="html">&lt;p&gt;Elias: /* Hardware connections */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Revolt is a dual 48 V compatible stepper motor driver add-on board. It is based on TMC2160.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Revolt A2.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Hardware connections==&lt;br /&gt;
The Revolt add-on baord is designed to stack on top of the Recore A7/A8 board. There are two dual row connectors on the Revolt board, but only one on Recore A7. The enable/disable for the TMC2160 drivers are connected to the +24V from the bottom board, so the drivers are enabled when . It is enabled by default. There is also no diag output from the drivers. Those are broken out on the two other rows and can be connected to pins on the MCU header or DBG header if sensorless homing is required.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Rewire-Revolt-A2.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Klipper config==&lt;br /&gt;
This config is using stepper x and y as the high voltage drivers, typical of a core-xy printer setup for speed. This gives the option of having 4 Z-drives and two extruders, 8 steppers in total.&lt;br /&gt;
&lt;br /&gt;
This section sets up the two drivers (X = S6 and Y = S7)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[tmc5160 stepper_x]&lt;br /&gt;
run_current: 0.6&lt;br /&gt;
hold_current: 0.2&lt;br /&gt;
sense_resistor: 0.05&lt;br /&gt;
cs_pin: ar100:PD0&lt;br /&gt;
spi_software_sclk_pin: ar100:PD2&lt;br /&gt;
spi_software_mosi_pin: ar100:PD1&lt;br /&gt;
spi_software_miso_pin: ar100:PD3&lt;br /&gt;
chain_position: 2&lt;br /&gt;
chain_length: 2&lt;br /&gt;
stealthchop_threshold: 9999&lt;br /&gt;
&lt;br /&gt;
[tmc5160 stepper_y]&lt;br /&gt;
run_current: 0.6&lt;br /&gt;
hold_current: 0.2&lt;br /&gt;
sense_resistor: 0.05&lt;br /&gt;
cs_pin: ar100:PD0&lt;br /&gt;
chain_position: 1&lt;br /&gt;
chain_length: 2&lt;br /&gt;
stealthchop_threshold: 9999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To route step and dir signals to the same motors: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[stepper_x]&lt;br /&gt;
step_pin: ar100:PL10&lt;br /&gt;
dir_pin: ar100:PE14&lt;br /&gt;
&lt;br /&gt;
[stepper_y]&lt;br /&gt;
step_pin: ar100:PL11&lt;br /&gt;
dir_pin: !ar100:PE15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Recompiling Klipper==&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
If you use Rebuild v1.0.0-RC0 or later, a recompilation is not necessary.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Klipper needs to be recompiled to add software based SPI. Starting with Refactor v3.2.0-RC3&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
nano src/Makefile&lt;br /&gt;
&amp;lt;remove thermocouple.c sensor_adxl345.c and sensor_angle.c&amp;gt;&lt;br /&gt;
make menuconfig&lt;br /&gt;
&amp;lt;enable Support software based SPI &amp;quot;bit-banging&amp;quot;&amp;gt;&lt;br /&gt;
make clean&lt;br /&gt;
make&lt;br /&gt;
mv out/ar100.bin /opt/firmware/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tuning curves==&lt;br /&gt;
The following oscilloscope capture shows the Revolt A1 running a NEMA 17 stepper at 30 V. The traces are A1 output (yellow) and gate for A1 (pink). The tuning looks good, very little ringing. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Tuning gate and source.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# Plus and minus silkscreen has changed places.&lt;br /&gt;
# The enable LED is lighting even though the 24 V input is not present.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Revolt_A2&amp;diff=1648</id>
		<title>Revolt A2</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Revolt_A2&amp;diff=1648"/>
		<updated>2026-06-13T13:30:45Z</updated>

		<summary type="html">&lt;p&gt;Elias: /* Hardware connections */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Revolt is a dual 48 V compatible stepper motor driver add-on board. It is based on TMC2160.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Revolt A2.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Hardware connections==&lt;br /&gt;
The Revolt add-on baord is designed to stack on top of the Recore A7 board. There are two dual row connectors on the Revolt board, but only one on Recore A7. The enable/disable for the TMC2160 drivers are connected to the +24V from the bottom board, so the drivers are enabled when . It is enabled by default. There is also no diag output from the drivers. Those are broken out on the two other rows and can be connected to pins on the MCU header or DBG header if sensorless homing is required.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Rewire-Revolt-A2.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Klipper config==&lt;br /&gt;
This config is using stepper x and y as the high voltage drivers, typical of a core-xy printer setup for speed. This gives the option of having 4 Z-drives and two extruders, 8 steppers in total.&lt;br /&gt;
&lt;br /&gt;
This section sets up the two drivers (X = S6 and Y = S7)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[tmc5160 stepper_x]&lt;br /&gt;
run_current: 0.6&lt;br /&gt;
hold_current: 0.2&lt;br /&gt;
sense_resistor: 0.05&lt;br /&gt;
cs_pin: ar100:PD0&lt;br /&gt;
spi_software_sclk_pin: ar100:PD2&lt;br /&gt;
spi_software_mosi_pin: ar100:PD1&lt;br /&gt;
spi_software_miso_pin: ar100:PD3&lt;br /&gt;
chain_position: 2&lt;br /&gt;
chain_length: 2&lt;br /&gt;
stealthchop_threshold: 9999&lt;br /&gt;
&lt;br /&gt;
[tmc5160 stepper_y]&lt;br /&gt;
run_current: 0.6&lt;br /&gt;
hold_current: 0.2&lt;br /&gt;
sense_resistor: 0.05&lt;br /&gt;
cs_pin: ar100:PD0&lt;br /&gt;
chain_position: 1&lt;br /&gt;
chain_length: 2&lt;br /&gt;
stealthchop_threshold: 9999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To route step and dir signals to the same motors: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[stepper_x]&lt;br /&gt;
step_pin: ar100:PL10&lt;br /&gt;
dir_pin: ar100:PE14&lt;br /&gt;
&lt;br /&gt;
[stepper_y]&lt;br /&gt;
step_pin: ar100:PL11&lt;br /&gt;
dir_pin: !ar100:PE15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Recompiling Klipper==&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
If you use Rebuild v1.0.0-RC0 or later, a recompilation is not necessary.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Klipper needs to be recompiled to add software based SPI. Starting with Refactor v3.2.0-RC3&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
nano src/Makefile&lt;br /&gt;
&amp;lt;remove thermocouple.c sensor_adxl345.c and sensor_angle.c&amp;gt;&lt;br /&gt;
make menuconfig&lt;br /&gt;
&amp;lt;enable Support software based SPI &amp;quot;bit-banging&amp;quot;&amp;gt;&lt;br /&gt;
make clean&lt;br /&gt;
make&lt;br /&gt;
mv out/ar100.bin /opt/firmware/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tuning curves==&lt;br /&gt;
The following oscilloscope capture shows the Revolt A1 running a NEMA 17 stepper at 30 V. The traces are A1 output (yellow) and gate for A1 (pink). The tuning looks good, very little ringing. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Tuning gate and source.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# Plus and minus silkscreen has changed places.&lt;br /&gt;
# The enable LED is lighting even though the 24 V input is not present.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=File:Rewire-Revolt-A2.png&amp;diff=1647</id>
		<title>File:Rewire-Revolt-A2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=File:Rewire-Revolt-A2.png&amp;diff=1647"/>
		<updated>2026-06-13T13:30:01Z</updated>

		<summary type="html">&lt;p&gt;Elias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rewire-Revolt-A2&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1646</id>
		<title>Reheat A0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1646"/>
		<updated>2026-06-13T13:02:37Z</updated>

		<summary type="html">&lt;p&gt;Elias: /* pin description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reheat is a 6 output heater board with temperature sensors and fans for multi material printing.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reheat A0.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
* [https://github.com/intelligent-agent/Recore/blob/master/Schematics/Reheat_A0.pdf Reheat A0 Schematics (PDF)]&lt;br /&gt;
==Config tool==&lt;br /&gt;
* [https://config.iagent.no/ Reheat A0 config tool]&lt;br /&gt;
==pin description==&lt;br /&gt;
This is temporary while waiting for a proper pinout&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reheat A0 pinout.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Wire diagram==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Rewire-Reheat_A0.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
* RP2354B microcontroller (ARM Cortex-M33, 150 MHz)&lt;br /&gt;
* 6x heater outputs (24 V, MOSFET-switched)&lt;br /&gt;
* 6x fan outputs (24 V PWM) with tachometer inputs&lt;br /&gt;
* 6x thermistor/temperature sensor inputs&lt;br /&gt;
** Supports: NTC 10K, NTC 100K, PT100, PT1000, Type K thermocouple&lt;br /&gt;
** Jumper-selectable per channel&lt;br /&gt;
* 12x endstop inputs (5 V tolerant, TVS-protected)&lt;br /&gt;
** ENDSTOP-12 supports a bidirectional signal (e.g. filament encoder)&lt;br /&gt;
* USB-C interface (USB 2.0)&lt;br /&gt;
* 24 V power input with onboard 5 V (3 A) and 3.3 V regulation&lt;br /&gt;
* Overcurrent detection on fan bus&lt;br /&gt;
&lt;br /&gt;
==Pinout==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! GPIO !! Signal !! Connector&lt;br /&gt;
|-&lt;br /&gt;
| GPIO0 || HEATER-1 || J2&lt;br /&gt;
|-&lt;br /&gt;
| GPIO1 || HEATER-2 || J3&lt;br /&gt;
|-&lt;br /&gt;
| GPIO2 || HEATER-3 || J6&lt;br /&gt;
|-&lt;br /&gt;
| GPIO3 || HEATER-4 || J11&lt;br /&gt;
|-&lt;br /&gt;
| GPIO4 || HEATER-5 || J12&lt;br /&gt;
|-&lt;br /&gt;
| GPIO5 || HEATER-6 || J13&lt;br /&gt;
|-&lt;br /&gt;
| GPIO6 || FAN-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO7 || FAN-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO8 || FAN-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO9 || FAN-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO10 || FAN-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO11 || FAN-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO12 || TACH-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO13 || TACH-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO14 || TACH-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO15 || TACH-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO16 || TACH-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO17 || TACH-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO18 || ENDSTOP-1 || J14&lt;br /&gt;
|-&lt;br /&gt;
| GPIO19 || ENDSTOP-2 || J15&lt;br /&gt;
|-&lt;br /&gt;
| GPIO20 || ENDSTOP-3 || J16&lt;br /&gt;
|-&lt;br /&gt;
| GPIO21 || ENDSTOP-4 || J17&lt;br /&gt;
|-&lt;br /&gt;
| GPIO22 || ENDSTOP-5 || J18&lt;br /&gt;
|-&lt;br /&gt;
| GPIO23 || ENDSTOP-6 || J19&lt;br /&gt;
|-&lt;br /&gt;
| GPIO24 || ENDSTOP-7 || J20&lt;br /&gt;
|-&lt;br /&gt;
| GPIO25 || ENDSTOP-8 || J21&lt;br /&gt;
|-&lt;br /&gt;
| GPIO26 || ENDSTOP-9 || J22&lt;br /&gt;
|-&lt;br /&gt;
| GPIO27 || ENDSTOP-10 || J23&lt;br /&gt;
|-&lt;br /&gt;
| GPIO28 || ENDSTOP-11 || J24&lt;br /&gt;
|-&lt;br /&gt;
| GPIO29 || ENDSTOP-12 || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO30 || MUX-S0 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO31 || MUX-S1 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO32 || MUX-S2 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO33 || PWM-GAIN || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO34 || PWM-OFFSET || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO35 || PWM-CURRENT || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO36 || EN-PULLUP || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO37 || ENDSTOP-12-DIR || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO38 || FAN-OC (overcurrent) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO40 / ADC0 || THERM-1 || J27&lt;br /&gt;
|-&lt;br /&gt;
| GPIO41 / ADC1 || THERM-2 || J28&lt;br /&gt;
|-&lt;br /&gt;
| GPIO42 / ADC2 || THERM-3 || J29&lt;br /&gt;
|-&lt;br /&gt;
| GPIO43 / ADC3 || THERM-4 || J30&lt;br /&gt;
|-&lt;br /&gt;
| GPIO44 / ADC4 || THERM-5 || J31&lt;br /&gt;
|-&lt;br /&gt;
| GPIO45 / ADC5 || THERM-6 || J32&lt;br /&gt;
|-&lt;br /&gt;
| GPIO46 / ADC6 || ADC (MUX output) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO47 / ADC7 || CURRENT sense || Internal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Hardware connections==&lt;br /&gt;
&lt;br /&gt;
===Power===&lt;br /&gt;
The board takes 24 V DC on a 4-pin connector (J33). A fuse (F1) and a 2 mΩ current-sense resistor (R98) protect the input. Onboard regulators provide +5 V (TPS54302 buck converter, 3 A) and +3.3 V (AMS1117-3.3, 1 A) for logic and sensor pull-ups.&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
Six heater outputs use 2SK3019 N-channel MOSFETs driven from GPIO0–GPIO5. Each output has a 2-pin female connector and a flyback Schottky diode. The heater voltage is 24 V.&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
Six fan outputs (GPIO6–GPIO11) use N-channel MOSFETs with a 24 V supply. Each has a 3-pin connector (V+, GND, TACH). Tachometer signals are read on GPIO12–GPIO17. An LM393 comparator monitors the fan bus for overcurrent and signals FAN-OC on GPIO38.&lt;br /&gt;
&lt;br /&gt;
===Thermistors===&lt;br /&gt;
Each thermistor channel has a 3-pin connector (J27–J32) with a jumper (JP1–JP6) to select the measurement mode. An analog MUX (CD4051) and op-amp signal conditioning chain feed the ADC inputs (GPIO40–GPIO45). The signal conditioning supports:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sensor type !! Measurement method&lt;br /&gt;
|-&lt;br /&gt;
| NTC 10K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| NTC 100K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| PT100 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| PT1000 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| Type K thermocouple || ×101 gain amplifier, buffered&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For NTC thermistor or PT1000 measurements, close jumpers JP1–JP6 to connect the 4.7 K pull-up resistors. With the jumpers closed, ADC0–ADC5 (GPIO40–GPIO45) can be used as standard thermistor inputs with a 4.7 K pull-up to 3.3 V, without the need for any additional signal conditioning.&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;br /&gt;
# VUSB is unconnected, so the board requires 24 V power to operate even when connected over USB.&lt;br /&gt;
&lt;br /&gt;
==Klipper configuration==&lt;br /&gt;
&lt;br /&gt;
The Reheat A0 connects to the host over USB and is configured as an MCU in Klipper. Find the serial path with &amp;lt;code&amp;gt;ls /dev/serial/by-id/&amp;lt;/code&amp;gt; and add to &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_XXXXXXXXXXXX-if00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[heater_generic heater1]&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio40&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio41&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[fan_generic fan1]&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
&lt;br /&gt;
[fan_generic fan2]&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Endstops===&lt;br /&gt;
Endstop pins can be referenced in the relevant stepper sections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[stepper_x]&lt;br /&gt;
endstop_pin: reheat:gpio18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Flashing Klipper==&lt;br /&gt;
&lt;br /&gt;
# Put the board in BOOTSEL mode: hold the BOOT button while plugging in USB (or hold BOOT, press RESET, then release BOOT).&lt;br /&gt;
# Build and flash from the Klipper source directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make menuconfig&lt;br /&gt;
# Processor model: rp2350&lt;br /&gt;
# Bootloader offset: No bootloader&lt;br /&gt;
# Communication interface: USBSERIAL&lt;br /&gt;
make&lt;br /&gt;
picotool load out/klipper.uf2 --force&lt;br /&gt;
picotool reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The board will reboot and appear as &amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; (or similar).&lt;br /&gt;
&lt;br /&gt;
==Full config file==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  Reheat_A0.cfg  —  Complete Klipper configuration for the Reheat A0&lt;br /&gt;
#  MCU: RP2354B (RP2350 family, ARM Cortex-M33, 150 MHz, 48 GPIO, 8 ADC)&lt;br /&gt;
#  Source: https://wiki.iagent.no/wiki/Reheat_A0&lt;br /&gt;
#&lt;br /&gt;
#  Board functions:&lt;br /&gt;
#    6x heater outputs (24V MOSFET)        GPIO0..GPIO5&lt;br /&gt;
#    6x fan outputs (24V PWM)              GPIO6..GPIO11&lt;br /&gt;
#    6x fan tachometer inputs              GPIO12..GPIO17&lt;br /&gt;
#    12x endstop inputs (5V tolerant)      GPIO18..GPIO29 (+ GPIO37 dir)&lt;br /&gt;
#    6x thermistor/temperature ADC inputs  GPIO40..GPIO45 (ADC0..ADC5)&lt;br /&gt;
#    analog mux + PWM bias control         GPIO30..GPIO35&lt;br /&gt;
#    endstop pull-up enable                GPIO36&lt;br /&gt;
#    fan over-current flag                 GPIO38&lt;br /&gt;
#    ADC mux output / input-current sense  GPIO46/GPIO47 (ADC6/ADC7)&lt;br /&gt;
#&lt;br /&gt;
#  Each fan is paired with its matching heater (FAN1&amp;lt;-&amp;gt;HEATER1, ...).&lt;br /&gt;
#&lt;br /&gt;
#  Build firmware:  RP2350 (ARM) processor, USB communication.&lt;br /&gt;
#  Flash:  hold BOOT while plugging in USB-C to enter BOOTSEL.&lt;br /&gt;
#  ERRATA: RUN pin is hardwired -&amp;gt; Klipper cannot software-reset the MCU&lt;br /&gt;
#          (re-enter BOOTSEL manually to reflash). USB DP/DM are swapped.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
#  MCU&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
# USB-C, enumerates over USB. Use the stable by-id path:&lt;br /&gt;
#   ls /dev/serial/by-id/*&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_21745F8FD0431B3A-if00&lt;br /&gt;
restart_method: command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
#  Endstop pull-up enable (GPIO36)&lt;br /&gt;
#  Drive high at boot so the 12 endstop inputs read correctly.&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
[static_digital_output endstop_pullup_enable]&lt;br /&gt;
pins: reheat:gpio36&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  HEATERS  (24V MOSFET outputs, paired with ADC thermistors)&lt;br /&gt;
#  Sensor types supported by the board: NTC 10K, NTC 100K, PT100,&lt;br /&gt;
#  PT1000, Type-K thermocouple. NTC 100K -&amp;gt; &amp;quot;Generic 3950&amp;quot;.&lt;br /&gt;
#  Pairing of heater&amp;lt;-&amp;gt;thermistor is arbitrary; reassign as needed.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater1]                # HEATER1 / THERM1&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_pin: reheat:gpio40               # ADC0&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]                # HEATER2 / THERM2&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_pin: reheat:gpio41               # ADC1&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater3]                # HEATER3 / THERM3&lt;br /&gt;
heater_pin: reheat:gpio2&lt;br /&gt;
sensor_pin: reheat:gpio42               # ADC2&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater4]                # HEATER4 / THERM4&lt;br /&gt;
heater_pin: reheat:gpio3&lt;br /&gt;
sensor_pin: reheat:gpio43               # ADC3&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater5]                # HEATER5 / THERM5&lt;br /&gt;
heater_pin: reheat:gpio4&lt;br /&gt;
sensor_pin: reheat:gpio44               # ADC4&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater6]                # HEATER6 / THERM6&lt;br /&gt;
heater_pin: reheat:gpio5&lt;br /&gt;
sensor_pin: reheat:gpio45               # ADC5&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  FANS  (24V PWM)&lt;br /&gt;
#  Each fan follows its matching heater (FAN1&amp;lt;-&amp;gt;HEATER1, FAN2&amp;lt;-&amp;gt;HEATER2,&lt;br /&gt;
#  ... FAN6&amp;lt;-&amp;gt;HEATER6) and turns on when that heater is active.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan1]                       # FAN1 -&amp;gt; HEATER1&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
heater: heater1&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan2]                       # FAN2 -&amp;gt; HEATER2&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
heater: heater2&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan3]                       # FAN3 -&amp;gt; HEATER3&lt;br /&gt;
pin: reheat:gpio8&lt;br /&gt;
heater: heater3&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan4]                       # FAN4 -&amp;gt; HEATER4&lt;br /&gt;
pin: reheat:gpio9&lt;br /&gt;
heater: heater4&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan5]                       # FAN5 -&amp;gt; HEATER5&lt;br /&gt;
pin: reheat:gpio10&lt;br /&gt;
heater: heater5&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan6]                       # FAN6 -&amp;gt; HEATER6&lt;br /&gt;
pin: reheat:gpio11&lt;br /&gt;
heater: heater6&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  ENDSTOPS  (11 inputs, 5V tolerant)  +  NeoPixel on EP12&lt;br /&gt;
#  This board has no stepper drivers, so endstops are exposed as&lt;br /&gt;
#  runtime-readable buttons. To use one as a homing endstop instead,&lt;br /&gt;
#  reference its pin from a stepper on your motion board, e.g.:&lt;br /&gt;
#     [stepper_x]&lt;br /&gt;
#     endstop_pin: reheat:gpio18&lt;br /&gt;
#  Endstop 12 (GPIO29) is wired to a NeoPixel data line (see below).&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
# Each endstop is exposed as a button so its state is queryable. The&lt;br /&gt;
# press/release gcode is intentionally empty (just reads the input).&lt;br /&gt;
[gcode_button endstop1]&lt;br /&gt;
pin: reheat:gpio18&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop2]&lt;br /&gt;
pin: reheat:gpio19&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop3]&lt;br /&gt;
pin: reheat:gpio20&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop4]&lt;br /&gt;
pin: reheat:gpio21&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop5]&lt;br /&gt;
pin: reheat:gpio22&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop6]&lt;br /&gt;
pin: reheat:gpio23&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop7]&lt;br /&gt;
pin: reheat:gpio24&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop8]&lt;br /&gt;
pin: reheat:gpio25&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop9]&lt;br /&gt;
pin: reheat:gpio26&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop10]&lt;br /&gt;
pin: reheat:gpio27&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop11]&lt;br /&gt;
pin: reheat:gpio28&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
# NeoPixel on the EP12 connector (GPIO29 data line).&lt;br /&gt;
[neopixel reheat_led]&lt;br /&gt;
pin: reheat:gpio29&lt;br /&gt;
chain_count: 1&lt;br /&gt;
color_order: GRB&lt;br /&gt;
initial_RED: 0.0&lt;br /&gt;
initial_GREEN: 0.0&lt;br /&gt;
initial_BLUE: 0.0&lt;br /&gt;
&lt;br /&gt;
# EP12 direction line (GPIO37) — drive the level-shifter towards the&lt;br /&gt;
# NeoPixel (output direction).&lt;br /&gt;
[static_digital_output endstop12_dir]&lt;br /&gt;
pins: reheat:gpio37&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  ANALOG MUX + PWM BIAS  (board-internal sensor front-end)&lt;br /&gt;
#  MUX_S0..S2 select one of the multiplexed analog channels, read back&lt;br /&gt;
#  on ADC_MUX (GPIO46/ADC6). PWM_GAIN/OFFSET/CURRENT set the analog&lt;br /&gt;
#  amplifier bias used for PT100/thermocouple measurement.&lt;br /&gt;
#  These are exposed as raw pins; exact scaling is board-specific.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s0]&lt;br /&gt;
pin: reheat:gpio30&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s1]&lt;br /&gt;
pin: reheat:gpio31&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s2]&lt;br /&gt;
pin: reheat:gpio32&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_gain]&lt;br /&gt;
pin: reheat:gpio33&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_offset]&lt;br /&gt;
pin: reheat:gpio34&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_current]&lt;br /&gt;
pin: reheat:gpio35&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  PROTECTION / MONITORING&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
# Fan over-current flag (GPIO38) — reads active on an over-current event.&lt;br /&gt;
[gcode_button fan_overcurrent]&lt;br /&gt;
pin: reheat:gpio38&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
# Input-current sense (GPIO47 / ADC7) via the 2 mΩ shunt.&lt;br /&gt;
# Scale: 1 A = 0.1 V  -&amp;gt;  3.3 V full-scale = 33 A. The reported&lt;br /&gt;
# &amp;quot;temperature&amp;quot; value is therefore the input current in amps.&lt;br /&gt;
[adc_temperature reheat_current]&lt;br /&gt;
temperature1: 0&lt;br /&gt;
voltage1: 0&lt;br /&gt;
temperature2: 33&lt;br /&gt;
voltage2: 3.3&lt;br /&gt;
&lt;br /&gt;
[temperature_sensor input_current]&lt;br /&gt;
adc_voltage: 3.3&lt;br /&gt;
sensor_pin: reheat:gpio47&lt;br /&gt;
sensor_type: reheat_current&lt;br /&gt;
min_temp: -1&lt;br /&gt;
max_temp: 40&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]]&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=File:Rewire-Reheat_A0.png&amp;diff=1645</id>
		<title>File:Rewire-Reheat A0.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=File:Rewire-Reheat_A0.png&amp;diff=1645"/>
		<updated>2026-06-13T13:01:26Z</updated>

		<summary type="html">&lt;p&gt;Elias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rewire-Reheat A0&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Recore_A7&amp;diff=1644</id>
		<title>Recore A7</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Recore_A7&amp;diff=1644"/>
		<updated>2026-06-13T12:55:30Z</updated>

		<summary type="html">&lt;p&gt;Elias: /* Wiring */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Recore header.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Recore is a 3D-printer control board running Linux. It is specifically tailored to be compatible with Klipper and OctoPrint. The main features are: &lt;br /&gt;
* Allwinner A64 SoC, quad core CPU running at 1 GHz. &lt;br /&gt;
* 1 GB of DDR3 RAM&lt;br /&gt;
* 8 GB of on board eMMC &lt;br /&gt;
* Gigabit Ethernet&lt;br /&gt;
* 6 TMC2209, 2 A stepper motor drivers&lt;br /&gt;
* 3 heater outputs + high power heated bed&lt;br /&gt;
* 4 USB High Speed ports &lt;br /&gt;
* 4 thermistor/thermocouple inputs (software selectable)&lt;br /&gt;
* Comes with Debian Linux with Klipper and OctoPrint or MainSail installed&lt;br /&gt;
&lt;br /&gt;
This document is for Recore Revision A7. For previous hardware revisions, please see:  &lt;br /&gt;
* [[Recore_A6]]&lt;br /&gt;
* [[Recore_A5]]&lt;br /&gt;
* [[Recore_A4]]&lt;br /&gt;
* [[Recore_A3]]  &lt;br /&gt;
* [[Recore_A2]]&lt;br /&gt;
&lt;br /&gt;
==Availability==&lt;br /&gt;
Recore A7 can be purchased from the iagent web shop [https://www.iagent.no/product/recore/ https://www.iagent.no/product/recore/]&lt;br /&gt;
&lt;br /&gt;
Or at Fabreeko [https://www.fabreeko.com/products/recore-a7-by-iagent https://www.fabreeko.com/products/recore-a7-by-iagent]&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
Recore is &amp;quot;open schematic&amp;quot;, it is available here: [https://github.com/intelligent-agent/Recore/blob/master/Schematics/Recore_A7.pdf https://github.com/intelligent-agent/Recore/blob/master/Schematics/Recore_A7.pdf]&lt;br /&gt;
==3D model==&lt;br /&gt;
A STEP file of the PCB with components is available here: [https://github.com/intelligent-agent/Recore/blob/master/3D-files/Recore_A7.step https://github.com/intelligent-agent/Recore/blob/master/3D-files/Recore_A7.step]&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Recore A7 pinout.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A64==&lt;br /&gt;
The Allwinner A64 is a quad core Cortex A53 clocked at 1 GHz. It has an integrated RISC CPU (AR100) clocked at 300 MHz that handles the real time aspect for the 3D-printer. In the following table the pins used for End-stops and stepper control are described. &lt;br /&gt;
The &amp;quot;bank and pin&amp;quot; can be used to specify the pin numbers in klipper. &lt;br /&gt;
The &amp;quot;Number&amp;quot; column is useful for testing things on the command line in conjunction with gpiod.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&lt;br /&gt;
! Name !! Bank and pin !!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number !! Name !! Bank and pin !!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number !! Name !! Bank and pin !! Number&lt;br /&gt;
|-&lt;br /&gt;
| STEP 0 || PL4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 4 || END STOP 0 || PH4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;|228 || OC-ALERT || PF6 || 166&lt;br /&gt;
|-&lt;br /&gt;
| STEP 1 || PL5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 5 || END STOP 1 || PH5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 229 || OC-RESET || PF4 || 164&lt;br /&gt;
|-&lt;br /&gt;
| STEP 2 || PL6 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 6 || END STOP 2 || PH6 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 230 || EN-HP || PF5 || 165&lt;br /&gt;
|-&lt;br /&gt;
| STEP 3 || PL7 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 7 || END STOP 3 || PH7 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 231 || UC-INT-1 || PG3 || 195&lt;br /&gt;
|-&lt;br /&gt;
| STEP 4 || PL8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 8 || END STOP 4 || PH8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 232 || UC-NRST || PG4 || 196&lt;br /&gt;
|-&lt;br /&gt;
| STEP 5 || PL9 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 9 || END STOP 5 || PH9 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 233 || UC-BOOT || PG5 || 197&lt;br /&gt;
|-&lt;br /&gt;
| STEP 6 || PL10 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 10 || GAIN-ENABLE-T0 || PD4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 100 || ES-EN-12V || PF0 || 160&lt;br /&gt;
|-&lt;br /&gt;
| STEP 7 || PL11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 11 || GAIN-ENABLE-T1 || PH11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 235 || EN-THERMISTORS || PF1 || 161&lt;br /&gt;
|-&lt;br /&gt;
| DIR 0 || PE8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 136 || GAIN ENABLE T2 || PE17 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 145 || EN-ENDSTOPS || PF2 || 162&lt;br /&gt;
|-&lt;br /&gt;
| DIR 1 || PE9 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 137 || GAIN ENABLE T3 || PB2 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 34 || USR || PF3 || 163&lt;br /&gt;
|-&lt;br /&gt;
| DIR 2 || PE10 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 138 || PU-ENABLE-T0 || PG10 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 202 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| DIR 3 || PE11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 139 || PU-ENABLE-T1 || PG11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 203 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| DIR 4 || PE12 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 140 || PU ENABLE T2 || PG12 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 204 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| DIR 5 || PE13 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 141 || PU ENABLE T3 || PG13 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 205 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| DIR 6 || PE14 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 142 || OFFSET-T0 || PG0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 192 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| DIR 7 || PE15 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 143 || OFFSET-T1 || PG1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 193 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 0 || PE0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 128 || OFFSET-T2 || PG3 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 194 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 1 || PE1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 129 || OFFSET-T3 || PG8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 200 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 2 || PE2 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 130 || STEPPER UART 0-3 || PE16 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 144 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 3 || PE3 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 131 || STEPPER UART 4-5 || PD24 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 120 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 4 || PE4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 132 || STEPPER UART 6 || PD2 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 98 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 5 || PE5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 133 || STEPPER UART 7 || PD3 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 99 ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 6 || PD0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 96 ||  ||  ||style=&amp;quot;border-right:solid 2px;&amp;quot;|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| STEP DIAG 7 || PD1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 97 ||  ||  ||style=&amp;quot;border-right:solid 2px;&amp;quot;|  ||  ||  || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==STM32F031==&lt;br /&gt;
The STM32 is a Cortex M0 powered micro controller handling analog inputs and PWM outputs. It does not control any hard real time aspects of the print, that is handled by the AR100 core realized as a separate core in the A64 SoC. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&lt;br /&gt;
! Name !! Bank and pin !!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number !! Name !! Bank and pin !!style=&amp;quot;border-right:solid 2px;&amp;quot;| Number !! Name !! Bank and pin !! Number&lt;br /&gt;
|-&lt;br /&gt;
| HEATER E0 || PA8 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 18 || THERMISTOR 0 || PA0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 6 || ES1-PWM-OUT || PB3 || 26&lt;br /&gt;
|-&lt;br /&gt;
| HEATER E1 || PA9 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 19 || THERMISTOR 1 || PA1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 7 || PWM-ES2-OUT || PB6 || 29&lt;br /&gt;
|-&lt;br /&gt;
| HEATER E2 || PA10 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 20 || THERMISTOR 2 || PA2 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 8 || EXT 1 || PB7 || 30&lt;br /&gt;
|-&lt;br /&gt;
| HEATER BED || PA11 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 21 || THERMISTOR 3 || PA3 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 9 || EXT 2 || PB8 || 32&lt;br /&gt;
|-&lt;br /&gt;
| FAN 0 || PF0 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 2 || BOARD VOLTAGE || PA4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 10 || EXT 3 || PA13 || 23&lt;br /&gt;
|-&lt;br /&gt;
| FAN 1 || PB1 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 15 || BOARD CURRENT || PA5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 11 || EXT 4 || PB2 || 16&lt;br /&gt;
|-&lt;br /&gt;
| FAN 3 || PB4 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 27 || BOARD TEMPERATURE || PA6 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 12 || USER LED || PA12 || 22&lt;br /&gt;
|-&lt;br /&gt;
| FAN 2 || PB5 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 28 || COLD JUNCTION || PA7 ||style=&amp;quot;border-right:solid 2px;&amp;quot;| 13 || FAN_CURRENT || PB0 || 14&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==DBG header==&lt;br /&gt;
The debug header has UART 0 layed out on some of the pins and is used for interacting with u-boot and getting early debug messages from the Linux kernel. It also has a the option to connect a &amp;quot;boot&amp;quot; button so the board can be safely started and shut down from the 3D-printers front panel. The USR pin can be used to light up a an LED or some other custom function. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Pin&lt;br /&gt;
!Function&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|UART RX&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|UART TX&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|3.3V&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|BOOT&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|USR&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to wire up a boot button so it is accessible from the outside of the printer. This would be the preferred way to start and stop the board. It works the same way as a boot button on any moderns computer does. Press once to shut down a running board, and press and hold for two seconds in order to boot a board. The button should be wired up between the &amp;quot;NO&amp;quot; and &amp;quot;COM&amp;quot; on the button. The light in the button can be connected between +3.3V and the &amp;quot;USR&amp;quot; on the header. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:DBG header.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==MCU header==&lt;br /&gt;
The MCU header is used for connecting external peripherals to the STM32F031 micro controller on the board. There are 4 pins in total available to use. In addition, there is a ground pin and a 3.3 V pin available. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Pin&lt;br /&gt;
!Function&lt;br /&gt;
!Alt&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|PB7&lt;br /&gt;
|I2C1_SDA&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|PB8&lt;br /&gt;
|I2C1_SCL&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|3.3V&lt;br /&gt;
|0.7-3.3V&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|PA13&lt;br /&gt;
|EXTI 13&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|PB2&lt;br /&gt;
|EXTI 2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==SPI on S6 and S7 headers==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:S6 S7 headers.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Pin&lt;br /&gt;
!Function&lt;br /&gt;
!Alt&lt;br /&gt;
|-&lt;br /&gt;
|S6-3&lt;br /&gt;
|PD0&lt;br /&gt;
|SPI1_CS&lt;br /&gt;
|-&lt;br /&gt;
|S7-3&lt;br /&gt;
|PD1&lt;br /&gt;
|SPI1_CLK&lt;br /&gt;
|-&lt;br /&gt;
|S6-5&lt;br /&gt;
|PD2&lt;br /&gt;
|SPI1_MOSI&lt;br /&gt;
|-&lt;br /&gt;
|S7-5&lt;br /&gt;
|PD3&lt;br /&gt;
|SPI1_MISO&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===LEDs===&lt;br /&gt;
There are 15 white LEDs on the board. Here is what they mean&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Location&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|D2&lt;br /&gt;
|By PMIC&lt;br /&gt;
|Board powered&lt;br /&gt;
|-&lt;br /&gt;
|D3&lt;br /&gt;
|By heater BED &lt;br /&gt;
|BED output on&lt;br /&gt;
|-&lt;br /&gt;
|D4&lt;br /&gt;
|By fan 0&lt;br /&gt;
|Fan 0 is on&lt;br /&gt;
|-&lt;br /&gt;
|D5&lt;br /&gt;
|By fan 1&lt;br /&gt;
|Fan 1 is on&lt;br /&gt;
|-&lt;br /&gt;
|D6&lt;br /&gt;
|By heater H2&lt;br /&gt;
|Heater H2 is on&lt;br /&gt;
|-&lt;br /&gt;
|D7&lt;br /&gt;
|By fan 2&lt;br /&gt;
|Fan 2 is on&lt;br /&gt;
|-&lt;br /&gt;
|D8&lt;br /&gt;
|By heater H0&lt;br /&gt;
|Heater H0 is on&lt;br /&gt;
|-&lt;br /&gt;
|D9&lt;br /&gt;
|By fan 3&lt;br /&gt;
|Fan 3 is on&lt;br /&gt;
|-&lt;br /&gt;
|D10&lt;br /&gt;
|By heater H1&lt;br /&gt;
|Heater H1 is on&lt;br /&gt;
|-&lt;br /&gt;
|D12&lt;br /&gt;
|By input connector&lt;br /&gt;
|High voltage domain is on&lt;br /&gt;
|-&lt;br /&gt;
|D15&lt;br /&gt;
|By eMMC chip&lt;br /&gt;
|eMMC activity&lt;br /&gt;
|-&lt;br /&gt;
|D17&lt;br /&gt;
|By USB hub chip&lt;br /&gt;
|USB activitiy&lt;br /&gt;
|-&lt;br /&gt;
|D18&lt;br /&gt;
|By the USB C connector&lt;br /&gt;
|Linux Heartbeat&lt;br /&gt;
|-&lt;br /&gt;
|D19&lt;br /&gt;
|By the A64 SoC&lt;br /&gt;
|CPU activity&lt;br /&gt;
|-&lt;br /&gt;
|D20&lt;br /&gt;
|By the STM32&lt;br /&gt;
|Klipper running on STM32&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Buttons===&lt;br /&gt;
There are 3 push buttons on the board. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|FEL&lt;br /&gt;
|Enter FEL-mode of the A64&lt;br /&gt;
|-&lt;br /&gt;
|BOOT&lt;br /&gt;
|Boots or shuts down the board&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|Hard reset of the CPU&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Current limits==&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
The amount of current that can be drawn on the two USB host connectors closest to the HDMI connector is not according to spec. The combined current draw for USB 1 and 2 should not exceed 0.4 A. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name&lt;br /&gt;
!Limit&lt;br /&gt;
|-&lt;br /&gt;
|5V-ES (endstops)&lt;br /&gt;
|0.75 A&lt;br /&gt;
|-&lt;br /&gt;
|USB host 3 and 4 each (5VP)&lt;br /&gt;
|1.1 A&lt;br /&gt;
|-&lt;br /&gt;
|USB host 1 and 2 each (VSP)&lt;br /&gt;
|0.75 A&lt;br /&gt;
|-&lt;br /&gt;
|Thermistors&lt;br /&gt;
|0.75 A&lt;br /&gt;
|-&lt;br /&gt;
|MCU connector&lt;br /&gt;
|0.5 A&lt;br /&gt;
|-&lt;br /&gt;
|Fan connectors&lt;br /&gt;
|programmable&lt;br /&gt;
|-&lt;br /&gt;
|Heater connectors&lt;br /&gt;
|programmable&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Wiring=&lt;br /&gt;
Below is a wiring diagram meant to aid in connecting motors, fans, extruders and hot ends to the control board. On the board, there is a small + sign next to output connectors where polarity is important. If passive heating elements are used, polarity is not important, but if those outputs are to be used with SSRs or relays, polarity must be observed. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Rewire-Recore-A7.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Network connection==&lt;br /&gt;
Recore is designed to be controlled through a browser on a computer, so the board must be connected to the local LAN or wifi network. Connect an ethernet cable between the board and a switch. The ping utility can be used to ensure that the board is discovered on the network.&lt;br /&gt;
&lt;br /&gt;
===LAN setup===&lt;br /&gt;
Recore with Refactor is running avahi and should announce itself on the network once a connection has been established. On a Linux based host computer, it is possible to search for a booted device using the following command: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ping recore.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If the device is present, an SSH connection can be established:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh debian@recore.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Furthermore, a web interface running OctoPrint/Mainsail/Fluidd can be found using a browser:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
http://recore.local&lt;br /&gt;
&lt;br /&gt;
For more information on this, look at the Rebuild or Refactor wiki pages.&lt;br /&gt;
&lt;br /&gt;
==Wifi setup==&lt;br /&gt;
Wifi can be set up by connecting a wifi dongle to one of the USB host ports. Once the USB dongle has been connected, and the board has been booted, access to the terminal command line can be given through a host computer. The board should appear as a TTY ACM device. On a Linux based host computer, the terminal program `minicom` can be used to get access. From the host computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
minicom -o -D /dev/ttyACM0 115200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the host computer is running Windows, [https://www.putty.org/ Putty] can be used to get access. &lt;br /&gt;
&lt;br /&gt;
Once a connection has been established, the wifi network can be set up using the command nmtui. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nmtui&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Follow the instructions on screen to edit and activate the wifi connection. &lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
If the board is powered through the USB C connector, only the two USB host ports next to the HDMI port is powered. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mating Connectors==&lt;br /&gt;
The power connectors on the board are available either in the web shop as part of a [https://www.iagent.no/product/connector-pack/ connector pack] or directly from Digi-key etc.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt; &lt;br /&gt;
[[File:Connectors-all.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Four pin male: TBP01P1-508-04BE [[https://www.digikey.com/en/products/detail/cui-devices/TBP01P1-508-04BE/10238369 | Digi-key]]&lt;br /&gt;
&lt;br /&gt;
Two pin male: TBP01P1-508-02BE [[https://www.digikey.com/en/products/detail/cui-devices/TBP01P1-508-02BE/10238367 | Digi-key]]&lt;br /&gt;
&lt;br /&gt;
=Klipper Configuration=&lt;br /&gt;
There are no jumpers on Recore and no hard fuses. Everything is software configurable and resettable from software. This gives great power and flexibility without requiring physical access to the board once it has been installed. But with great power comes great responsibility. It is possible to break things if care is not taken during setup. There is one setting in particular that is worth mentioning: ES0 can have either +5V or +12V on the power pin. This is in order to allow a standard industrial inductive sensor to be used on that end stop. If a 5V only peripheral is connected, that could damage the connected peripheral. &lt;br /&gt;
&lt;br /&gt;
The default config file for Recore A6 can be found in the repository: [https://github.com/intelligent-agent/klipper/blob/master/config/generic-recore-a7.cfg generic-recore-a7.cfg]&lt;br /&gt;
&lt;br /&gt;
===TMC2209===&lt;br /&gt;
The 6 stepper drivers on Recore are of type TMC2209 from Trinamic. Each stepper has a configuration interface with a bidirectional UART port that is connected to a pin on the A64. The GPIO bit-banging functionality of Klipper is used to communicate with the stepper drivers. &lt;br /&gt;
&lt;br /&gt;
Here is a table with pins and addresses for the steppers&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Stepper driver config&lt;br /&gt;
|-&lt;br /&gt;
|Name&lt;br /&gt;
|Pins&lt;br /&gt;
|Address&lt;br /&gt;
|-&lt;br /&gt;
|S0&lt;br /&gt;
|PE16&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|S1&lt;br /&gt;
|PE16&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|S2&lt;br /&gt;
|PE16&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|S3&lt;br /&gt;
|PE16&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|S4&lt;br /&gt;
|PD24&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|S5&lt;br /&gt;
|PD24&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|S6&lt;br /&gt;
|PD2&lt;br /&gt;
|0-3&lt;br /&gt;
|-&lt;br /&gt;
|S7&lt;br /&gt;
|PD3&lt;br /&gt;
|0-3&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== External stepper drivers ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Ext-driver.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
It is possible to connect up to two external stepper drivers to Recore in addition to the 6 divers installed on the board. &lt;br /&gt;
These can be connected using the headers S6 and S7.&lt;br /&gt;
&lt;br /&gt;
See also [[Restep_A1]] for a convenient alternative external stepper driver.&lt;br /&gt;
&lt;br /&gt;
==Temperature inputs==&lt;br /&gt;
4 different temperature devices can be connected to the 4 analog inputs on Recore. Thermistor, Thermocouple, PT100 with INA826 and PT1000 without the use of a pre-amplifier.&lt;br /&gt;
===Thermistor===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Thermistor.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Make sure the pull-up is enabled and the op-amp gain is set to 1.&lt;br /&gt;
&lt;br /&gt;
===Thermocouple===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Thermocouple.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure the pull-up is disabled and the op-amp gain is set to 100.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[recore]&lt;br /&gt;
...&lt;br /&gt;
gain_t0: 100&lt;br /&gt;
pullup_t0: 0&lt;br /&gt;
offset_t0: 1&lt;br /&gt;
&lt;br /&gt;
[Extruder]&lt;br /&gt;
...&lt;br /&gt;
sensor_type: Type K&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===PT100 with INA826===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:PT100.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to use a PT100 sensor, an external amplifier board must be used. There is an example configuration for Klipper that &lt;br /&gt;
uses this. The ADC reference voltage is 5.0 by default, but for Recore it is 3.3 V. Here is an example:  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Extruder]&lt;br /&gt;
...&lt;br /&gt;
sensor_type: PT100 INA826&lt;br /&gt;
adc_voltage: 3.27&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The pull-up must also be disabled.&lt;br /&gt;
&lt;br /&gt;
===PT1000===&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:PT1000.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Make sure the pull-up is enabled and the gain is set to 1. In the latest version, the sensor must be prefixed with RECORE. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Extruder]&lt;br /&gt;
...&lt;br /&gt;
sensor_type: PT1000&lt;br /&gt;
pullup_resistor: 4750&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Connecting other sensors=&lt;br /&gt;
The board has been designed to work with a range of 3rd party sensors for automating the print.&lt;br /&gt;
==BLtouch==&lt;br /&gt;
There are two versions of the BLtouch, the difference is the color of one of the GND wires. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Antclabs BLtouch sensor wiring.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The Creality version has a blue GND wire. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Creality BLtouch sensor wiring.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
There have been some cases of bad quality control for the Creality BLTouches, where the pinout on the sensor side have not matched the color coding in the photos/documentation. It might be good to make sure the color codes match up. For the Creality it should be, from left to right: &lt;br /&gt;
Blue, red, yellow, black, white. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When connected per wiring diagram above, setting up BLtouch can be done by adding the following section to printer.cfg.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bltouch]&lt;br /&gt;
sensor_pin: ar100:PH6&lt;br /&gt;
control_pin: !PB3&lt;br /&gt;
speed:15&lt;br /&gt;
samples:1&lt;br /&gt;
pin_move_time: 0.675&lt;br /&gt;
sample_retract_dist: 10&lt;br /&gt;
probe_with_touch_mode: true&lt;br /&gt;
stow_on_each_sample: false&lt;br /&gt;
x_offset:29.2&lt;br /&gt;
y_offset:-34&lt;br /&gt;
z_offset:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Inductive Sensor ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Inductive sensor wiring 2.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Connect the inductive sensor on ES0. You can choose either 5V or 12V output on the voltage pin. Inductive sensors often come with an industry standard voltage input of 6-36 V. For this reason there is a 12 V LDO (Low drop-out) voltage regulator integrated on the board. This voltage regulator can be output on the V+ pin of the connector marked ES0. If the Input to the board is 12 V, the LDO will supply a lower voltage, around 10.6 or so.&lt;br /&gt;
&lt;br /&gt;
==ADXL345==&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
The ADXL345 seems to cause Klipper to shut down when trying to calibrate at a high rate. A workaround is to use a Pi Pico or similar MCU to communicate with the ADXL345, or to lower the rate. It&#039;s been tested working at 400, but not 800 which is the recommended minimum. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
See also [[Remove_A1]], a convenient finished accelerometer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt; &lt;br /&gt;
[[File:Wiring.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A popular accelerometer sensor for doing input shaping with Klipper is the ADXL345. This can be connected to the connectors S6/S7. There is no hardware SPI interface available, but a software implementation in Klipper exists. &lt;br /&gt;
Note: Only experimental support has been tested for this. &lt;br /&gt;
https://learn.adafruit.com/adxl345-digital-accelerometer&lt;br /&gt;
&lt;br /&gt;
Config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[adxl345]&lt;br /&gt;
cs_pin: ar100:PL11&lt;br /&gt;
spi_software_sclk_pin: ar100:PL10&lt;br /&gt;
spi_software_mosi_pin: ar100:PE15&lt;br /&gt;
spi_software_miso_pin: ar100:PE14&lt;br /&gt;
rate: 400&lt;br /&gt;
&lt;br /&gt;
[resonance_tester]&lt;br /&gt;
accel_chip: adxl345&lt;br /&gt;
probe_points:&lt;br /&gt;
    100, 100, 20  # an example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using a Raspberry Pi Pico:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[adxl345]&lt;br /&gt;
cs_pin: pico:gpio17&lt;br /&gt;
spi_bus: spi0c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==MCP2515==&lt;br /&gt;
It&#039;s possible to connect a CAN controller like the MCP2515 to Recore.&lt;br /&gt;
It&#039;s important to keep in mind that the GPIO/SPI pins are 3.3V and not 5V tolerant, so the MCP2515 chip must be run from a 3.3V source, while the TIA1050 chip must be powered with 5V. All headers have pin 1 marked as a square pad, while the others are round. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MCP2515&lt;br /&gt;
!Recore&lt;br /&gt;
|-&lt;br /&gt;
|5V&lt;br /&gt;
|ES1-3&lt;br /&gt;
|-&lt;br /&gt;
|3.3V&lt;br /&gt;
|MCU-3&lt;br /&gt;
|-&lt;br /&gt;
|GND&lt;br /&gt;
|MCU-4&lt;br /&gt;
|-&lt;br /&gt;
|INT&lt;br /&gt;
|S6-1&lt;br /&gt;
|-&lt;br /&gt;
|SPI1_CS&lt;br /&gt;
|S6-3&lt;br /&gt;
|-&lt;br /&gt;
|SPI1_CLK&lt;br /&gt;
|S6-5&lt;br /&gt;
|-&lt;br /&gt;
|SPI1_MOSI&lt;br /&gt;
|S7-3&lt;br /&gt;
|-&lt;br /&gt;
|SPI1_MISO&lt;br /&gt;
|S7-5&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Neopixels ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Neopixels wiring A7.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use endstop ES1 (PB3) or ES2 (PB6). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
Make sure to use a 100 ohm pull-up from pin S (pin 2) to pin 5V (pin 3) &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[neopixel my_neopixel]&lt;br /&gt;
pin: PB3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also [[Relit_A0]]&lt;br /&gt;
&lt;br /&gt;
==RC Servo==&lt;br /&gt;
&amp;lt;div class=&amp;quot;img-res&amp;quot;&amp;gt;&lt;br /&gt;
[[File:RC-servo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Endstop 1 and 2 can be used as PWM outputs with 5V levels. Rev A6 is the first board with support for this. &lt;br /&gt;
More testing and configuration documentation is needed.&lt;br /&gt;
&lt;br /&gt;
==Filament runout sensor==&lt;br /&gt;
&amp;lt;div class=&amp;quot;img-res&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Filament-runout-sensor.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Any of the 6 end stops can be used for connecting a filament runout sensor&lt;br /&gt;
&lt;br /&gt;
=== Enable host mode on the USB-C connector ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mount -o remount,rw /boot&lt;br /&gt;
sudo armbian-add-overlay /boot/overlay-user/sun50i-a64-usb-host.dts&lt;br /&gt;
sudo mount -o remount,ro /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Software for Recore=&lt;br /&gt;
Recore comes with the Linux distro Refactor (Armbian) pre-installed on the eMMC. &lt;br /&gt;
For more instructions about software for Recore, see the Refactor wiki page: &lt;br /&gt;
[[ Refactor ]]&lt;br /&gt;
&lt;br /&gt;
=== AR100 ===&lt;br /&gt;
Please see: [[AR100]]&lt;br /&gt;
&lt;br /&gt;
=== Manual control and testing ===&lt;br /&gt;
https://wiki.iagent.no/wiki/Manual_control_and_testing&lt;br /&gt;
&lt;br /&gt;
=Performance=&lt;br /&gt;
===Start-up time===&lt;br /&gt;
With a maximum clock for MMC2 of 200 MHz, here is the start-up time: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# systemd-analyze&lt;br /&gt;
Startup finished in 3.011s (kernel) + 12.292s (userspace) = 15.303s &lt;br /&gt;
graphical.target reached after 11.934s in userspace&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===eMMC read and write speed===&lt;br /&gt;
eMMC write speed: 28.8 MB/s&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# dd if=/dev/zero of=/mnt/emmc/1GB.bin bs=1M count=1000&lt;br /&gt;
1000+0 records in&lt;br /&gt;
1000+0 records out&lt;br /&gt;
1048576000 bytes (1.0 GB, 1000 MiB) copied, 36.4307 s, 28.8 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eMMC read speed: 112 MB/s&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# dd if=/mnt/emmc/1GB.bin of=/dev/null bs=1M count=1000&lt;br /&gt;
1000+0 records in&lt;br /&gt;
1000+0 records out&lt;br /&gt;
1048576000 bytes (1.0 GB, 1000 MiB) copied, 9.34956 s, 112 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== USB read and write speed (Reflash USB drive)===&lt;br /&gt;
USB write speed: 7.7 MB/s&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# dd if=/dev/zero of=/mnt/usb/1GB.bin bs=1M count=1000&lt;br /&gt;
1000+0 records in&lt;br /&gt;
1000+0 records out&lt;br /&gt;
1048576000 bytes (1.0 GB, 1000 MiB) copied, 135.476 s, 7.7 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@recore:~# dd if=/mnt/usb/1GB.bin of=/dev/null bs=1M &lt;br /&gt;
1000+0 records in&lt;br /&gt;
1000+0 records out&lt;br /&gt;
1048576000 bytes (1.0 GB, 1000 MiB) copied, 67.613 s, 15.5 MB/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Measured voltages==&lt;br /&gt;
The final stages of Recore manufacturing consists of testing, calibration and flashing of firmware. &lt;br /&gt;
The calibration stage measures a number of voltages on the board and classifies the input stages gain and offset. &lt;br /&gt;
Instruments used: &lt;br /&gt;
* HP 3458A, 8.5 digit multimeter&lt;br /&gt;
* HP 3245A, Universal Source &lt;br /&gt;
&lt;br /&gt;
====Microcontroller voltages====&lt;br /&gt;
VDDA uC: 3.312 V&amp;lt;br&amp;gt;&lt;br /&gt;
VDD uC: 3.312 V&lt;br /&gt;
&lt;br /&gt;
Voltage from the PMIC supplied as bias:&amp;lt;br&amp;gt;&lt;br /&gt;
0.706 V &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====5V Buck converter ripple and noise ====&lt;br /&gt;
The 5V step down/Buck converter is a AOZ2151EQI-30. It can provide 4A and has an input voltage range of 12-28V. &lt;br /&gt;
It is hard wired to be in PWM mode. PFM mode results in a loud whine.&lt;br /&gt;
&lt;br /&gt;
Below is a screenshot of the ripple and noise across the  the 5V rail with a normal kernel running. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:5V ripple A7.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Input stage===&lt;br /&gt;
When drawing a constant current of 20 A from the bed connector with and without any forced convection. The temperature measured was with the on board thermistor. Using a thermal camera, the temperature displayed matches well with the temperature reported by the camera. The maximum board temperature of 100 degrees C is reached after about 10 minutes with no forced convection. &lt;br /&gt;
Ambient temperature in the room: 20.1 degrees C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Input stage temperature no fan.png|A7 Input stage temperature no fan]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With forced convection (a 92 mm Noctua fan) and a current load of 29 A, the maximum temperature reached after 10 minutes was 87.7 degrees C as measured by the on board thermistor. The thermal camera showed a higher temperature of 98 degrees. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Input stage temperature with fan crop.png|Input stage temperature with fan]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Maximum input voltage ====&lt;br /&gt;
Using 1.5 m test leads and a 26 V bench top PSU (Agilent U8002A) a board has been tested for over voltage issues. This was a problem with Rev A6. No issues were found during testing. &lt;br /&gt;
&lt;br /&gt;
====Inrush current====&lt;br /&gt;
During turn on of the high power stage, there will be an inrush current to charge up the bank of capacitors present on the board. &lt;br /&gt;
If no loads are turned on, the inrush current reaches 28 A at peak, depending on PSU and cables. This is important to consider when setting the current limit with device tree. Below is a trace of the current draw of Recore A7 when the input is enabled. The PSU in use was a PeakTech 6160 (30V/30A) benchtop switchmode PSU. The cables used were Pomona B-24-0 and B-24-2, 24&amp;quot; 18 AWG banana plug test leads.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:A7_inrush_current.png|center]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Over current protection====&lt;br /&gt;
There are 3 different sensors present in the input stage for making sure the 12-24 V domain on the board does not overheat during startup and operation. &lt;br /&gt;
# The Fast acting over current protection is to ensure that the high power domain is disabled in the case of a short circuit condition. &lt;br /&gt;
# The current limit set in Klipper monitors the continuous current draw. This is now set at 20 A, but can go up to 30 A and still be within the limits of the connectors and input stage mosfets. &lt;br /&gt;
# The over temperature protection monitors the temperature in the input stage and cuts the power if the temperature goes over 110 degrees. The board should not be kept at this temperature for a prolonged period, but during heated bed heat-up, it can be elevated compared to the rest of the print.&lt;br /&gt;
&lt;br /&gt;
Below is a plot of what the current on the input looks like if there is an over current condition on the high power domain as that domain is turned on. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:A7 over current input turns on.png|center]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a plot of what the current on the input looks like if there is an over current condition after the input has been turned on. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:A7 over current output turns on.png|center]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ADC offset and gain measurements===&lt;br /&gt;
To measure the ADC offset error, measure the voltage on the uC input pin and record when the &lt;br /&gt;
transition from 0 to 1 occurs. It should occur at 0.5 LSB = 3.3/4096/2 = 0.4028 mV. &lt;br /&gt;
Offset: 55.35 mV - 0.4028 mV = 54.95 mV&lt;br /&gt;
&lt;br /&gt;
==Temperature calibration==&lt;br /&gt;
A set of experiments have been carried out to calibrate the different sensors using a dry-well calibrator. &lt;br /&gt;
The reference probe was a Sensing Devices SDL385 PRT. &lt;br /&gt;
The levels of calibration was: room temperature, 50, 100, 150, and 200 degrees C.&lt;br /&gt;
&lt;br /&gt;
===Thermistor===&lt;br /&gt;
The thermistor in use was a standard EPCOS 100K B57560G104F. This thermistor has a resistance tolerance of 2 %. The value of the pull-up resistor as measured during calibration was 4740.17501. This value seemed to work well at all levels of calibration, although a little on the high side compared to the reference. &lt;br /&gt;
&lt;br /&gt;
===PT1000===&lt;br /&gt;
The PT1000 in use was a Heraeus 31500989 [https://www.heraeus.com/media/media/hne/datasheets/sensor_assemblies_1/Heraeus_W-EYK_Sensor_E.pdf] works well. The tolerance class given in the datasheet is &amp;quot;F 0.10 / Class 1/3 B&amp;quot;. There are two different tolerances here: F0.10 and one third of Class B. The accuracy looks good at all temperatures, perhaps a bit on the high side if using the calibrated value for the pull-up. During the testing, 10 ohm was subtracted from the calibrated value.&lt;br /&gt;
&lt;br /&gt;
===PT100===&lt;br /&gt;
The PT100 used in the calibration was the E3D PT100 with the INA826 amplifier board. There is no datasheet available for the PT100 sensor and no mention of what tolerance there is on the reference resistors used. Furthermore Klipper expects the reference voltage to be 5V exactly, and there is no way to supply a measured value. Measurements on Recore has shown that the value is often a bit lower due to the PMIC for the 5V output on the &amp;quot;input&amp;quot; ports. 4.979 V has been measured and is likely an expected value.&lt;br /&gt;
&lt;br /&gt;
===Thermocouple===&lt;br /&gt;
Using the calibration values directly will give a slight offset to the thermocouple measurements. &lt;br /&gt;
The gain and ADC voltage can be used as measured during calibration. It should be in the region of 101 for gain and 3.307 for ADC voltage. As for the offset, that can be increased slightly to compensate for the cold junction temperature difference. For instance, the measured offset for the test board was 0.0032960, but a value of 0.00340 fit the data points well. The measurements were done on T2, so it it possible that the distance from the cold junction caused the offset. The cold junction thermistor is located between T0 and T1.&lt;br /&gt;
&lt;br /&gt;
=FAQ=&lt;br /&gt;
====Where can I ask for help?====&lt;br /&gt;
:You can join the Discord: https://discord.gg/bCnp9H5SB5&lt;br /&gt;
====What comes in the box with the Recore? Specifically, terminal connectors for power, etc?====&lt;br /&gt;
:It&#039;s only the board, no cables or connectors. There is a bag of connectors available to purchase in the web shop.&lt;br /&gt;
====Do I need access to those 3 buttons on the board?====&lt;br /&gt;
:It is not necessary to have access to the three buttons for normal use.&lt;br /&gt;
====What&#039;s the maximum current draw for heat bed?====&lt;br /&gt;
:This has been tested up to 30 A with good cooling using a fan and a heat sink.&lt;br /&gt;
&lt;br /&gt;
====I have a gadget that I want to connect with SPI. Is that possible?====&lt;br /&gt;
:On Recore A7, there is support for an SPI peripheral. The pins are broken out on header S6/S7.&lt;br /&gt;
&lt;br /&gt;
====What exactly is the role of the AR100 device?====&lt;br /&gt;
:The AR100 handles the fast real-time aspects, mainly the stepper motors and end stops.&lt;br /&gt;
&lt;br /&gt;
====What voltage fans are supported?====&lt;br /&gt;
:The same voltage as the input voltage, either 12 V or 24 V. You can experiment with PWM for running lower voltage fans on 24 V input.&lt;br /&gt;
====Where is the board layout file?====&lt;br /&gt;
:The Layout file will not be available. It is an &amp;quot;open schematic&amp;quot; board, not open source hardware&lt;br /&gt;
====Where are you shipping from?====&lt;br /&gt;
:Boards are shipping from Norway. Eventually shipping will be from a warehouse in the US&lt;br /&gt;
&lt;br /&gt;
= Known hardware issues for rev A7=&lt;br /&gt;
=== Neopixels needs a lower value pull-up resistor than the 1K present on the board===&lt;br /&gt;
&lt;br /&gt;
==List of changes to revision A7 from A6==&lt;br /&gt;
# Step down AOZ2151EQI-30, lower dissipation. &lt;br /&gt;
# Separate fan over current protection.&lt;br /&gt;
# Use one of the electrolytic capacitors as input capacitor. &lt;br /&gt;
# Add a 10K pull-down on the USB power lines, so the USB over-current is unambiguous.&lt;br /&gt;
# Make op-amp more symmetric in order to improve the amplifier issue from A6.&lt;br /&gt;
# Add USR pin to the DBG header&lt;br /&gt;
# Add BOOT pin to the DBG header&lt;br /&gt;
# Move the USB activity LED close to the USB hub. &lt;br /&gt;
# Use CY7C65634 USB hub because GL850G-OHY37 is discontinued&lt;br /&gt;
# Change MCU and DBG connectors from 4 to 6 pins.&lt;br /&gt;
# Add SPI to S6/S7&lt;br /&gt;
# Add a guard ring on the edge on all layers. &lt;br /&gt;
# Use Kelvin connection on mosfets for Op-amps.&lt;br /&gt;
# Mitigate inrush current. Consider C214 = 1 nF from G to GND.&lt;br /&gt;
# Make better return paths for eth clock traces.&lt;br /&gt;
&lt;br /&gt;
= Migrating Klipper config from A6 to A7 =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Section [recore]&lt;br /&gt;
|-&lt;br /&gt;
|Before&lt;br /&gt;
|After&lt;br /&gt;
|-&lt;br /&gt;
|revision: A6&lt;br /&gt;
|revision: A7&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|[tmc2209 stepper_x]&lt;br /&gt;
|-&lt;br /&gt;
|Before&lt;br /&gt;
|After&lt;br /&gt;
|-&lt;br /&gt;
|uart_pin: ar100:PB1&lt;br /&gt;
tx_pin: ar100:PB0&lt;br /&gt;
|uart_pin: ar100:PE16&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|[mcu]&lt;br /&gt;
|-&lt;br /&gt;
|Before&lt;br /&gt;
|After&lt;br /&gt;
|-&lt;br /&gt;
|serial: /dev/ttyS4&lt;br /&gt;
|serial: /dev/ttyS2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|[fan]&lt;br /&gt;
|-&lt;br /&gt;
|Before&lt;br /&gt;
|After&lt;br /&gt;
|-&lt;br /&gt;
|pin: PB0&lt;br /&gt;
|pin: PF0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=File:Rewire-Recore-A7.png&amp;diff=1643</id>
		<title>File:Rewire-Recore-A7.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=File:Rewire-Recore-A7.png&amp;diff=1643"/>
		<updated>2026-06-13T12:55:07Z</updated>

		<summary type="html">&lt;p&gt;Elias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rewire-Recore-A7&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=File:Recore-wire-diagram-3.png&amp;diff=1642</id>
		<title>File:Recore-wire-diagram-3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=File:Recore-wire-diagram-3.png&amp;diff=1642"/>
		<updated>2026-06-13T11:20:59Z</updated>

		<summary type="html">&lt;p&gt;Elias: Elias uploaded a new version of File:Recore-wire-diagram-3.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recore-wire-diagram-3&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=File:Recore-wire-diagram-3.png&amp;diff=1641</id>
		<title>File:Recore-wire-diagram-3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=File:Recore-wire-diagram-3.png&amp;diff=1641"/>
		<updated>2026-06-13T11:19:25Z</updated>

		<summary type="html">&lt;p&gt;Elias: Elias uploaded a new version of File:Recore-wire-diagram-3.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recore-wire-diagram-3&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1639</id>
		<title>Reheat A0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1639"/>
		<updated>2026-06-04T20:46:00Z</updated>

		<summary type="html">&lt;p&gt;Elias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reheat is a 6 output heater board with temperature sensors and fans for multi material printing.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reheat A0.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
* [https://github.com/intelligent-agent/Recore/blob/master/Schematics/Reheat_A0.pdf Reheat A0 Schematics (PDF)]&lt;br /&gt;
==Config tool==&lt;br /&gt;
* [https://config.iagent.no/ Reheat A0 config tool]&lt;br /&gt;
==pin description==&lt;br /&gt;
This is temporary while waiting for a proper pinout&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reheat A0 pinout.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
* RP2354B microcontroller (ARM Cortex-M33, 150 MHz)&lt;br /&gt;
* 6x heater outputs (24 V, MOSFET-switched)&lt;br /&gt;
* 6x fan outputs (24 V PWM) with tachometer inputs&lt;br /&gt;
* 6x thermistor/temperature sensor inputs&lt;br /&gt;
** Supports: NTC 10K, NTC 100K, PT100, PT1000, Type K thermocouple&lt;br /&gt;
** Jumper-selectable per channel&lt;br /&gt;
* 12x endstop inputs (5 V tolerant, TVS-protected)&lt;br /&gt;
** ENDSTOP-12 supports a bidirectional signal (e.g. filament encoder)&lt;br /&gt;
* USB-C interface (USB 2.0)&lt;br /&gt;
* 24 V power input with onboard 5 V (3 A) and 3.3 V regulation&lt;br /&gt;
* Overcurrent detection on fan bus&lt;br /&gt;
&lt;br /&gt;
==Pinout==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! GPIO !! Signal !! Connector&lt;br /&gt;
|-&lt;br /&gt;
| GPIO0 || HEATER-1 || J2&lt;br /&gt;
|-&lt;br /&gt;
| GPIO1 || HEATER-2 || J3&lt;br /&gt;
|-&lt;br /&gt;
| GPIO2 || HEATER-3 || J6&lt;br /&gt;
|-&lt;br /&gt;
| GPIO3 || HEATER-4 || J11&lt;br /&gt;
|-&lt;br /&gt;
| GPIO4 || HEATER-5 || J12&lt;br /&gt;
|-&lt;br /&gt;
| GPIO5 || HEATER-6 || J13&lt;br /&gt;
|-&lt;br /&gt;
| GPIO6 || FAN-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO7 || FAN-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO8 || FAN-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO9 || FAN-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO10 || FAN-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO11 || FAN-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO12 || TACH-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO13 || TACH-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO14 || TACH-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO15 || TACH-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO16 || TACH-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO17 || TACH-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO18 || ENDSTOP-1 || J14&lt;br /&gt;
|-&lt;br /&gt;
| GPIO19 || ENDSTOP-2 || J15&lt;br /&gt;
|-&lt;br /&gt;
| GPIO20 || ENDSTOP-3 || J16&lt;br /&gt;
|-&lt;br /&gt;
| GPIO21 || ENDSTOP-4 || J17&lt;br /&gt;
|-&lt;br /&gt;
| GPIO22 || ENDSTOP-5 || J18&lt;br /&gt;
|-&lt;br /&gt;
| GPIO23 || ENDSTOP-6 || J19&lt;br /&gt;
|-&lt;br /&gt;
| GPIO24 || ENDSTOP-7 || J20&lt;br /&gt;
|-&lt;br /&gt;
| GPIO25 || ENDSTOP-8 || J21&lt;br /&gt;
|-&lt;br /&gt;
| GPIO26 || ENDSTOP-9 || J22&lt;br /&gt;
|-&lt;br /&gt;
| GPIO27 || ENDSTOP-10 || J23&lt;br /&gt;
|-&lt;br /&gt;
| GPIO28 || ENDSTOP-11 || J24&lt;br /&gt;
|-&lt;br /&gt;
| GPIO29 || ENDSTOP-12 || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO30 || MUX-S0 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO31 || MUX-S1 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO32 || MUX-S2 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO33 || PWM-GAIN || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO34 || PWM-OFFSET || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO35 || PWM-CURRENT || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO36 || EN-PULLUP || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO37 || ENDSTOP-12-DIR || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO38 || FAN-OC (overcurrent) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO40 / ADC0 || THERM-1 || J27&lt;br /&gt;
|-&lt;br /&gt;
| GPIO41 / ADC1 || THERM-2 || J28&lt;br /&gt;
|-&lt;br /&gt;
| GPIO42 / ADC2 || THERM-3 || J29&lt;br /&gt;
|-&lt;br /&gt;
| GPIO43 / ADC3 || THERM-4 || J30&lt;br /&gt;
|-&lt;br /&gt;
| GPIO44 / ADC4 || THERM-5 || J31&lt;br /&gt;
|-&lt;br /&gt;
| GPIO45 / ADC5 || THERM-6 || J32&lt;br /&gt;
|-&lt;br /&gt;
| GPIO46 / ADC6 || ADC (MUX output) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO47 / ADC7 || CURRENT sense || Internal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Hardware connections==&lt;br /&gt;
&lt;br /&gt;
===Power===&lt;br /&gt;
The board takes 24 V DC on a 4-pin connector (J33). A fuse (F1) and a 2 mΩ current-sense resistor (R98) protect the input. Onboard regulators provide +5 V (TPS54302 buck converter, 3 A) and +3.3 V (AMS1117-3.3, 1 A) for logic and sensor pull-ups.&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
Six heater outputs use 2SK3019 N-channel MOSFETs driven from GPIO0–GPIO5. Each output has a 2-pin female connector and a flyback Schottky diode. The heater voltage is 24 V.&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
Six fan outputs (GPIO6–GPIO11) use N-channel MOSFETs with a 24 V supply. Each has a 3-pin connector (V+, GND, TACH). Tachometer signals are read on GPIO12–GPIO17. An LM393 comparator monitors the fan bus for overcurrent and signals FAN-OC on GPIO38.&lt;br /&gt;
&lt;br /&gt;
===Thermistors===&lt;br /&gt;
Each thermistor channel has a 3-pin connector (J27–J32) with a jumper (JP1–JP6) to select the measurement mode. An analog MUX (CD4051) and op-amp signal conditioning chain feed the ADC inputs (GPIO40–GPIO45). The signal conditioning supports:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sensor type !! Measurement method&lt;br /&gt;
|-&lt;br /&gt;
| NTC 10K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| NTC 100K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| PT100 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| PT1000 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| Type K thermocouple || ×101 gain amplifier, buffered&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For NTC thermistor or PT1000 measurements, close jumpers JP1–JP6 to connect the 4.7 K pull-up resistors. With the jumpers closed, ADC0–ADC5 (GPIO40–GPIO45) can be used as standard thermistor inputs with a 4.7 K pull-up to 3.3 V, without the need for any additional signal conditioning.&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;br /&gt;
# VUSB is unconnected, so the board requires 24 V power to operate even when connected over USB.&lt;br /&gt;
&lt;br /&gt;
==Klipper configuration==&lt;br /&gt;
&lt;br /&gt;
The Reheat A0 connects to the host over USB and is configured as an MCU in Klipper. Find the serial path with &amp;lt;code&amp;gt;ls /dev/serial/by-id/&amp;lt;/code&amp;gt; and add to &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_XXXXXXXXXXXX-if00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[heater_generic heater1]&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio40&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio41&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[fan_generic fan1]&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
&lt;br /&gt;
[fan_generic fan2]&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Endstops===&lt;br /&gt;
Endstop pins can be referenced in the relevant stepper sections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[stepper_x]&lt;br /&gt;
endstop_pin: reheat:gpio18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Flashing Klipper==&lt;br /&gt;
&lt;br /&gt;
# Put the board in BOOTSEL mode: hold the BOOT button while plugging in USB (or hold BOOT, press RESET, then release BOOT).&lt;br /&gt;
# Build and flash from the Klipper source directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make menuconfig&lt;br /&gt;
# Processor model: rp2350&lt;br /&gt;
# Bootloader offset: No bootloader&lt;br /&gt;
# Communication interface: USBSERIAL&lt;br /&gt;
make&lt;br /&gt;
picotool load out/klipper.uf2 --force&lt;br /&gt;
picotool reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The board will reboot and appear as &amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; (or similar).&lt;br /&gt;
&lt;br /&gt;
==Full config file==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  Reheat_A0.cfg  —  Complete Klipper configuration for the Reheat A0&lt;br /&gt;
#  MCU: RP2354B (RP2350 family, ARM Cortex-M33, 150 MHz, 48 GPIO, 8 ADC)&lt;br /&gt;
#  Source: https://wiki.iagent.no/wiki/Reheat_A0&lt;br /&gt;
#&lt;br /&gt;
#  Board functions:&lt;br /&gt;
#    6x heater outputs (24V MOSFET)        GPIO0..GPIO5&lt;br /&gt;
#    6x fan outputs (24V PWM)              GPIO6..GPIO11&lt;br /&gt;
#    6x fan tachometer inputs              GPIO12..GPIO17&lt;br /&gt;
#    12x endstop inputs (5V tolerant)      GPIO18..GPIO29 (+ GPIO37 dir)&lt;br /&gt;
#    6x thermistor/temperature ADC inputs  GPIO40..GPIO45 (ADC0..ADC5)&lt;br /&gt;
#    analog mux + PWM bias control         GPIO30..GPIO35&lt;br /&gt;
#    endstop pull-up enable                GPIO36&lt;br /&gt;
#    fan over-current flag                 GPIO38&lt;br /&gt;
#    ADC mux output / input-current sense  GPIO46/GPIO47 (ADC6/ADC7)&lt;br /&gt;
#&lt;br /&gt;
#  Each fan is paired with its matching heater (FAN1&amp;lt;-&amp;gt;HEATER1, ...).&lt;br /&gt;
#&lt;br /&gt;
#  Build firmware:  RP2350 (ARM) processor, USB communication.&lt;br /&gt;
#  Flash:  hold BOOT while plugging in USB-C to enter BOOTSEL.&lt;br /&gt;
#  ERRATA: RUN pin is hardwired -&amp;gt; Klipper cannot software-reset the MCU&lt;br /&gt;
#          (re-enter BOOTSEL manually to reflash). USB DP/DM are swapped.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
#  MCU&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
# USB-C, enumerates over USB. Use the stable by-id path:&lt;br /&gt;
#   ls /dev/serial/by-id/*&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_21745F8FD0431B3A-if00&lt;br /&gt;
restart_method: command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
#  Endstop pull-up enable (GPIO36)&lt;br /&gt;
#  Drive high at boot so the 12 endstop inputs read correctly.&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
[static_digital_output endstop_pullup_enable]&lt;br /&gt;
pins: reheat:gpio36&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  HEATERS  (24V MOSFET outputs, paired with ADC thermistors)&lt;br /&gt;
#  Sensor types supported by the board: NTC 10K, NTC 100K, PT100,&lt;br /&gt;
#  PT1000, Type-K thermocouple. NTC 100K -&amp;gt; &amp;quot;Generic 3950&amp;quot;.&lt;br /&gt;
#  Pairing of heater&amp;lt;-&amp;gt;thermistor is arbitrary; reassign as needed.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater1]                # HEATER1 / THERM1&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_pin: reheat:gpio40               # ADC0&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]                # HEATER2 / THERM2&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_pin: reheat:gpio41               # ADC1&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater3]                # HEATER3 / THERM3&lt;br /&gt;
heater_pin: reheat:gpio2&lt;br /&gt;
sensor_pin: reheat:gpio42               # ADC2&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater4]                # HEATER4 / THERM4&lt;br /&gt;
heater_pin: reheat:gpio3&lt;br /&gt;
sensor_pin: reheat:gpio43               # ADC3&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater5]                # HEATER5 / THERM5&lt;br /&gt;
heater_pin: reheat:gpio4&lt;br /&gt;
sensor_pin: reheat:gpio44               # ADC4&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater6]                # HEATER6 / THERM6&lt;br /&gt;
heater_pin: reheat:gpio5&lt;br /&gt;
sensor_pin: reheat:gpio45               # ADC5&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  FANS  (24V PWM)&lt;br /&gt;
#  Each fan follows its matching heater (FAN1&amp;lt;-&amp;gt;HEATER1, FAN2&amp;lt;-&amp;gt;HEATER2,&lt;br /&gt;
#  ... FAN6&amp;lt;-&amp;gt;HEATER6) and turns on when that heater is active.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan1]                       # FAN1 -&amp;gt; HEATER1&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
heater: heater1&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan2]                       # FAN2 -&amp;gt; HEATER2&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
heater: heater2&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan3]                       # FAN3 -&amp;gt; HEATER3&lt;br /&gt;
pin: reheat:gpio8&lt;br /&gt;
heater: heater3&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan4]                       # FAN4 -&amp;gt; HEATER4&lt;br /&gt;
pin: reheat:gpio9&lt;br /&gt;
heater: heater4&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan5]                       # FAN5 -&amp;gt; HEATER5&lt;br /&gt;
pin: reheat:gpio10&lt;br /&gt;
heater: heater5&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan6]                       # FAN6 -&amp;gt; HEATER6&lt;br /&gt;
pin: reheat:gpio11&lt;br /&gt;
heater: heater6&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  ENDSTOPS  (11 inputs, 5V tolerant)  +  NeoPixel on EP12&lt;br /&gt;
#  This board has no stepper drivers, so endstops are exposed as&lt;br /&gt;
#  runtime-readable buttons. To use one as a homing endstop instead,&lt;br /&gt;
#  reference its pin from a stepper on your motion board, e.g.:&lt;br /&gt;
#     [stepper_x]&lt;br /&gt;
#     endstop_pin: reheat:gpio18&lt;br /&gt;
#  Endstop 12 (GPIO29) is wired to a NeoPixel data line (see below).&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
# Each endstop is exposed as a button so its state is queryable. The&lt;br /&gt;
# press/release gcode is intentionally empty (just reads the input).&lt;br /&gt;
[gcode_button endstop1]&lt;br /&gt;
pin: reheat:gpio18&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop2]&lt;br /&gt;
pin: reheat:gpio19&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop3]&lt;br /&gt;
pin: reheat:gpio20&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop4]&lt;br /&gt;
pin: reheat:gpio21&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop5]&lt;br /&gt;
pin: reheat:gpio22&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop6]&lt;br /&gt;
pin: reheat:gpio23&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop7]&lt;br /&gt;
pin: reheat:gpio24&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop8]&lt;br /&gt;
pin: reheat:gpio25&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop9]&lt;br /&gt;
pin: reheat:gpio26&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop10]&lt;br /&gt;
pin: reheat:gpio27&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop11]&lt;br /&gt;
pin: reheat:gpio28&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
# NeoPixel on the EP12 connector (GPIO29 data line).&lt;br /&gt;
[neopixel reheat_led]&lt;br /&gt;
pin: reheat:gpio29&lt;br /&gt;
chain_count: 1&lt;br /&gt;
color_order: GRB&lt;br /&gt;
initial_RED: 0.0&lt;br /&gt;
initial_GREEN: 0.0&lt;br /&gt;
initial_BLUE: 0.0&lt;br /&gt;
&lt;br /&gt;
# EP12 direction line (GPIO37) — drive the level-shifter towards the&lt;br /&gt;
# NeoPixel (output direction).&lt;br /&gt;
[static_digital_output endstop12_dir]&lt;br /&gt;
pins: reheat:gpio37&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  ANALOG MUX + PWM BIAS  (board-internal sensor front-end)&lt;br /&gt;
#  MUX_S0..S2 select one of the multiplexed analog channels, read back&lt;br /&gt;
#  on ADC_MUX (GPIO46/ADC6). PWM_GAIN/OFFSET/CURRENT set the analog&lt;br /&gt;
#  amplifier bias used for PT100/thermocouple measurement.&lt;br /&gt;
#  These are exposed as raw pins; exact scaling is board-specific.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s0]&lt;br /&gt;
pin: reheat:gpio30&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s1]&lt;br /&gt;
pin: reheat:gpio31&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s2]&lt;br /&gt;
pin: reheat:gpio32&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_gain]&lt;br /&gt;
pin: reheat:gpio33&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_offset]&lt;br /&gt;
pin: reheat:gpio34&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_current]&lt;br /&gt;
pin: reheat:gpio35&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  PROTECTION / MONITORING&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
# Fan over-current flag (GPIO38) — reads active on an over-current event.&lt;br /&gt;
[gcode_button fan_overcurrent]&lt;br /&gt;
pin: reheat:gpio38&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
# Input-current sense (GPIO47 / ADC7) via the 2 mΩ shunt.&lt;br /&gt;
# Scale: 1 A = 0.1 V  -&amp;gt;  3.3 V full-scale = 33 A. The reported&lt;br /&gt;
# &amp;quot;temperature&amp;quot; value is therefore the input current in amps.&lt;br /&gt;
[adc_temperature reheat_current]&lt;br /&gt;
temperature1: 0&lt;br /&gt;
voltage1: 0&lt;br /&gt;
temperature2: 33&lt;br /&gt;
voltage2: 3.3&lt;br /&gt;
&lt;br /&gt;
[temperature_sensor input_current]&lt;br /&gt;
adc_voltage: 3.3&lt;br /&gt;
sensor_pin: reheat:gpio47&lt;br /&gt;
sensor_type: reheat_current&lt;br /&gt;
min_temp: -1&lt;br /&gt;
max_temp: 40&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]]&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1638</id>
		<title>Reheat A0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1638"/>
		<updated>2026-06-04T20:45:39Z</updated>

		<summary type="html">&lt;p&gt;Elias: /* Config tool */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reheat is a 6 output heater board with temperature sensors and fans for multi material printing.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reheat A0.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
* [https://github.com/intelligent-agent/Recore/blob/master/Schematics/Reheat_A0.pdf Reheat A0 Schematics (PDF)]&lt;br /&gt;
==Config tool==&lt;br /&gt;
* [https://config.iagent.no/ Reheat A0 config tool]&lt;br /&gt;
==pin description==&lt;br /&gt;
This is temporary while waiting for a proper pinout&lt;br /&gt;
[[File:Reheat A0 pinout.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
* RP2354B microcontroller (ARM Cortex-M33, 150 MHz)&lt;br /&gt;
* 6x heater outputs (24 V, MOSFET-switched)&lt;br /&gt;
* 6x fan outputs (24 V PWM) with tachometer inputs&lt;br /&gt;
* 6x thermistor/temperature sensor inputs&lt;br /&gt;
** Supports: NTC 10K, NTC 100K, PT100, PT1000, Type K thermocouple&lt;br /&gt;
** Jumper-selectable per channel&lt;br /&gt;
* 12x endstop inputs (5 V tolerant, TVS-protected)&lt;br /&gt;
** ENDSTOP-12 supports a bidirectional signal (e.g. filament encoder)&lt;br /&gt;
* USB-C interface (USB 2.0)&lt;br /&gt;
* 24 V power input with onboard 5 V (3 A) and 3.3 V regulation&lt;br /&gt;
* Overcurrent detection on fan bus&lt;br /&gt;
&lt;br /&gt;
==Pinout==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! GPIO !! Signal !! Connector&lt;br /&gt;
|-&lt;br /&gt;
| GPIO0 || HEATER-1 || J2&lt;br /&gt;
|-&lt;br /&gt;
| GPIO1 || HEATER-2 || J3&lt;br /&gt;
|-&lt;br /&gt;
| GPIO2 || HEATER-3 || J6&lt;br /&gt;
|-&lt;br /&gt;
| GPIO3 || HEATER-4 || J11&lt;br /&gt;
|-&lt;br /&gt;
| GPIO4 || HEATER-5 || J12&lt;br /&gt;
|-&lt;br /&gt;
| GPIO5 || HEATER-6 || J13&lt;br /&gt;
|-&lt;br /&gt;
| GPIO6 || FAN-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO7 || FAN-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO8 || FAN-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO9 || FAN-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO10 || FAN-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO11 || FAN-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO12 || TACH-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO13 || TACH-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO14 || TACH-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO15 || TACH-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO16 || TACH-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO17 || TACH-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO18 || ENDSTOP-1 || J14&lt;br /&gt;
|-&lt;br /&gt;
| GPIO19 || ENDSTOP-2 || J15&lt;br /&gt;
|-&lt;br /&gt;
| GPIO20 || ENDSTOP-3 || J16&lt;br /&gt;
|-&lt;br /&gt;
| GPIO21 || ENDSTOP-4 || J17&lt;br /&gt;
|-&lt;br /&gt;
| GPIO22 || ENDSTOP-5 || J18&lt;br /&gt;
|-&lt;br /&gt;
| GPIO23 || ENDSTOP-6 || J19&lt;br /&gt;
|-&lt;br /&gt;
| GPIO24 || ENDSTOP-7 || J20&lt;br /&gt;
|-&lt;br /&gt;
| GPIO25 || ENDSTOP-8 || J21&lt;br /&gt;
|-&lt;br /&gt;
| GPIO26 || ENDSTOP-9 || J22&lt;br /&gt;
|-&lt;br /&gt;
| GPIO27 || ENDSTOP-10 || J23&lt;br /&gt;
|-&lt;br /&gt;
| GPIO28 || ENDSTOP-11 || J24&lt;br /&gt;
|-&lt;br /&gt;
| GPIO29 || ENDSTOP-12 || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO30 || MUX-S0 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO31 || MUX-S1 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO32 || MUX-S2 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO33 || PWM-GAIN || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO34 || PWM-OFFSET || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO35 || PWM-CURRENT || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO36 || EN-PULLUP || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO37 || ENDSTOP-12-DIR || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO38 || FAN-OC (overcurrent) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO40 / ADC0 || THERM-1 || J27&lt;br /&gt;
|-&lt;br /&gt;
| GPIO41 / ADC1 || THERM-2 || J28&lt;br /&gt;
|-&lt;br /&gt;
| GPIO42 / ADC2 || THERM-3 || J29&lt;br /&gt;
|-&lt;br /&gt;
| GPIO43 / ADC3 || THERM-4 || J30&lt;br /&gt;
|-&lt;br /&gt;
| GPIO44 / ADC4 || THERM-5 || J31&lt;br /&gt;
|-&lt;br /&gt;
| GPIO45 / ADC5 || THERM-6 || J32&lt;br /&gt;
|-&lt;br /&gt;
| GPIO46 / ADC6 || ADC (MUX output) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO47 / ADC7 || CURRENT sense || Internal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Hardware connections==&lt;br /&gt;
&lt;br /&gt;
===Power===&lt;br /&gt;
The board takes 24 V DC on a 4-pin connector (J33). A fuse (F1) and a 2 mΩ current-sense resistor (R98) protect the input. Onboard regulators provide +5 V (TPS54302 buck converter, 3 A) and +3.3 V (AMS1117-3.3, 1 A) for logic and sensor pull-ups.&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
Six heater outputs use 2SK3019 N-channel MOSFETs driven from GPIO0–GPIO5. Each output has a 2-pin female connector and a flyback Schottky diode. The heater voltage is 24 V.&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
Six fan outputs (GPIO6–GPIO11) use N-channel MOSFETs with a 24 V supply. Each has a 3-pin connector (V+, GND, TACH). Tachometer signals are read on GPIO12–GPIO17. An LM393 comparator monitors the fan bus for overcurrent and signals FAN-OC on GPIO38.&lt;br /&gt;
&lt;br /&gt;
===Thermistors===&lt;br /&gt;
Each thermistor channel has a 3-pin connector (J27–J32) with a jumper (JP1–JP6) to select the measurement mode. An analog MUX (CD4051) and op-amp signal conditioning chain feed the ADC inputs (GPIO40–GPIO45). The signal conditioning supports:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sensor type !! Measurement method&lt;br /&gt;
|-&lt;br /&gt;
| NTC 10K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| NTC 100K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| PT100 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| PT1000 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| Type K thermocouple || ×101 gain amplifier, buffered&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For NTC thermistor or PT1000 measurements, close jumpers JP1–JP6 to connect the 4.7 K pull-up resistors. With the jumpers closed, ADC0–ADC5 (GPIO40–GPIO45) can be used as standard thermistor inputs with a 4.7 K pull-up to 3.3 V, without the need for any additional signal conditioning.&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;br /&gt;
# VUSB is unconnected, so the board requires 24 V power to operate even when connected over USB.&lt;br /&gt;
&lt;br /&gt;
==Klipper configuration==&lt;br /&gt;
&lt;br /&gt;
The Reheat A0 connects to the host over USB and is configured as an MCU in Klipper. Find the serial path with &amp;lt;code&amp;gt;ls /dev/serial/by-id/&amp;lt;/code&amp;gt; and add to &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_XXXXXXXXXXXX-if00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[heater_generic heater1]&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio40&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio41&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[fan_generic fan1]&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
&lt;br /&gt;
[fan_generic fan2]&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Endstops===&lt;br /&gt;
Endstop pins can be referenced in the relevant stepper sections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[stepper_x]&lt;br /&gt;
endstop_pin: reheat:gpio18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Flashing Klipper==&lt;br /&gt;
&lt;br /&gt;
# Put the board in BOOTSEL mode: hold the BOOT button while plugging in USB (or hold BOOT, press RESET, then release BOOT).&lt;br /&gt;
# Build and flash from the Klipper source directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make menuconfig&lt;br /&gt;
# Processor model: rp2350&lt;br /&gt;
# Bootloader offset: No bootloader&lt;br /&gt;
# Communication interface: USBSERIAL&lt;br /&gt;
make&lt;br /&gt;
picotool load out/klipper.uf2 --force&lt;br /&gt;
picotool reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The board will reboot and appear as &amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; (or similar).&lt;br /&gt;
&lt;br /&gt;
==Full config file==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  Reheat_A0.cfg  —  Complete Klipper configuration for the Reheat A0&lt;br /&gt;
#  MCU: RP2354B (RP2350 family, ARM Cortex-M33, 150 MHz, 48 GPIO, 8 ADC)&lt;br /&gt;
#  Source: https://wiki.iagent.no/wiki/Reheat_A0&lt;br /&gt;
#&lt;br /&gt;
#  Board functions:&lt;br /&gt;
#    6x heater outputs (24V MOSFET)        GPIO0..GPIO5&lt;br /&gt;
#    6x fan outputs (24V PWM)              GPIO6..GPIO11&lt;br /&gt;
#    6x fan tachometer inputs              GPIO12..GPIO17&lt;br /&gt;
#    12x endstop inputs (5V tolerant)      GPIO18..GPIO29 (+ GPIO37 dir)&lt;br /&gt;
#    6x thermistor/temperature ADC inputs  GPIO40..GPIO45 (ADC0..ADC5)&lt;br /&gt;
#    analog mux + PWM bias control         GPIO30..GPIO35&lt;br /&gt;
#    endstop pull-up enable                GPIO36&lt;br /&gt;
#    fan over-current flag                 GPIO38&lt;br /&gt;
#    ADC mux output / input-current sense  GPIO46/GPIO47 (ADC6/ADC7)&lt;br /&gt;
#&lt;br /&gt;
#  Each fan is paired with its matching heater (FAN1&amp;lt;-&amp;gt;HEATER1, ...).&lt;br /&gt;
#&lt;br /&gt;
#  Build firmware:  RP2350 (ARM) processor, USB communication.&lt;br /&gt;
#  Flash:  hold BOOT while plugging in USB-C to enter BOOTSEL.&lt;br /&gt;
#  ERRATA: RUN pin is hardwired -&amp;gt; Klipper cannot software-reset the MCU&lt;br /&gt;
#          (re-enter BOOTSEL manually to reflash). USB DP/DM are swapped.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
#  MCU&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
# USB-C, enumerates over USB. Use the stable by-id path:&lt;br /&gt;
#   ls /dev/serial/by-id/*&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_21745F8FD0431B3A-if00&lt;br /&gt;
restart_method: command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
#  Endstop pull-up enable (GPIO36)&lt;br /&gt;
#  Drive high at boot so the 12 endstop inputs read correctly.&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
[static_digital_output endstop_pullup_enable]&lt;br /&gt;
pins: reheat:gpio36&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  HEATERS  (24V MOSFET outputs, paired with ADC thermistors)&lt;br /&gt;
#  Sensor types supported by the board: NTC 10K, NTC 100K, PT100,&lt;br /&gt;
#  PT1000, Type-K thermocouple. NTC 100K -&amp;gt; &amp;quot;Generic 3950&amp;quot;.&lt;br /&gt;
#  Pairing of heater&amp;lt;-&amp;gt;thermistor is arbitrary; reassign as needed.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater1]                # HEATER1 / THERM1&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_pin: reheat:gpio40               # ADC0&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]                # HEATER2 / THERM2&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_pin: reheat:gpio41               # ADC1&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater3]                # HEATER3 / THERM3&lt;br /&gt;
heater_pin: reheat:gpio2&lt;br /&gt;
sensor_pin: reheat:gpio42               # ADC2&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater4]                # HEATER4 / THERM4&lt;br /&gt;
heater_pin: reheat:gpio3&lt;br /&gt;
sensor_pin: reheat:gpio43               # ADC3&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater5]                # HEATER5 / THERM5&lt;br /&gt;
heater_pin: reheat:gpio4&lt;br /&gt;
sensor_pin: reheat:gpio44               # ADC4&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater6]                # HEATER6 / THERM6&lt;br /&gt;
heater_pin: reheat:gpio5&lt;br /&gt;
sensor_pin: reheat:gpio45               # ADC5&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  FANS  (24V PWM)&lt;br /&gt;
#  Each fan follows its matching heater (FAN1&amp;lt;-&amp;gt;HEATER1, FAN2&amp;lt;-&amp;gt;HEATER2,&lt;br /&gt;
#  ... FAN6&amp;lt;-&amp;gt;HEATER6) and turns on when that heater is active.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan1]                       # FAN1 -&amp;gt; HEATER1&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
heater: heater1&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan2]                       # FAN2 -&amp;gt; HEATER2&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
heater: heater2&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan3]                       # FAN3 -&amp;gt; HEATER3&lt;br /&gt;
pin: reheat:gpio8&lt;br /&gt;
heater: heater3&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan4]                       # FAN4 -&amp;gt; HEATER4&lt;br /&gt;
pin: reheat:gpio9&lt;br /&gt;
heater: heater4&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan5]                       # FAN5 -&amp;gt; HEATER5&lt;br /&gt;
pin: reheat:gpio10&lt;br /&gt;
heater: heater5&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan6]                       # FAN6 -&amp;gt; HEATER6&lt;br /&gt;
pin: reheat:gpio11&lt;br /&gt;
heater: heater6&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  ENDSTOPS  (11 inputs, 5V tolerant)  +  NeoPixel on EP12&lt;br /&gt;
#  This board has no stepper drivers, so endstops are exposed as&lt;br /&gt;
#  runtime-readable buttons. To use one as a homing endstop instead,&lt;br /&gt;
#  reference its pin from a stepper on your motion board, e.g.:&lt;br /&gt;
#     [stepper_x]&lt;br /&gt;
#     endstop_pin: reheat:gpio18&lt;br /&gt;
#  Endstop 12 (GPIO29) is wired to a NeoPixel data line (see below).&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
# Each endstop is exposed as a button so its state is queryable. The&lt;br /&gt;
# press/release gcode is intentionally empty (just reads the input).&lt;br /&gt;
[gcode_button endstop1]&lt;br /&gt;
pin: reheat:gpio18&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop2]&lt;br /&gt;
pin: reheat:gpio19&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop3]&lt;br /&gt;
pin: reheat:gpio20&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop4]&lt;br /&gt;
pin: reheat:gpio21&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop5]&lt;br /&gt;
pin: reheat:gpio22&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop6]&lt;br /&gt;
pin: reheat:gpio23&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop7]&lt;br /&gt;
pin: reheat:gpio24&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop8]&lt;br /&gt;
pin: reheat:gpio25&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop9]&lt;br /&gt;
pin: reheat:gpio26&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop10]&lt;br /&gt;
pin: reheat:gpio27&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop11]&lt;br /&gt;
pin: reheat:gpio28&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
# NeoPixel on the EP12 connector (GPIO29 data line).&lt;br /&gt;
[neopixel reheat_led]&lt;br /&gt;
pin: reheat:gpio29&lt;br /&gt;
chain_count: 1&lt;br /&gt;
color_order: GRB&lt;br /&gt;
initial_RED: 0.0&lt;br /&gt;
initial_GREEN: 0.0&lt;br /&gt;
initial_BLUE: 0.0&lt;br /&gt;
&lt;br /&gt;
# EP12 direction line (GPIO37) — drive the level-shifter towards the&lt;br /&gt;
# NeoPixel (output direction).&lt;br /&gt;
[static_digital_output endstop12_dir]&lt;br /&gt;
pins: reheat:gpio37&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  ANALOG MUX + PWM BIAS  (board-internal sensor front-end)&lt;br /&gt;
#  MUX_S0..S2 select one of the multiplexed analog channels, read back&lt;br /&gt;
#  on ADC_MUX (GPIO46/ADC6). PWM_GAIN/OFFSET/CURRENT set the analog&lt;br /&gt;
#  amplifier bias used for PT100/thermocouple measurement.&lt;br /&gt;
#  These are exposed as raw pins; exact scaling is board-specific.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s0]&lt;br /&gt;
pin: reheat:gpio30&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s1]&lt;br /&gt;
pin: reheat:gpio31&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s2]&lt;br /&gt;
pin: reheat:gpio32&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_gain]&lt;br /&gt;
pin: reheat:gpio33&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_offset]&lt;br /&gt;
pin: reheat:gpio34&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_current]&lt;br /&gt;
pin: reheat:gpio35&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  PROTECTION / MONITORING&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
# Fan over-current flag (GPIO38) — reads active on an over-current event.&lt;br /&gt;
[gcode_button fan_overcurrent]&lt;br /&gt;
pin: reheat:gpio38&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
# Input-current sense (GPIO47 / ADC7) via the 2 mΩ shunt.&lt;br /&gt;
# Scale: 1 A = 0.1 V  -&amp;gt;  3.3 V full-scale = 33 A. The reported&lt;br /&gt;
# &amp;quot;temperature&amp;quot; value is therefore the input current in amps.&lt;br /&gt;
[adc_temperature reheat_current]&lt;br /&gt;
temperature1: 0&lt;br /&gt;
voltage1: 0&lt;br /&gt;
temperature2: 33&lt;br /&gt;
voltage2: 3.3&lt;br /&gt;
&lt;br /&gt;
[temperature_sensor input_current]&lt;br /&gt;
adc_voltage: 3.3&lt;br /&gt;
sensor_pin: reheat:gpio47&lt;br /&gt;
sensor_type: reheat_current&lt;br /&gt;
min_temp: -1&lt;br /&gt;
max_temp: 40&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]]&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=File:Reheat_A0_pinout.png&amp;diff=1637</id>
		<title>File:Reheat A0 pinout.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=File:Reheat_A0_pinout.png&amp;diff=1637"/>
		<updated>2026-06-04T20:45:30Z</updated>

		<summary type="html">&lt;p&gt;Elias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reheat_A0 pinout&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1636</id>
		<title>Reheat A0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1636"/>
		<updated>2026-06-04T20:42:56Z</updated>

		<summary type="html">&lt;p&gt;Elias: /* Schematics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reheat is a 6 output heater board with temperature sensors and fans for multi material printing.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reheat A0.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
* [https://github.com/intelligent-agent/Recore/blob/master/Schematics/Reheat_A0.pdf Reheat A0 Schematics (PDF)]&lt;br /&gt;
==Config tool==&lt;br /&gt;
* [https://config.iagent.no/ Reheat A0 config tool]&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
* RP2354B microcontroller (ARM Cortex-M33, 150 MHz)&lt;br /&gt;
* 6x heater outputs (24 V, MOSFET-switched)&lt;br /&gt;
* 6x fan outputs (24 V PWM) with tachometer inputs&lt;br /&gt;
* 6x thermistor/temperature sensor inputs&lt;br /&gt;
** Supports: NTC 10K, NTC 100K, PT100, PT1000, Type K thermocouple&lt;br /&gt;
** Jumper-selectable per channel&lt;br /&gt;
* 12x endstop inputs (5 V tolerant, TVS-protected)&lt;br /&gt;
** ENDSTOP-12 supports a bidirectional signal (e.g. filament encoder)&lt;br /&gt;
* USB-C interface (USB 2.0)&lt;br /&gt;
* 24 V power input with onboard 5 V (3 A) and 3.3 V regulation&lt;br /&gt;
* Overcurrent detection on fan bus&lt;br /&gt;
&lt;br /&gt;
==Pinout==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! GPIO !! Signal !! Connector&lt;br /&gt;
|-&lt;br /&gt;
| GPIO0 || HEATER-1 || J2&lt;br /&gt;
|-&lt;br /&gt;
| GPIO1 || HEATER-2 || J3&lt;br /&gt;
|-&lt;br /&gt;
| GPIO2 || HEATER-3 || J6&lt;br /&gt;
|-&lt;br /&gt;
| GPIO3 || HEATER-4 || J11&lt;br /&gt;
|-&lt;br /&gt;
| GPIO4 || HEATER-5 || J12&lt;br /&gt;
|-&lt;br /&gt;
| GPIO5 || HEATER-6 || J13&lt;br /&gt;
|-&lt;br /&gt;
| GPIO6 || FAN-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO7 || FAN-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO8 || FAN-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO9 || FAN-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO10 || FAN-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO11 || FAN-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO12 || TACH-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO13 || TACH-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO14 || TACH-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO15 || TACH-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO16 || TACH-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO17 || TACH-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO18 || ENDSTOP-1 || J14&lt;br /&gt;
|-&lt;br /&gt;
| GPIO19 || ENDSTOP-2 || J15&lt;br /&gt;
|-&lt;br /&gt;
| GPIO20 || ENDSTOP-3 || J16&lt;br /&gt;
|-&lt;br /&gt;
| GPIO21 || ENDSTOP-4 || J17&lt;br /&gt;
|-&lt;br /&gt;
| GPIO22 || ENDSTOP-5 || J18&lt;br /&gt;
|-&lt;br /&gt;
| GPIO23 || ENDSTOP-6 || J19&lt;br /&gt;
|-&lt;br /&gt;
| GPIO24 || ENDSTOP-7 || J20&lt;br /&gt;
|-&lt;br /&gt;
| GPIO25 || ENDSTOP-8 || J21&lt;br /&gt;
|-&lt;br /&gt;
| GPIO26 || ENDSTOP-9 || J22&lt;br /&gt;
|-&lt;br /&gt;
| GPIO27 || ENDSTOP-10 || J23&lt;br /&gt;
|-&lt;br /&gt;
| GPIO28 || ENDSTOP-11 || J24&lt;br /&gt;
|-&lt;br /&gt;
| GPIO29 || ENDSTOP-12 || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO30 || MUX-S0 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO31 || MUX-S1 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO32 || MUX-S2 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO33 || PWM-GAIN || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO34 || PWM-OFFSET || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO35 || PWM-CURRENT || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO36 || EN-PULLUP || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO37 || ENDSTOP-12-DIR || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO38 || FAN-OC (overcurrent) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO40 / ADC0 || THERM-1 || J27&lt;br /&gt;
|-&lt;br /&gt;
| GPIO41 / ADC1 || THERM-2 || J28&lt;br /&gt;
|-&lt;br /&gt;
| GPIO42 / ADC2 || THERM-3 || J29&lt;br /&gt;
|-&lt;br /&gt;
| GPIO43 / ADC3 || THERM-4 || J30&lt;br /&gt;
|-&lt;br /&gt;
| GPIO44 / ADC4 || THERM-5 || J31&lt;br /&gt;
|-&lt;br /&gt;
| GPIO45 / ADC5 || THERM-6 || J32&lt;br /&gt;
|-&lt;br /&gt;
| GPIO46 / ADC6 || ADC (MUX output) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO47 / ADC7 || CURRENT sense || Internal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Hardware connections==&lt;br /&gt;
&lt;br /&gt;
===Power===&lt;br /&gt;
The board takes 24 V DC on a 4-pin connector (J33). A fuse (F1) and a 2 mΩ current-sense resistor (R98) protect the input. Onboard regulators provide +5 V (TPS54302 buck converter, 3 A) and +3.3 V (AMS1117-3.3, 1 A) for logic and sensor pull-ups.&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
Six heater outputs use 2SK3019 N-channel MOSFETs driven from GPIO0–GPIO5. Each output has a 2-pin female connector and a flyback Schottky diode. The heater voltage is 24 V.&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
Six fan outputs (GPIO6–GPIO11) use N-channel MOSFETs with a 24 V supply. Each has a 3-pin connector (V+, GND, TACH). Tachometer signals are read on GPIO12–GPIO17. An LM393 comparator monitors the fan bus for overcurrent and signals FAN-OC on GPIO38.&lt;br /&gt;
&lt;br /&gt;
===Thermistors===&lt;br /&gt;
Each thermistor channel has a 3-pin connector (J27–J32) with a jumper (JP1–JP6) to select the measurement mode. An analog MUX (CD4051) and op-amp signal conditioning chain feed the ADC inputs (GPIO40–GPIO45). The signal conditioning supports:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sensor type !! Measurement method&lt;br /&gt;
|-&lt;br /&gt;
| NTC 10K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| NTC 100K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| PT100 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| PT1000 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| Type K thermocouple || ×101 gain amplifier, buffered&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For NTC thermistor or PT1000 measurements, close jumpers JP1–JP6 to connect the 4.7 K pull-up resistors. With the jumpers closed, ADC0–ADC5 (GPIO40–GPIO45) can be used as standard thermistor inputs with a 4.7 K pull-up to 3.3 V, without the need for any additional signal conditioning.&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;br /&gt;
# VUSB is unconnected, so the board requires 24 V power to operate even when connected over USB.&lt;br /&gt;
&lt;br /&gt;
==Klipper configuration==&lt;br /&gt;
&lt;br /&gt;
The Reheat A0 connects to the host over USB and is configured as an MCU in Klipper. Find the serial path with &amp;lt;code&amp;gt;ls /dev/serial/by-id/&amp;lt;/code&amp;gt; and add to &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_XXXXXXXXXXXX-if00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[heater_generic heater1]&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio40&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio41&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[fan_generic fan1]&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
&lt;br /&gt;
[fan_generic fan2]&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Endstops===&lt;br /&gt;
Endstop pins can be referenced in the relevant stepper sections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[stepper_x]&lt;br /&gt;
endstop_pin: reheat:gpio18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Flashing Klipper==&lt;br /&gt;
&lt;br /&gt;
# Put the board in BOOTSEL mode: hold the BOOT button while plugging in USB (or hold BOOT, press RESET, then release BOOT).&lt;br /&gt;
# Build and flash from the Klipper source directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make menuconfig&lt;br /&gt;
# Processor model: rp2350&lt;br /&gt;
# Bootloader offset: No bootloader&lt;br /&gt;
# Communication interface: USBSERIAL&lt;br /&gt;
make&lt;br /&gt;
picotool load out/klipper.uf2 --force&lt;br /&gt;
picotool reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The board will reboot and appear as &amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; (or similar).&lt;br /&gt;
&lt;br /&gt;
==Full config file==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  Reheat_A0.cfg  —  Complete Klipper configuration for the Reheat A0&lt;br /&gt;
#  MCU: RP2354B (RP2350 family, ARM Cortex-M33, 150 MHz, 48 GPIO, 8 ADC)&lt;br /&gt;
#  Source: https://wiki.iagent.no/wiki/Reheat_A0&lt;br /&gt;
#&lt;br /&gt;
#  Board functions:&lt;br /&gt;
#    6x heater outputs (24V MOSFET)        GPIO0..GPIO5&lt;br /&gt;
#    6x fan outputs (24V PWM)              GPIO6..GPIO11&lt;br /&gt;
#    6x fan tachometer inputs              GPIO12..GPIO17&lt;br /&gt;
#    12x endstop inputs (5V tolerant)      GPIO18..GPIO29 (+ GPIO37 dir)&lt;br /&gt;
#    6x thermistor/temperature ADC inputs  GPIO40..GPIO45 (ADC0..ADC5)&lt;br /&gt;
#    analog mux + PWM bias control         GPIO30..GPIO35&lt;br /&gt;
#    endstop pull-up enable                GPIO36&lt;br /&gt;
#    fan over-current flag                 GPIO38&lt;br /&gt;
#    ADC mux output / input-current sense  GPIO46/GPIO47 (ADC6/ADC7)&lt;br /&gt;
#&lt;br /&gt;
#  Each fan is paired with its matching heater (FAN1&amp;lt;-&amp;gt;HEATER1, ...).&lt;br /&gt;
#&lt;br /&gt;
#  Build firmware:  RP2350 (ARM) processor, USB communication.&lt;br /&gt;
#  Flash:  hold BOOT while plugging in USB-C to enter BOOTSEL.&lt;br /&gt;
#  ERRATA: RUN pin is hardwired -&amp;gt; Klipper cannot software-reset the MCU&lt;br /&gt;
#          (re-enter BOOTSEL manually to reflash). USB DP/DM are swapped.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
#  MCU&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
# USB-C, enumerates over USB. Use the stable by-id path:&lt;br /&gt;
#   ls /dev/serial/by-id/*&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_21745F8FD0431B3A-if00&lt;br /&gt;
restart_method: command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
#  Endstop pull-up enable (GPIO36)&lt;br /&gt;
#  Drive high at boot so the 12 endstop inputs read correctly.&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
[static_digital_output endstop_pullup_enable]&lt;br /&gt;
pins: reheat:gpio36&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  HEATERS  (24V MOSFET outputs, paired with ADC thermistors)&lt;br /&gt;
#  Sensor types supported by the board: NTC 10K, NTC 100K, PT100,&lt;br /&gt;
#  PT1000, Type-K thermocouple. NTC 100K -&amp;gt; &amp;quot;Generic 3950&amp;quot;.&lt;br /&gt;
#  Pairing of heater&amp;lt;-&amp;gt;thermistor is arbitrary; reassign as needed.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater1]                # HEATER1 / THERM1&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_pin: reheat:gpio40               # ADC0&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]                # HEATER2 / THERM2&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_pin: reheat:gpio41               # ADC1&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater3]                # HEATER3 / THERM3&lt;br /&gt;
heater_pin: reheat:gpio2&lt;br /&gt;
sensor_pin: reheat:gpio42               # ADC2&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater4]                # HEATER4 / THERM4&lt;br /&gt;
heater_pin: reheat:gpio3&lt;br /&gt;
sensor_pin: reheat:gpio43               # ADC3&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater5]                # HEATER5 / THERM5&lt;br /&gt;
heater_pin: reheat:gpio4&lt;br /&gt;
sensor_pin: reheat:gpio44               # ADC4&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater6]                # HEATER6 / THERM6&lt;br /&gt;
heater_pin: reheat:gpio5&lt;br /&gt;
sensor_pin: reheat:gpio45               # ADC5&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  FANS  (24V PWM)&lt;br /&gt;
#  Each fan follows its matching heater (FAN1&amp;lt;-&amp;gt;HEATER1, FAN2&amp;lt;-&amp;gt;HEATER2,&lt;br /&gt;
#  ... FAN6&amp;lt;-&amp;gt;HEATER6) and turns on when that heater is active.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan1]                       # FAN1 -&amp;gt; HEATER1&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
heater: heater1&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan2]                       # FAN2 -&amp;gt; HEATER2&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
heater: heater2&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan3]                       # FAN3 -&amp;gt; HEATER3&lt;br /&gt;
pin: reheat:gpio8&lt;br /&gt;
heater: heater3&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan4]                       # FAN4 -&amp;gt; HEATER4&lt;br /&gt;
pin: reheat:gpio9&lt;br /&gt;
heater: heater4&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan5]                       # FAN5 -&amp;gt; HEATER5&lt;br /&gt;
pin: reheat:gpio10&lt;br /&gt;
heater: heater5&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan6]                       # FAN6 -&amp;gt; HEATER6&lt;br /&gt;
pin: reheat:gpio11&lt;br /&gt;
heater: heater6&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  ENDSTOPS  (11 inputs, 5V tolerant)  +  NeoPixel on EP12&lt;br /&gt;
#  This board has no stepper drivers, so endstops are exposed as&lt;br /&gt;
#  runtime-readable buttons. To use one as a homing endstop instead,&lt;br /&gt;
#  reference its pin from a stepper on your motion board, e.g.:&lt;br /&gt;
#     [stepper_x]&lt;br /&gt;
#     endstop_pin: reheat:gpio18&lt;br /&gt;
#  Endstop 12 (GPIO29) is wired to a NeoPixel data line (see below).&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
# Each endstop is exposed as a button so its state is queryable. The&lt;br /&gt;
# press/release gcode is intentionally empty (just reads the input).&lt;br /&gt;
[gcode_button endstop1]&lt;br /&gt;
pin: reheat:gpio18&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop2]&lt;br /&gt;
pin: reheat:gpio19&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop3]&lt;br /&gt;
pin: reheat:gpio20&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop4]&lt;br /&gt;
pin: reheat:gpio21&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop5]&lt;br /&gt;
pin: reheat:gpio22&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop6]&lt;br /&gt;
pin: reheat:gpio23&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop7]&lt;br /&gt;
pin: reheat:gpio24&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop8]&lt;br /&gt;
pin: reheat:gpio25&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop9]&lt;br /&gt;
pin: reheat:gpio26&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop10]&lt;br /&gt;
pin: reheat:gpio27&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop11]&lt;br /&gt;
pin: reheat:gpio28&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
# NeoPixel on the EP12 connector (GPIO29 data line).&lt;br /&gt;
[neopixel reheat_led]&lt;br /&gt;
pin: reheat:gpio29&lt;br /&gt;
chain_count: 1&lt;br /&gt;
color_order: GRB&lt;br /&gt;
initial_RED: 0.0&lt;br /&gt;
initial_GREEN: 0.0&lt;br /&gt;
initial_BLUE: 0.0&lt;br /&gt;
&lt;br /&gt;
# EP12 direction line (GPIO37) — drive the level-shifter towards the&lt;br /&gt;
# NeoPixel (output direction).&lt;br /&gt;
[static_digital_output endstop12_dir]&lt;br /&gt;
pins: reheat:gpio37&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  ANALOG MUX + PWM BIAS  (board-internal sensor front-end)&lt;br /&gt;
#  MUX_S0..S2 select one of the multiplexed analog channels, read back&lt;br /&gt;
#  on ADC_MUX (GPIO46/ADC6). PWM_GAIN/OFFSET/CURRENT set the analog&lt;br /&gt;
#  amplifier bias used for PT100/thermocouple measurement.&lt;br /&gt;
#  These are exposed as raw pins; exact scaling is board-specific.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s0]&lt;br /&gt;
pin: reheat:gpio30&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s1]&lt;br /&gt;
pin: reheat:gpio31&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s2]&lt;br /&gt;
pin: reheat:gpio32&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_gain]&lt;br /&gt;
pin: reheat:gpio33&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_offset]&lt;br /&gt;
pin: reheat:gpio34&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_current]&lt;br /&gt;
pin: reheat:gpio35&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  PROTECTION / MONITORING&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
# Fan over-current flag (GPIO38) — reads active on an over-current event.&lt;br /&gt;
[gcode_button fan_overcurrent]&lt;br /&gt;
pin: reheat:gpio38&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
# Input-current sense (GPIO47 / ADC7) via the 2 mΩ shunt.&lt;br /&gt;
# Scale: 1 A = 0.1 V  -&amp;gt;  3.3 V full-scale = 33 A. The reported&lt;br /&gt;
# &amp;quot;temperature&amp;quot; value is therefore the input current in amps.&lt;br /&gt;
[adc_temperature reheat_current]&lt;br /&gt;
temperature1: 0&lt;br /&gt;
voltage1: 0&lt;br /&gt;
temperature2: 33&lt;br /&gt;
voltage2: 3.3&lt;br /&gt;
&lt;br /&gt;
[temperature_sensor input_current]&lt;br /&gt;
adc_voltage: 3.3&lt;br /&gt;
sensor_pin: reheat:gpio47&lt;br /&gt;
sensor_type: reheat_current&lt;br /&gt;
min_temp: -1&lt;br /&gt;
max_temp: 40&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]]&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1635</id>
		<title>Reheat A0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1635"/>
		<updated>2026-06-04T17:57:01Z</updated>

		<summary type="html">&lt;p&gt;Elias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reheat is a 6 output heater board with temperature sensors and fans for multi material printing.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reheat A0.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
* [https://github.com/intelligent-agent/Recore/blob/master/Schematics/Reheat_A0.pdf Reheat A0 Schematics (PDF)]&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
* RP2354B microcontroller (ARM Cortex-M33, 150 MHz)&lt;br /&gt;
* 6x heater outputs (24 V, MOSFET-switched)&lt;br /&gt;
* 6x fan outputs (24 V PWM) with tachometer inputs&lt;br /&gt;
* 6x thermistor/temperature sensor inputs&lt;br /&gt;
** Supports: NTC 10K, NTC 100K, PT100, PT1000, Type K thermocouple&lt;br /&gt;
** Jumper-selectable per channel&lt;br /&gt;
* 12x endstop inputs (5 V tolerant, TVS-protected)&lt;br /&gt;
** ENDSTOP-12 supports a bidirectional signal (e.g. filament encoder)&lt;br /&gt;
* USB-C interface (USB 2.0)&lt;br /&gt;
* 24 V power input with onboard 5 V (3 A) and 3.3 V regulation&lt;br /&gt;
* Overcurrent detection on fan bus&lt;br /&gt;
&lt;br /&gt;
==Pinout==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! GPIO !! Signal !! Connector&lt;br /&gt;
|-&lt;br /&gt;
| GPIO0 || HEATER-1 || J2&lt;br /&gt;
|-&lt;br /&gt;
| GPIO1 || HEATER-2 || J3&lt;br /&gt;
|-&lt;br /&gt;
| GPIO2 || HEATER-3 || J6&lt;br /&gt;
|-&lt;br /&gt;
| GPIO3 || HEATER-4 || J11&lt;br /&gt;
|-&lt;br /&gt;
| GPIO4 || HEATER-5 || J12&lt;br /&gt;
|-&lt;br /&gt;
| GPIO5 || HEATER-6 || J13&lt;br /&gt;
|-&lt;br /&gt;
| GPIO6 || FAN-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO7 || FAN-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO8 || FAN-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO9 || FAN-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO10 || FAN-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO11 || FAN-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO12 || TACH-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO13 || TACH-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO14 || TACH-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO15 || TACH-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO16 || TACH-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO17 || TACH-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO18 || ENDSTOP-1 || J14&lt;br /&gt;
|-&lt;br /&gt;
| GPIO19 || ENDSTOP-2 || J15&lt;br /&gt;
|-&lt;br /&gt;
| GPIO20 || ENDSTOP-3 || J16&lt;br /&gt;
|-&lt;br /&gt;
| GPIO21 || ENDSTOP-4 || J17&lt;br /&gt;
|-&lt;br /&gt;
| GPIO22 || ENDSTOP-5 || J18&lt;br /&gt;
|-&lt;br /&gt;
| GPIO23 || ENDSTOP-6 || J19&lt;br /&gt;
|-&lt;br /&gt;
| GPIO24 || ENDSTOP-7 || J20&lt;br /&gt;
|-&lt;br /&gt;
| GPIO25 || ENDSTOP-8 || J21&lt;br /&gt;
|-&lt;br /&gt;
| GPIO26 || ENDSTOP-9 || J22&lt;br /&gt;
|-&lt;br /&gt;
| GPIO27 || ENDSTOP-10 || J23&lt;br /&gt;
|-&lt;br /&gt;
| GPIO28 || ENDSTOP-11 || J24&lt;br /&gt;
|-&lt;br /&gt;
| GPIO29 || ENDSTOP-12 || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO30 || MUX-S0 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO31 || MUX-S1 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO32 || MUX-S2 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO33 || PWM-GAIN || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO34 || PWM-OFFSET || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO35 || PWM-CURRENT || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO36 || EN-PULLUP || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO37 || ENDSTOP-12-DIR || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO38 || FAN-OC (overcurrent) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO40 / ADC0 || THERM-1 || J27&lt;br /&gt;
|-&lt;br /&gt;
| GPIO41 / ADC1 || THERM-2 || J28&lt;br /&gt;
|-&lt;br /&gt;
| GPIO42 / ADC2 || THERM-3 || J29&lt;br /&gt;
|-&lt;br /&gt;
| GPIO43 / ADC3 || THERM-4 || J30&lt;br /&gt;
|-&lt;br /&gt;
| GPIO44 / ADC4 || THERM-5 || J31&lt;br /&gt;
|-&lt;br /&gt;
| GPIO45 / ADC5 || THERM-6 || J32&lt;br /&gt;
|-&lt;br /&gt;
| GPIO46 / ADC6 || ADC (MUX output) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO47 / ADC7 || CURRENT sense || Internal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Hardware connections==&lt;br /&gt;
&lt;br /&gt;
===Power===&lt;br /&gt;
The board takes 24 V DC on a 4-pin connector (J33). A fuse (F1) and a 2 mΩ current-sense resistor (R98) protect the input. Onboard regulators provide +5 V (TPS54302 buck converter, 3 A) and +3.3 V (AMS1117-3.3, 1 A) for logic and sensor pull-ups.&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
Six heater outputs use 2SK3019 N-channel MOSFETs driven from GPIO0–GPIO5. Each output has a 2-pin female connector and a flyback Schottky diode. The heater voltage is 24 V.&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
Six fan outputs (GPIO6–GPIO11) use N-channel MOSFETs with a 24 V supply. Each has a 3-pin connector (V+, GND, TACH). Tachometer signals are read on GPIO12–GPIO17. An LM393 comparator monitors the fan bus for overcurrent and signals FAN-OC on GPIO38.&lt;br /&gt;
&lt;br /&gt;
===Thermistors===&lt;br /&gt;
Each thermistor channel has a 3-pin connector (J27–J32) with a jumper (JP1–JP6) to select the measurement mode. An analog MUX (CD4051) and op-amp signal conditioning chain feed the ADC inputs (GPIO40–GPIO45). The signal conditioning supports:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sensor type !! Measurement method&lt;br /&gt;
|-&lt;br /&gt;
| NTC 10K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| NTC 100K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| PT100 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| PT1000 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| Type K thermocouple || ×101 gain amplifier, buffered&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For NTC thermistor or PT1000 measurements, close jumpers JP1–JP6 to connect the 4.7 K pull-up resistors. With the jumpers closed, ADC0–ADC5 (GPIO40–GPIO45) can be used as standard thermistor inputs with a 4.7 K pull-up to 3.3 V, without the need for any additional signal conditioning.&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;br /&gt;
# VUSB is unconnected, so the board requires 24 V power to operate even when connected over USB.&lt;br /&gt;
&lt;br /&gt;
==Klipper configuration==&lt;br /&gt;
&lt;br /&gt;
The Reheat A0 connects to the host over USB and is configured as an MCU in Klipper. Find the serial path with &amp;lt;code&amp;gt;ls /dev/serial/by-id/&amp;lt;/code&amp;gt; and add to &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_XXXXXXXXXXXX-if00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[heater_generic heater1]&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio40&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio41&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[fan_generic fan1]&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
&lt;br /&gt;
[fan_generic fan2]&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Endstops===&lt;br /&gt;
Endstop pins can be referenced in the relevant stepper sections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[stepper_x]&lt;br /&gt;
endstop_pin: reheat:gpio18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Flashing Klipper==&lt;br /&gt;
&lt;br /&gt;
# Put the board in BOOTSEL mode: hold the BOOT button while plugging in USB (or hold BOOT, press RESET, then release BOOT).&lt;br /&gt;
# Build and flash from the Klipper source directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make menuconfig&lt;br /&gt;
# Processor model: rp2350&lt;br /&gt;
# Bootloader offset: No bootloader&lt;br /&gt;
# Communication interface: USBSERIAL&lt;br /&gt;
make&lt;br /&gt;
picotool load out/klipper.uf2 --force&lt;br /&gt;
picotool reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The board will reboot and appear as &amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; (or similar).&lt;br /&gt;
&lt;br /&gt;
==Full config file==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  Reheat_A0.cfg  —  Complete Klipper configuration for the Reheat A0&lt;br /&gt;
#  MCU: RP2354B (RP2350 family, ARM Cortex-M33, 150 MHz, 48 GPIO, 8 ADC)&lt;br /&gt;
#  Source: https://wiki.iagent.no/wiki/Reheat_A0&lt;br /&gt;
#&lt;br /&gt;
#  Board functions:&lt;br /&gt;
#    6x heater outputs (24V MOSFET)        GPIO0..GPIO5&lt;br /&gt;
#    6x fan outputs (24V PWM)              GPIO6..GPIO11&lt;br /&gt;
#    6x fan tachometer inputs              GPIO12..GPIO17&lt;br /&gt;
#    12x endstop inputs (5V tolerant)      GPIO18..GPIO29 (+ GPIO37 dir)&lt;br /&gt;
#    6x thermistor/temperature ADC inputs  GPIO40..GPIO45 (ADC0..ADC5)&lt;br /&gt;
#    analog mux + PWM bias control         GPIO30..GPIO35&lt;br /&gt;
#    endstop pull-up enable                GPIO36&lt;br /&gt;
#    fan over-current flag                 GPIO38&lt;br /&gt;
#    ADC mux output / input-current sense  GPIO46/GPIO47 (ADC6/ADC7)&lt;br /&gt;
#&lt;br /&gt;
#  Each fan is paired with its matching heater (FAN1&amp;lt;-&amp;gt;HEATER1, ...).&lt;br /&gt;
#&lt;br /&gt;
#  Build firmware:  RP2350 (ARM) processor, USB communication.&lt;br /&gt;
#  Flash:  hold BOOT while plugging in USB-C to enter BOOTSEL.&lt;br /&gt;
#  ERRATA: RUN pin is hardwired -&amp;gt; Klipper cannot software-reset the MCU&lt;br /&gt;
#          (re-enter BOOTSEL manually to reflash). USB DP/DM are swapped.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
#  MCU&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
# USB-C, enumerates over USB. Use the stable by-id path:&lt;br /&gt;
#   ls /dev/serial/by-id/*&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_21745F8FD0431B3A-if00&lt;br /&gt;
restart_method: command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
#  Endstop pull-up enable (GPIO36)&lt;br /&gt;
#  Drive high at boot so the 12 endstop inputs read correctly.&lt;br /&gt;
# ----------------------------------------------------------------------&lt;br /&gt;
[static_digital_output endstop_pullup_enable]&lt;br /&gt;
pins: reheat:gpio36&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  HEATERS  (24V MOSFET outputs, paired with ADC thermistors)&lt;br /&gt;
#  Sensor types supported by the board: NTC 10K, NTC 100K, PT100,&lt;br /&gt;
#  PT1000, Type-K thermocouple. NTC 100K -&amp;gt; &amp;quot;Generic 3950&amp;quot;.&lt;br /&gt;
#  Pairing of heater&amp;lt;-&amp;gt;thermistor is arbitrary; reassign as needed.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater1]                # HEATER1 / THERM1&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_pin: reheat:gpio40               # ADC0&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]                # HEATER2 / THERM2&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_pin: reheat:gpio41               # ADC1&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater3]                # HEATER3 / THERM3&lt;br /&gt;
heater_pin: reheat:gpio2&lt;br /&gt;
sensor_pin: reheat:gpio42               # ADC2&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater4]                # HEATER4 / THERM4&lt;br /&gt;
heater_pin: reheat:gpio3&lt;br /&gt;
sensor_pin: reheat:gpio43               # ADC3&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater5]                # HEATER5 / THERM5&lt;br /&gt;
heater_pin: reheat:gpio4&lt;br /&gt;
sensor_pin: reheat:gpio44               # ADC4&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater6]                # HEATER6 / THERM6&lt;br /&gt;
heater_pin: reheat:gpio5&lt;br /&gt;
sensor_pin: reheat:gpio45               # ADC5&lt;br /&gt;
sensor_type: EPCOS 100K B57560G104F&lt;br /&gt;
control: watermark&lt;br /&gt;
min_temp: -272&lt;br /&gt;
max_temp: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  FANS  (24V PWM)&lt;br /&gt;
#  Each fan follows its matching heater (FAN1&amp;lt;-&amp;gt;HEATER1, FAN2&amp;lt;-&amp;gt;HEATER2,&lt;br /&gt;
#  ... FAN6&amp;lt;-&amp;gt;HEATER6) and turns on when that heater is active.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan1]                       # FAN1 -&amp;gt; HEATER1&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
heater: heater1&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan2]                       # FAN2 -&amp;gt; HEATER2&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
heater: heater2&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan3]                       # FAN3 -&amp;gt; HEATER3&lt;br /&gt;
pin: reheat:gpio8&lt;br /&gt;
heater: heater3&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan4]                       # FAN4 -&amp;gt; HEATER4&lt;br /&gt;
pin: reheat:gpio9&lt;br /&gt;
heater: heater4&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan5]                       # FAN5 -&amp;gt; HEATER5&lt;br /&gt;
pin: reheat:gpio10&lt;br /&gt;
heater: heater5&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
[heater_fan fan6]                       # FAN6 -&amp;gt; HEATER6&lt;br /&gt;
pin: reheat:gpio11&lt;br /&gt;
heater: heater6&lt;br /&gt;
heater_temp: 50.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  ENDSTOPS  (11 inputs, 5V tolerant)  +  NeoPixel on EP12&lt;br /&gt;
#  This board has no stepper drivers, so endstops are exposed as&lt;br /&gt;
#  runtime-readable buttons. To use one as a homing endstop instead,&lt;br /&gt;
#  reference its pin from a stepper on your motion board, e.g.:&lt;br /&gt;
#     [stepper_x]&lt;br /&gt;
#     endstop_pin: reheat:gpio18&lt;br /&gt;
#  Endstop 12 (GPIO29) is wired to a NeoPixel data line (see below).&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
# Each endstop is exposed as a button so its state is queryable. The&lt;br /&gt;
# press/release gcode is intentionally empty (just reads the input).&lt;br /&gt;
[gcode_button endstop1]&lt;br /&gt;
pin: reheat:gpio18&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop2]&lt;br /&gt;
pin: reheat:gpio19&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop3]&lt;br /&gt;
pin: reheat:gpio20&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop4]&lt;br /&gt;
pin: reheat:gpio21&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop5]&lt;br /&gt;
pin: reheat:gpio22&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop6]&lt;br /&gt;
pin: reheat:gpio23&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop7]&lt;br /&gt;
pin: reheat:gpio24&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop8]&lt;br /&gt;
pin: reheat:gpio25&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop9]&lt;br /&gt;
pin: reheat:gpio26&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop10]&lt;br /&gt;
pin: reheat:gpio27&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
[gcode_button endstop11]&lt;br /&gt;
pin: reheat:gpio28&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
# NeoPixel on the EP12 connector (GPIO29 data line).&lt;br /&gt;
[neopixel reheat_led]&lt;br /&gt;
pin: reheat:gpio29&lt;br /&gt;
chain_count: 1&lt;br /&gt;
color_order: GRB&lt;br /&gt;
initial_RED: 0.0&lt;br /&gt;
initial_GREEN: 0.0&lt;br /&gt;
initial_BLUE: 0.0&lt;br /&gt;
&lt;br /&gt;
# EP12 direction line (GPIO37) — drive the level-shifter towards the&lt;br /&gt;
# NeoPixel (output direction).&lt;br /&gt;
[static_digital_output endstop12_dir]&lt;br /&gt;
pins: reheat:gpio37&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  ANALOG MUX + PWM BIAS  (board-internal sensor front-end)&lt;br /&gt;
#  MUX_S0..S2 select one of the multiplexed analog channels, read back&lt;br /&gt;
#  on ADC_MUX (GPIO46/ADC6). PWM_GAIN/OFFSET/CURRENT set the analog&lt;br /&gt;
#  amplifier bias used for PT100/thermocouple measurement.&lt;br /&gt;
#  These are exposed as raw pins; exact scaling is board-specific.&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s0]&lt;br /&gt;
pin: reheat:gpio30&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s1]&lt;br /&gt;
pin: reheat:gpio31&lt;br /&gt;
&lt;br /&gt;
[output_pin mux_s2]&lt;br /&gt;
pin: reheat:gpio32&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_gain]&lt;br /&gt;
pin: reheat:gpio33&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_offset]&lt;br /&gt;
pin: reheat:gpio34&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
[output_pin pwm_current]&lt;br /&gt;
pin: reheat:gpio35&lt;br /&gt;
pwm: True&lt;br /&gt;
cycle_time: 0.001&lt;br /&gt;
value: 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ======================================================================&lt;br /&gt;
#  PROTECTION / MONITORING&lt;br /&gt;
# ======================================================================&lt;br /&gt;
&lt;br /&gt;
# Fan over-current flag (GPIO38) — reads active on an over-current event.&lt;br /&gt;
[gcode_button fan_overcurrent]&lt;br /&gt;
pin: reheat:gpio38&lt;br /&gt;
press_gcode:&lt;br /&gt;
release_gcode:&lt;br /&gt;
&lt;br /&gt;
# Input-current sense (GPIO47 / ADC7) via the 2 mΩ shunt.&lt;br /&gt;
# Scale: 1 A = 0.1 V  -&amp;gt;  3.3 V full-scale = 33 A. The reported&lt;br /&gt;
# &amp;quot;temperature&amp;quot; value is therefore the input current in amps.&lt;br /&gt;
[adc_temperature reheat_current]&lt;br /&gt;
temperature1: 0&lt;br /&gt;
voltage1: 0&lt;br /&gt;
temperature2: 33&lt;br /&gt;
voltage2: 3.3&lt;br /&gt;
&lt;br /&gt;
[temperature_sensor input_current]&lt;br /&gt;
adc_voltage: 3.3&lt;br /&gt;
sensor_pin: reheat:gpio47&lt;br /&gt;
sensor_type: reheat_current&lt;br /&gt;
min_temp: -1&lt;br /&gt;
max_temp: 40&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]]&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1634</id>
		<title>Reheat A0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1634"/>
		<updated>2026-05-16T18:00:34Z</updated>

		<summary type="html">&lt;p&gt;Elias: Add VUSB errata&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reheat is a 6 output heater board with temperature sensors and fans for multi material printing.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reheat A0.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
* [https://github.com/intelligent-agent/Recore/blob/master/Schematics/Reheat_A0.pdf Reheat A0 Schematics (PDF)]&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
* RP2354B microcontroller (ARM Cortex-M33, 150 MHz)&lt;br /&gt;
* 6x heater outputs (24 V, MOSFET-switched)&lt;br /&gt;
* 6x fan outputs (24 V PWM) with tachometer inputs&lt;br /&gt;
* 6x thermistor/temperature sensor inputs&lt;br /&gt;
** Supports: NTC 10K, NTC 100K, PT100, PT1000, Type K thermocouple&lt;br /&gt;
** Jumper-selectable per channel&lt;br /&gt;
* 12x endstop inputs (5 V tolerant, TVS-protected)&lt;br /&gt;
** ENDSTOP-12 supports a bidirectional signal (e.g. filament encoder)&lt;br /&gt;
* USB-C interface (USB 2.0)&lt;br /&gt;
* 24 V power input with onboard 5 V (3 A) and 3.3 V regulation&lt;br /&gt;
* Overcurrent detection on fan bus&lt;br /&gt;
&lt;br /&gt;
==Pinout==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! GPIO !! Signal !! Connector&lt;br /&gt;
|-&lt;br /&gt;
| GPIO0 || HEATER-1 || J2&lt;br /&gt;
|-&lt;br /&gt;
| GPIO1 || HEATER-2 || J3&lt;br /&gt;
|-&lt;br /&gt;
| GPIO2 || HEATER-3 || J6&lt;br /&gt;
|-&lt;br /&gt;
| GPIO3 || HEATER-4 || J11&lt;br /&gt;
|-&lt;br /&gt;
| GPIO4 || HEATER-5 || J12&lt;br /&gt;
|-&lt;br /&gt;
| GPIO5 || HEATER-6 || J13&lt;br /&gt;
|-&lt;br /&gt;
| GPIO6 || FAN-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO7 || FAN-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO8 || FAN-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO9 || FAN-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO10 || FAN-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO11 || FAN-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO12 || TACH-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO13 || TACH-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO14 || TACH-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO15 || TACH-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO16 || TACH-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO17 || TACH-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO18 || ENDSTOP-1 || J14&lt;br /&gt;
|-&lt;br /&gt;
| GPIO19 || ENDSTOP-2 || J15&lt;br /&gt;
|-&lt;br /&gt;
| GPIO20 || ENDSTOP-3 || J16&lt;br /&gt;
|-&lt;br /&gt;
| GPIO21 || ENDSTOP-4 || J17&lt;br /&gt;
|-&lt;br /&gt;
| GPIO22 || ENDSTOP-5 || J18&lt;br /&gt;
|-&lt;br /&gt;
| GPIO23 || ENDSTOP-6 || J19&lt;br /&gt;
|-&lt;br /&gt;
| GPIO24 || ENDSTOP-7 || J20&lt;br /&gt;
|-&lt;br /&gt;
| GPIO25 || ENDSTOP-8 || J21&lt;br /&gt;
|-&lt;br /&gt;
| GPIO26 || ENDSTOP-9 || J22&lt;br /&gt;
|-&lt;br /&gt;
| GPIO27 || ENDSTOP-10 || J23&lt;br /&gt;
|-&lt;br /&gt;
| GPIO28 || ENDSTOP-11 || J24&lt;br /&gt;
|-&lt;br /&gt;
| GPIO29 || ENDSTOP-12 || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO30 || MUX-S0 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO31 || MUX-S1 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO32 || MUX-S2 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO33 || PWM-GAIN || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO34 || PWM-OFFSET || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO35 || PWM-CURRENT || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO36 || EN-PULLUP || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO37 || ENDSTOP-12-DIR || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO38 || FAN-OC (overcurrent) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO40 / ADC0 || THERM-1 || J27&lt;br /&gt;
|-&lt;br /&gt;
| GPIO41 / ADC1 || THERM-2 || J28&lt;br /&gt;
|-&lt;br /&gt;
| GPIO42 / ADC2 || THERM-3 || J29&lt;br /&gt;
|-&lt;br /&gt;
| GPIO43 / ADC3 || THERM-4 || J30&lt;br /&gt;
|-&lt;br /&gt;
| GPIO44 / ADC4 || THERM-5 || J31&lt;br /&gt;
|-&lt;br /&gt;
| GPIO45 / ADC5 || THERM-6 || J32&lt;br /&gt;
|-&lt;br /&gt;
| GPIO46 / ADC6 || ADC (MUX output) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO47 / ADC7 || CURRENT sense || Internal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Hardware connections==&lt;br /&gt;
&lt;br /&gt;
===Power===&lt;br /&gt;
The board takes 24 V DC on a 4-pin connector (J33). A fuse (F1) and a 2 mΩ current-sense resistor (R98) protect the input. Onboard regulators provide +5 V (TPS54302 buck converter, 3 A) and +3.3 V (AMS1117-3.3, 1 A) for logic and sensor pull-ups.&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
Six heater outputs use 2SK3019 N-channel MOSFETs driven from GPIO0–GPIO5. Each output has a 2-pin female connector and a flyback Schottky diode. The heater voltage is 24 V.&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
Six fan outputs (GPIO6–GPIO11) use N-channel MOSFETs with a 24 V supply. Each has a 3-pin connector (V+, GND, TACH). Tachometer signals are read on GPIO12–GPIO17. An LM393 comparator monitors the fan bus for overcurrent and signals FAN-OC on GPIO38.&lt;br /&gt;
&lt;br /&gt;
===Thermistors===&lt;br /&gt;
Each thermistor channel has a 3-pin connector (J27–J32) with a jumper (JP1–JP6) to select the measurement mode. An analog MUX (CD4051) and op-amp signal conditioning chain feed the ADC inputs (GPIO40–GPIO45). The signal conditioning supports:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sensor type !! Measurement method&lt;br /&gt;
|-&lt;br /&gt;
| NTC 10K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| NTC 100K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| PT100 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| PT1000 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| Type K thermocouple || ×101 gain amplifier, buffered&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For NTC thermistor or PT1000 measurements, close jumpers JP1–JP6 to connect the 4.7 K pull-up resistors. With the jumpers closed, ADC0–ADC5 (GPIO40–GPIO45) can be used as standard thermistor inputs with a 4.7 K pull-up to 3.3 V, without the need for any additional signal conditioning.&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;br /&gt;
# VUSB is unconnected, so the board requires 24 V power to operate even when connected over USB.&lt;br /&gt;
&lt;br /&gt;
==Klipper configuration==&lt;br /&gt;
&lt;br /&gt;
The Reheat A0 connects to the host over USB and is configured as an MCU in Klipper. Find the serial path with &amp;lt;code&amp;gt;ls /dev/serial/by-id/&amp;lt;/code&amp;gt; and add to &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_XXXXXXXXXXXX-if00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[heater_generic heater1]&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio40&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio41&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[fan_generic fan1]&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
&lt;br /&gt;
[fan_generic fan2]&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Endstops===&lt;br /&gt;
Endstop pins can be referenced in the relevant stepper sections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[stepper_x]&lt;br /&gt;
endstop_pin: reheat:gpio18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Flashing Klipper==&lt;br /&gt;
&lt;br /&gt;
# Put the board in BOOTSEL mode: hold the BOOT button while plugging in USB (or hold BOOT, press RESET, then release BOOT).&lt;br /&gt;
# Build and flash from the Klipper source directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make menuconfig&lt;br /&gt;
# Processor model: rp2350&lt;br /&gt;
# Bootloader offset: No bootloader&lt;br /&gt;
# Communication interface: USBSERIAL&lt;br /&gt;
make&lt;br /&gt;
picotool load out/klipper.uf2 --force&lt;br /&gt;
picotool reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The board will reboot and appear as &amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; (or similar).&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]]&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1633</id>
		<title>Reheat A0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1633"/>
		<updated>2026-05-16T17:59:09Z</updated>

		<summary type="html">&lt;p&gt;Elias: Add JP1-6 pull-up note to thermistors section; add 1 mm pitch errata&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reheat is a 6 output heater board with temperature sensors and fans for multi material printing.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reheat A0.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
* [https://github.com/intelligent-agent/Recore/blob/master/Schematics/Reheat_A0.pdf Reheat A0 Schematics (PDF)]&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
* RP2354B microcontroller (ARM Cortex-M33, 150 MHz)&lt;br /&gt;
* 6x heater outputs (24 V, MOSFET-switched)&lt;br /&gt;
* 6x fan outputs (24 V PWM) with tachometer inputs&lt;br /&gt;
* 6x thermistor/temperature sensor inputs&lt;br /&gt;
** Supports: NTC 10K, NTC 100K, PT100, PT1000, Type K thermocouple&lt;br /&gt;
** Jumper-selectable per channel&lt;br /&gt;
* 12x endstop inputs (5 V tolerant, TVS-protected)&lt;br /&gt;
** ENDSTOP-12 supports a bidirectional signal (e.g. filament encoder)&lt;br /&gt;
* USB-C interface (USB 2.0)&lt;br /&gt;
* 24 V power input with onboard 5 V (3 A) and 3.3 V regulation&lt;br /&gt;
* Overcurrent detection on fan bus&lt;br /&gt;
&lt;br /&gt;
==Pinout==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! GPIO !! Signal !! Connector&lt;br /&gt;
|-&lt;br /&gt;
| GPIO0 || HEATER-1 || J2&lt;br /&gt;
|-&lt;br /&gt;
| GPIO1 || HEATER-2 || J3&lt;br /&gt;
|-&lt;br /&gt;
| GPIO2 || HEATER-3 || J6&lt;br /&gt;
|-&lt;br /&gt;
| GPIO3 || HEATER-4 || J11&lt;br /&gt;
|-&lt;br /&gt;
| GPIO4 || HEATER-5 || J12&lt;br /&gt;
|-&lt;br /&gt;
| GPIO5 || HEATER-6 || J13&lt;br /&gt;
|-&lt;br /&gt;
| GPIO6 || FAN-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO7 || FAN-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO8 || FAN-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO9 || FAN-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO10 || FAN-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO11 || FAN-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO12 || TACH-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO13 || TACH-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO14 || TACH-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO15 || TACH-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO16 || TACH-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO17 || TACH-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO18 || ENDSTOP-1 || J14&lt;br /&gt;
|-&lt;br /&gt;
| GPIO19 || ENDSTOP-2 || J15&lt;br /&gt;
|-&lt;br /&gt;
| GPIO20 || ENDSTOP-3 || J16&lt;br /&gt;
|-&lt;br /&gt;
| GPIO21 || ENDSTOP-4 || J17&lt;br /&gt;
|-&lt;br /&gt;
| GPIO22 || ENDSTOP-5 || J18&lt;br /&gt;
|-&lt;br /&gt;
| GPIO23 || ENDSTOP-6 || J19&lt;br /&gt;
|-&lt;br /&gt;
| GPIO24 || ENDSTOP-7 || J20&lt;br /&gt;
|-&lt;br /&gt;
| GPIO25 || ENDSTOP-8 || J21&lt;br /&gt;
|-&lt;br /&gt;
| GPIO26 || ENDSTOP-9 || J22&lt;br /&gt;
|-&lt;br /&gt;
| GPIO27 || ENDSTOP-10 || J23&lt;br /&gt;
|-&lt;br /&gt;
| GPIO28 || ENDSTOP-11 || J24&lt;br /&gt;
|-&lt;br /&gt;
| GPIO29 || ENDSTOP-12 || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO30 || MUX-S0 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO31 || MUX-S1 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO32 || MUX-S2 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO33 || PWM-GAIN || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO34 || PWM-OFFSET || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO35 || PWM-CURRENT || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO36 || EN-PULLUP || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO37 || ENDSTOP-12-DIR || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO38 || FAN-OC (overcurrent) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO40 / ADC0 || THERM-1 || J27&lt;br /&gt;
|-&lt;br /&gt;
| GPIO41 / ADC1 || THERM-2 || J28&lt;br /&gt;
|-&lt;br /&gt;
| GPIO42 / ADC2 || THERM-3 || J29&lt;br /&gt;
|-&lt;br /&gt;
| GPIO43 / ADC3 || THERM-4 || J30&lt;br /&gt;
|-&lt;br /&gt;
| GPIO44 / ADC4 || THERM-5 || J31&lt;br /&gt;
|-&lt;br /&gt;
| GPIO45 / ADC5 || THERM-6 || J32&lt;br /&gt;
|-&lt;br /&gt;
| GPIO46 / ADC6 || ADC (MUX output) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO47 / ADC7 || CURRENT sense || Internal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Hardware connections==&lt;br /&gt;
&lt;br /&gt;
===Power===&lt;br /&gt;
The board takes 24 V DC on a 4-pin connector (J33). A fuse (F1) and a 2 mΩ current-sense resistor (R98) protect the input. Onboard regulators provide +5 V (TPS54302 buck converter, 3 A) and +3.3 V (AMS1117-3.3, 1 A) for logic and sensor pull-ups.&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
Six heater outputs use 2SK3019 N-channel MOSFETs driven from GPIO0–GPIO5. Each output has a 2-pin female connector and a flyback Schottky diode. The heater voltage is 24 V.&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
Six fan outputs (GPIO6–GPIO11) use N-channel MOSFETs with a 24 V supply. Each has a 3-pin connector (V+, GND, TACH). Tachometer signals are read on GPIO12–GPIO17. An LM393 comparator monitors the fan bus for overcurrent and signals FAN-OC on GPIO38.&lt;br /&gt;
&lt;br /&gt;
===Thermistors===&lt;br /&gt;
Each thermistor channel has a 3-pin connector (J27–J32) with a jumper (JP1–JP6) to select the measurement mode. An analog MUX (CD4051) and op-amp signal conditioning chain feed the ADC inputs (GPIO40–GPIO45). The signal conditioning supports:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sensor type !! Measurement method&lt;br /&gt;
|-&lt;br /&gt;
| NTC 10K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| NTC 100K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| PT100 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| PT1000 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| Type K thermocouple || ×101 gain amplifier, buffered&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For NTC thermistor or PT1000 measurements, close jumpers JP1–JP6 to connect the 4.7 K pull-up resistors. With the jumpers closed, ADC0–ADC5 (GPIO40–GPIO45) can be used as standard thermistor inputs with a 4.7 K pull-up to 3.3 V, without the need for any additional signal conditioning.&lt;br /&gt;
&lt;br /&gt;
===Endstops===&lt;br /&gt;
Twelve endstop inputs (J14–J25) each provide +5 V, signal, and GND on a 3-pin connector. Signals are level-shifted to 3.3 V and protected by SMF24A TVS diodes. ENDSTOP-12 (J25) additionally supports a bidirectional direction signal via a SN74LVC1T45 level translator, suitable for filament motion sensors or encoders.&lt;br /&gt;
&lt;br /&gt;
==Klipper configuration==&lt;br /&gt;
&lt;br /&gt;
The Reheat A0 connects to the host over USB and is configured as an MCU in Klipper. Find the serial path with &amp;lt;code&amp;gt;ls /dev/serial/by-id/&amp;lt;/code&amp;gt; and add to &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_XXXXXXXXXXXX-if00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[heater_generic heater1]&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio40&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio41&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[fan_generic fan1]&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
&lt;br /&gt;
[fan_generic fan2]&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Endstops===&lt;br /&gt;
Endstop pins can be referenced in the relevant stepper sections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[stepper_x]&lt;br /&gt;
endstop_pin: reheat:gpio18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Flashing Klipper==&lt;br /&gt;
&lt;br /&gt;
# Put the board in BOOTSEL mode: hold the BOOT button while plugging in USB (or hold BOOT, press RESET, then release BOOT).&lt;br /&gt;
# Build and flash from the Klipper source directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make menuconfig&lt;br /&gt;
# Processor model: rp2350&lt;br /&gt;
# Bootloader offset: No bootloader&lt;br /&gt;
# Communication interface: USBSERIAL&lt;br /&gt;
make&lt;br /&gt;
picotool load out/klipper.uf2 --force&lt;br /&gt;
picotool reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The board will reboot and appear as &amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; (or similar).&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]]&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;br /&gt;
# Pull-up resistor footprints (JP1–JP6) use a 1 mm pin pitch instead of the standard 2.54 mm.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1632</id>
		<title>Reheat A0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1632"/>
		<updated>2026-05-16T17:54:02Z</updated>

		<summary type="html">&lt;p&gt;Elias: Add A0 errata&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reheat is a 6 output heater board with temperature sensors and fans for multi material printing.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reheat A0.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
* [https://github.com/intelligent-agent/Recore/blob/master/Schematics/Reheat_A0.pdf Reheat A0 Schematics (PDF)]&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
* RP2354B microcontroller (ARM Cortex-M33, 150 MHz)&lt;br /&gt;
* 6x heater outputs (24 V, MOSFET-switched)&lt;br /&gt;
* 6x fan outputs (24 V PWM) with tachometer inputs&lt;br /&gt;
* 6x thermistor/temperature sensor inputs&lt;br /&gt;
** Supports: NTC 10K, NTC 100K, PT100, PT1000, Type K thermocouple&lt;br /&gt;
** Jumper-selectable per channel&lt;br /&gt;
* 12x endstop inputs (5 V tolerant, TVS-protected)&lt;br /&gt;
** ENDSTOP-12 supports a bidirectional signal (e.g. filament encoder)&lt;br /&gt;
* USB-C interface (USB 2.0)&lt;br /&gt;
* 24 V power input with onboard 5 V (3 A) and 3.3 V regulation&lt;br /&gt;
* Overcurrent detection on fan bus&lt;br /&gt;
&lt;br /&gt;
==Pinout==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! GPIO !! Signal !! Connector&lt;br /&gt;
|-&lt;br /&gt;
| GPIO0 || HEATER-1 || J2&lt;br /&gt;
|-&lt;br /&gt;
| GPIO1 || HEATER-2 || J3&lt;br /&gt;
|-&lt;br /&gt;
| GPIO2 || HEATER-3 || J6&lt;br /&gt;
|-&lt;br /&gt;
| GPIO3 || HEATER-4 || J11&lt;br /&gt;
|-&lt;br /&gt;
| GPIO4 || HEATER-5 || J12&lt;br /&gt;
|-&lt;br /&gt;
| GPIO5 || HEATER-6 || J13&lt;br /&gt;
|-&lt;br /&gt;
| GPIO6 || FAN-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO7 || FAN-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO8 || FAN-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO9 || FAN-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO10 || FAN-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO11 || FAN-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO12 || TACH-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO13 || TACH-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO14 || TACH-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO15 || TACH-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO16 || TACH-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO17 || TACH-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO18 || ENDSTOP-1 || J14&lt;br /&gt;
|-&lt;br /&gt;
| GPIO19 || ENDSTOP-2 || J15&lt;br /&gt;
|-&lt;br /&gt;
| GPIO20 || ENDSTOP-3 || J16&lt;br /&gt;
|-&lt;br /&gt;
| GPIO21 || ENDSTOP-4 || J17&lt;br /&gt;
|-&lt;br /&gt;
| GPIO22 || ENDSTOP-5 || J18&lt;br /&gt;
|-&lt;br /&gt;
| GPIO23 || ENDSTOP-6 || J19&lt;br /&gt;
|-&lt;br /&gt;
| GPIO24 || ENDSTOP-7 || J20&lt;br /&gt;
|-&lt;br /&gt;
| GPIO25 || ENDSTOP-8 || J21&lt;br /&gt;
|-&lt;br /&gt;
| GPIO26 || ENDSTOP-9 || J22&lt;br /&gt;
|-&lt;br /&gt;
| GPIO27 || ENDSTOP-10 || J23&lt;br /&gt;
|-&lt;br /&gt;
| GPIO28 || ENDSTOP-11 || J24&lt;br /&gt;
|-&lt;br /&gt;
| GPIO29 || ENDSTOP-12 || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO30 || MUX-S0 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO31 || MUX-S1 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO32 || MUX-S2 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO33 || PWM-GAIN || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO34 || PWM-OFFSET || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO35 || PWM-CURRENT || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO36 || EN-PULLUP || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO37 || ENDSTOP-12-DIR || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO38 || FAN-OC (overcurrent) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO40 / ADC0 || THERM-1 || J27&lt;br /&gt;
|-&lt;br /&gt;
| GPIO41 / ADC1 || THERM-2 || J28&lt;br /&gt;
|-&lt;br /&gt;
| GPIO42 / ADC2 || THERM-3 || J29&lt;br /&gt;
|-&lt;br /&gt;
| GPIO43 / ADC3 || THERM-4 || J30&lt;br /&gt;
|-&lt;br /&gt;
| GPIO44 / ADC4 || THERM-5 || J31&lt;br /&gt;
|-&lt;br /&gt;
| GPIO45 / ADC5 || THERM-6 || J32&lt;br /&gt;
|-&lt;br /&gt;
| GPIO46 / ADC6 || ADC (MUX output) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO47 / ADC7 || CURRENT sense || Internal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Hardware connections==&lt;br /&gt;
&lt;br /&gt;
===Power===&lt;br /&gt;
The board takes 24 V DC on a 4-pin connector (J33). A fuse (F1) and a 2 mΩ current-sense resistor (R98) protect the input. Onboard regulators provide +5 V (TPS54302 buck converter, 3 A) and +3.3 V (AMS1117-3.3, 1 A) for logic and sensor pull-ups.&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
Six heater outputs use 2SK3019 N-channel MOSFETs driven from GPIO0–GPIO5. Each output has a 2-pin female connector and a flyback Schottky diode. The heater voltage is 24 V.&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
Six fan outputs (GPIO6–GPIO11) use N-channel MOSFETs with a 24 V supply. Each has a 3-pin connector (V+, GND, TACH). Tachometer signals are read on GPIO12–GPIO17. An LM393 comparator monitors the fan bus for overcurrent and signals FAN-OC on GPIO38.&lt;br /&gt;
&lt;br /&gt;
===Thermistors===&lt;br /&gt;
Each thermistor channel has a 3-pin connector (J27–J32) with a jumper (JP1–JP6) to select the measurement mode. An analog MUX (CD4051) and op-amp signal conditioning chain feed the ADC inputs (GPIO40–GPIO45). The signal conditioning supports:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sensor type !! Measurement method&lt;br /&gt;
|-&lt;br /&gt;
| NTC 10K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| NTC 100K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| PT100 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| PT1000 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| Type K thermocouple || ×101 gain amplifier, buffered&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Endstops===&lt;br /&gt;
Twelve endstop inputs (J14–J25) each provide +5 V, signal, and GND on a 3-pin connector. Signals are level-shifted to 3.3 V and protected by SMF24A TVS diodes. ENDSTOP-12 (J25) additionally supports a bidirectional direction signal via a SN74LVC1T45 level translator, suitable for filament motion sensors or encoders.&lt;br /&gt;
&lt;br /&gt;
==Klipper configuration==&lt;br /&gt;
&lt;br /&gt;
The Reheat A0 connects to the host over USB and is configured as an MCU in Klipper. Find the serial path with &amp;lt;code&amp;gt;ls /dev/serial/by-id/&amp;lt;/code&amp;gt; and add to &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_XXXXXXXXXXXX-if00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[heater_generic heater1]&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio40&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio41&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[fan_generic fan1]&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
&lt;br /&gt;
[fan_generic fan2]&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Endstops===&lt;br /&gt;
Endstop pins can be referenced in the relevant stepper sections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[stepper_x]&lt;br /&gt;
endstop_pin: reheat:gpio18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Flashing Klipper==&lt;br /&gt;
&lt;br /&gt;
# Put the board in BOOTSEL mode: hold the BOOT button while plugging in USB (or hold BOOT, press RESET, then release BOOT).&lt;br /&gt;
# Build and flash from the Klipper source directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make menuconfig&lt;br /&gt;
# Processor model: rp2350&lt;br /&gt;
# Bootloader offset: No bootloader&lt;br /&gt;
# Communication interface: USBSERIAL&lt;br /&gt;
make&lt;br /&gt;
picotool load out/klipper.uf2 --force&lt;br /&gt;
picotool reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The board will reboot and appear as &amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; (or similar).&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]]&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# DP/DM USB data lines are swapped.&lt;br /&gt;
# RUN pin is hardwired to ground, preventing software reset.&lt;br /&gt;
# U11 and U15 (LMV321 op-amps in thermistor circuit) have V+ and V- supply pins reversed.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1631</id>
		<title>Reheat A0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1631"/>
		<updated>2026-05-16T17:49:31Z</updated>

		<summary type="html">&lt;p&gt;Elias: Add full Reheat A0 documentation from schematic: pinout, hardware connections, Klipper config, flashing instructions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reheat is a 6 output heater board with temperature sensors and fans for multi material printing.&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reheat A0.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schematics==&lt;br /&gt;
* [https://github.com/intelligent-agent/Recore/blob/master/Schematics/Reheat_A0.pdf Reheat A0 Schematics (PDF)]&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
* RP2354B microcontroller (ARM Cortex-M33, 150 MHz)&lt;br /&gt;
* 6x heater outputs (24 V, MOSFET-switched)&lt;br /&gt;
* 6x fan outputs (24 V PWM) with tachometer inputs&lt;br /&gt;
* 6x thermistor/temperature sensor inputs&lt;br /&gt;
** Supports: NTC 10K, NTC 100K, PT100, PT1000, Type K thermocouple&lt;br /&gt;
** Jumper-selectable per channel&lt;br /&gt;
* 12x endstop inputs (5 V tolerant, TVS-protected)&lt;br /&gt;
** ENDSTOP-12 supports a bidirectional signal (e.g. filament encoder)&lt;br /&gt;
* USB-C interface (USB 2.0)&lt;br /&gt;
* 24 V power input with onboard 5 V (3 A) and 3.3 V regulation&lt;br /&gt;
* Overcurrent detection on fan bus&lt;br /&gt;
&lt;br /&gt;
==Pinout==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! GPIO !! Signal !! Connector&lt;br /&gt;
|-&lt;br /&gt;
| GPIO0 || HEATER-1 || J2&lt;br /&gt;
|-&lt;br /&gt;
| GPIO1 || HEATER-2 || J3&lt;br /&gt;
|-&lt;br /&gt;
| GPIO2 || HEATER-3 || J6&lt;br /&gt;
|-&lt;br /&gt;
| GPIO3 || HEATER-4 || J11&lt;br /&gt;
|-&lt;br /&gt;
| GPIO4 || HEATER-5 || J12&lt;br /&gt;
|-&lt;br /&gt;
| GPIO5 || HEATER-6 || J13&lt;br /&gt;
|-&lt;br /&gt;
| GPIO6 || FAN-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO7 || FAN-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO8 || FAN-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO9 || FAN-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO10 || FAN-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO11 || FAN-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO12 || TACH-1 || J34&lt;br /&gt;
|-&lt;br /&gt;
| GPIO13 || TACH-2 || J35&lt;br /&gt;
|-&lt;br /&gt;
| GPIO14 || TACH-3 || J36&lt;br /&gt;
|-&lt;br /&gt;
| GPIO15 || TACH-4 || J37&lt;br /&gt;
|-&lt;br /&gt;
| GPIO16 || TACH-5 || J38&lt;br /&gt;
|-&lt;br /&gt;
| GPIO17 || TACH-6 || J39&lt;br /&gt;
|-&lt;br /&gt;
| GPIO18 || ENDSTOP-1 || J14&lt;br /&gt;
|-&lt;br /&gt;
| GPIO19 || ENDSTOP-2 || J15&lt;br /&gt;
|-&lt;br /&gt;
| GPIO20 || ENDSTOP-3 || J16&lt;br /&gt;
|-&lt;br /&gt;
| GPIO21 || ENDSTOP-4 || J17&lt;br /&gt;
|-&lt;br /&gt;
| GPIO22 || ENDSTOP-5 || J18&lt;br /&gt;
|-&lt;br /&gt;
| GPIO23 || ENDSTOP-6 || J19&lt;br /&gt;
|-&lt;br /&gt;
| GPIO24 || ENDSTOP-7 || J20&lt;br /&gt;
|-&lt;br /&gt;
| GPIO25 || ENDSTOP-8 || J21&lt;br /&gt;
|-&lt;br /&gt;
| GPIO26 || ENDSTOP-9 || J22&lt;br /&gt;
|-&lt;br /&gt;
| GPIO27 || ENDSTOP-10 || J23&lt;br /&gt;
|-&lt;br /&gt;
| GPIO28 || ENDSTOP-11 || J24&lt;br /&gt;
|-&lt;br /&gt;
| GPIO29 || ENDSTOP-12 || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO30 || MUX-S0 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO31 || MUX-S1 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO32 || MUX-S2 || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO33 || PWM-GAIN || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO34 || PWM-OFFSET || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO35 || PWM-CURRENT || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO36 || EN-PULLUP || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO37 || ENDSTOP-12-DIR || J25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO38 || FAN-OC (overcurrent) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO40 / ADC0 || THERM-1 || J27&lt;br /&gt;
|-&lt;br /&gt;
| GPIO41 / ADC1 || THERM-2 || J28&lt;br /&gt;
|-&lt;br /&gt;
| GPIO42 / ADC2 || THERM-3 || J29&lt;br /&gt;
|-&lt;br /&gt;
| GPIO43 / ADC3 || THERM-4 || J30&lt;br /&gt;
|-&lt;br /&gt;
| GPIO44 / ADC4 || THERM-5 || J31&lt;br /&gt;
|-&lt;br /&gt;
| GPIO45 / ADC5 || THERM-6 || J32&lt;br /&gt;
|-&lt;br /&gt;
| GPIO46 / ADC6 || ADC (MUX output) || Internal&lt;br /&gt;
|-&lt;br /&gt;
| GPIO47 / ADC7 || CURRENT sense || Internal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Hardware connections==&lt;br /&gt;
&lt;br /&gt;
===Power===&lt;br /&gt;
The board takes 24 V DC on a 4-pin connector (J33). A fuse (F1) and a 2 mΩ current-sense resistor (R98) protect the input. Onboard regulators provide +5 V (TPS54302 buck converter, 3 A) and +3.3 V (AMS1117-3.3, 1 A) for logic and sensor pull-ups.&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
Six heater outputs use 2SK3019 N-channel MOSFETs driven from GPIO0–GPIO5. Each output has a 2-pin female connector and a flyback Schottky diode. The heater voltage is 24 V.&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
Six fan outputs (GPIO6–GPIO11) use N-channel MOSFETs with a 24 V supply. Each has a 3-pin connector (V+, GND, TACH). Tachometer signals are read on GPIO12–GPIO17. An LM393 comparator monitors the fan bus for overcurrent and signals FAN-OC on GPIO38.&lt;br /&gt;
&lt;br /&gt;
===Thermistors===&lt;br /&gt;
Each thermistor channel has a 3-pin connector (J27–J32) with a jumper (JP1–JP6) to select the measurement mode. An analog MUX (CD4051) and op-amp signal conditioning chain feed the ADC inputs (GPIO40–GPIO45). The signal conditioning supports:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sensor type !! Measurement method&lt;br /&gt;
|-&lt;br /&gt;
| NTC 10K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| NTC 100K || Voltage divider with 4.7 K pull-up&lt;br /&gt;
|-&lt;br /&gt;
| PT100 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| PT1000 || 1 mA constant current source (Kelvin connection)&lt;br /&gt;
|-&lt;br /&gt;
| Type K thermocouple || ×101 gain amplifier, buffered&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Endstops===&lt;br /&gt;
Twelve endstop inputs (J14–J25) each provide +5 V, signal, and GND on a 3-pin connector. Signals are level-shifted to 3.3 V and protected by SMF24A TVS diodes. ENDSTOP-12 (J25) additionally supports a bidirectional direction signal via a SN74LVC1T45 level translator, suitable for filament motion sensors or encoders.&lt;br /&gt;
&lt;br /&gt;
==Klipper configuration==&lt;br /&gt;
&lt;br /&gt;
The Reheat A0 connects to the host over USB and is configured as an MCU in Klipper. Find the serial path with &amp;lt;code&amp;gt;ls /dev/serial/by-id/&amp;lt;/code&amp;gt; and add to &amp;lt;code&amp;gt;printer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mcu reheat]&lt;br /&gt;
serial: /dev/serial/by-id/usb-Klipper_rp2350_XXXXXXXXXXXX-if00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Heaters===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[heater_generic heater1]&lt;br /&gt;
heater_pin: reheat:gpio0&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio40&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&lt;br /&gt;
[heater_generic heater2]&lt;br /&gt;
heater_pin: reheat:gpio1&lt;br /&gt;
sensor_type: NTC 100K MGB18-104F39050L32&lt;br /&gt;
sensor_pin: reheat:gpio41&lt;br /&gt;
control: pid&lt;br /&gt;
pid_Kp: 22&lt;br /&gt;
pid_Ki: 1.08&lt;br /&gt;
pid_Kd: 114&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fans===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[fan_generic fan1]&lt;br /&gt;
pin: reheat:gpio6&lt;br /&gt;
&lt;br /&gt;
[fan_generic fan2]&lt;br /&gt;
pin: reheat:gpio7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Endstops===&lt;br /&gt;
Endstop pins can be referenced in the relevant stepper sections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[stepper_x]&lt;br /&gt;
endstop_pin: reheat:gpio18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Flashing Klipper==&lt;br /&gt;
&lt;br /&gt;
# Put the board in BOOTSEL mode: hold the BOOT button while plugging in USB (or hold BOOT, press RESET, then release BOOT).&lt;br /&gt;
# Build and flash from the Klipper source directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make menuconfig&lt;br /&gt;
# Processor model: rp2350&lt;br /&gt;
# Bootloader offset: No bootloader&lt;br /&gt;
# Communication interface: USBSERIAL&lt;br /&gt;
make&lt;br /&gt;
picotool load out/klipper.uf2 --force&lt;br /&gt;
picotool reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The board will reboot and appear as &amp;lt;code&amp;gt;/dev/ttyACM0&amp;lt;/code&amp;gt; (or similar).&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]]&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
	<entry>
		<id>https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1630</id>
		<title>Reheat A0</title>
		<link rel="alternate" type="text/html" href="https://wiki.iagent.no/mediawiki/index.php?title=Reheat_A0&amp;diff=1630"/>
		<updated>2026-05-16T17:46:12Z</updated>

		<summary type="html">&lt;p&gt;Elias: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reheat is a 6 output heater board with temperature sensors and fans for multi material printing. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Reheat A0.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Hardware connections==&lt;br /&gt;
&lt;br /&gt;
The Revolt add-on baord is designed to stack on top of the Recore A7 board. There are two dual row connectors on the Revolt board, but only one on Recore A7. The enable/disable for the TMC2160 drivers are connected to the +24V from the bottom board, so the drivers are enabled when . It is enabled by default. There is also no diag output from the drivers. Those are broken out on the two other rows and can be connected to pins on the MCU header or DBG header if sensorless homing is required. &lt;br /&gt;
&lt;br /&gt;
==Klipper config==&lt;br /&gt;
This config is using stepper x and y as the high voltage drivers, typical of a core-xy printer setup for speed. This gives the option of having 4 Z-drives and two extruders, 8 steppers in total.&lt;br /&gt;
&lt;br /&gt;
This section sets up the two drivers (X = S6 and Y = S7)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[tmc5160 stepper_x]&lt;br /&gt;
run_current: 0.6&lt;br /&gt;
hold_current: 0.2&lt;br /&gt;
sense_resistor: 0.05&lt;br /&gt;
cs_pin: ar100:PD0&lt;br /&gt;
spi_software_sclk_pin: ar100:PD2&lt;br /&gt;
spi_software_mosi_pin: ar100:PD1&lt;br /&gt;
spi_software_miso_pin: ar100:PD3&lt;br /&gt;
chain_position: 2&lt;br /&gt;
chain_length: 2&lt;br /&gt;
stealthchop_threshold: 9999&lt;br /&gt;
&lt;br /&gt;
[tmc5160 stepper_y]&lt;br /&gt;
run_current: 0.6&lt;br /&gt;
hold_current: 0.2&lt;br /&gt;
sense_resistor: 0.05&lt;br /&gt;
cs_pin: ar100:PD0&lt;br /&gt;
chain_position: 1&lt;br /&gt;
chain_length: 2&lt;br /&gt;
stealthchop_threshold: 9999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To route step and dir signals to the same motors: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[stepper_x]&lt;br /&gt;
step_pin: ar100:PL10&lt;br /&gt;
dir_pin: ar100:PE14&lt;br /&gt;
&lt;br /&gt;
[stepper_y]&lt;br /&gt;
step_pin: ar100:PL11&lt;br /&gt;
dir_pin: !ar100:PE15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Recompiling Klipper==&lt;br /&gt;
&amp;lt;div class=&amp;quot;alert alert-warning&amp;quot;&amp;gt;&lt;br /&gt;
====&#039;&#039;&#039;Note&#039;&#039;&#039;====&lt;br /&gt;
If you use Rebuild v1.0.0-RC0 or later, a recompilation is not necessary.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Klipper needs to be recompiled to add software based SPI. Starting with Refactor v3.2.0-RC3&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/debian/klipper&lt;br /&gt;
nano src/Makefile&lt;br /&gt;
&amp;lt;remove thermocouple.c sensor_adxl345.c and sensor_angle.c&amp;gt;&lt;br /&gt;
make menuconfig&lt;br /&gt;
&amp;lt;enable Support software based SPI &amp;quot;bit-banging&amp;quot;&amp;gt;&lt;br /&gt;
make clean&lt;br /&gt;
make&lt;br /&gt;
mv out/ar100.bin /opt/firmware/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tuning curves==&lt;br /&gt;
The following oscilloscope capture shows the Revolt A1 running a NEMA 17 stepper at 30 V. The traces are A1 output (yellow) and gate for A1 (pink). The tuning looks good, very little ringing. &lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Tuning gate and source.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Errata==&lt;br /&gt;
# Plus and minus silkscreen has changed places.&lt;br /&gt;
# The enable LED is lighting even though the 24 V input is not present.&lt;/div&gt;</summary>
		<author><name>Elias</name></author>
	</entry>
</feed>