mirror of
https://github.com/openglow-org/forgefirm.git
synced 2026-09-27 16:51:12 -07:00
SAFETY.md and the safing figure name GPIO4_06 for what it is - the readback of the chain's HV_ENABLE output through U24 (the factory net label E-STOP is kept as a note); BRINGUP records the rename, the device-tree polarity flip that makes bit 4 read as HV_ENABLE itself, the removal of the estop_halts_motion opt-in, and the bench check for the flash that ships it. Recipe pins move to forgectrl 801f1f3, grblHAL-glowforge b629c18 and python3-gfhardware c3d1790 (PV 0.1.5).
216 lines
14 KiB
XML
216 lines
14 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1500 860" width="1500" height="860" font-family="Segoe UI, Helvetica, Arial, sans-serif" font-size="13">
|
|
<title>Glowforge laser safing chain as run by ForgeFIRM</title>
|
|
<desc>Lid switches, the charge-pump watchdog, the button latch, the interlock latch and the FIRE line combine on the factory control board into HV_ENABLE and LASER_ON for the laser power supply; the SoC drives four lines and reads back the rest.</desc>
|
|
<defs>
|
|
<marker id="arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
|
<path d="M0 0 L10 5 L0 10 z" fill="#222"/>
|
|
</marker>
|
|
<style>
|
|
.wire { fill: none; stroke: #222; stroke-width: 2; }
|
|
.wire-out { fill: none; stroke: #222; stroke-width: 2; marker-end: url(#arr); }
|
|
.dot { fill: #222; }
|
|
.gate { fill: #ffffff; stroke: #222; stroke-width: 1.6; }
|
|
.gate-l { font-weight: 700; font-size: 13px; text-anchor: middle; fill: #111; }
|
|
.gate-s { font-size: 10px; text-anchor: middle; fill: #555; }
|
|
.pin { font-size: 10px; fill: #444; }
|
|
.in-tag { fill: #e9ebee; stroke: #6b7280; stroke-width: 1.2; }
|
|
.out-tag { fill: #dbeafe; stroke: #2563eb; stroke-width: 1.2; }
|
|
.rb-tag { fill: #fef3c7; stroke: #d97706; stroke-width: 1.2; }
|
|
.psu-tag { fill: #fee2e2; stroke: #dc2626; stroke-width: 1.2; }
|
|
.tag-t { font-size: 12px; font-weight: 700; fill: #111; }
|
|
.tag-s { font-size: 10px; fill: #444; }
|
|
.region { fill: #f6f7f9; stroke: #b8bec8; stroke-width: 1; stroke-dasharray: 5 4; }
|
|
.region-l { font-size: 12px; font-weight: 700; fill: #4b5563; letter-spacing: 0.4px; }
|
|
.net { font-size: 11px; font-style: italic; fill: #333; }
|
|
.note { font-size: 12px; fill: #222; }
|
|
.title { font-size: 18px; font-weight: 700; fill: #111; }
|
|
</style>
|
|
</defs>
|
|
|
|
<rect width="1500" height="860" fill="#ffffff"/>
|
|
<text x="20" y="30" class="title">Glowforge control board — laser safing chain, as run by ForgeFIRM</text>
|
|
|
|
<!-- regions -->
|
|
<rect x="20" y="52" width="212" height="640" class="region"/>
|
|
<text x="30" y="70" class="region-l">PHYSICAL INPUTS</text>
|
|
<rect x="250" y="52" width="1010" height="640" class="region"/>
|
|
<text x="260" y="70" class="region-l">CONTROL-BOARD SAFING LOGIC (hardware)</text>
|
|
<rect x="1290" y="52" width="192" height="640" class="region"/>
|
|
<text x="1300" y="70" class="region-l">LASER POWER SUPPLY (J1)</text>
|
|
|
|
<!-- ===================== Row A: lid switches ===================== -->
|
|
<rect x="40" y="90" width="172" height="28" rx="5" class="in-tag"/>
|
|
<text x="50" y="109" class="tag-t">LID_SW1</text><text x="122" y="109" class="tag-s">J4_13 · closed = 1</text>
|
|
<rect x="40" y="130" width="172" height="28" rx="5" class="in-tag"/>
|
|
<text x="50" y="149" class="tag-t">LID_SW2</text><text x="122" y="149" class="tag-s">J4_12 · closed = 1</text>
|
|
<path class="wire" d="M212 104 H330"/>
|
|
<path class="wire" d="M212 144 H310 V116 H330"/>
|
|
<rect x="330" y="84" width="64" height="44" rx="6" class="gate"/>
|
|
<text x="362" y="103" class="gate-l">AND</text><text x="362" y="118" class="gate-s">U17-1</text>
|
|
<path class="wire" d="M394 106 H740 V136 H760"/>
|
|
<circle cx="470" cy="106" r="3.5" class="dot"/>
|
|
<text x="480" y="98" class="net">DOORS_OK (both lid switches closed)</text>
|
|
<!-- doors readback -->
|
|
<path class="wire" d="M560 106 V126"/>
|
|
<rect x="500" y="126" width="150" height="24" rx="5" class="rb-tag"/>
|
|
<text x="508" y="142" class="tag-t">doors</text><text x="552" y="142" class="tag-s">EV_SW 3 · GPIO1_00</text>
|
|
|
|
<!-- ===================== Row B: charge-pump watchdog / HV_ENABLE ===================== -->
|
|
<rect x="262" y="176" width="190" height="40" rx="5" class="out-tag"/>
|
|
<text x="270" y="192" class="tag-t">CHG_PUMP</text><text x="352" y="192" class="tag-s">GPIO3_24</text>
|
|
<text x="270" y="207" class="tag-s">200 ms pulses, only while running</text>
|
|
<path class="wire" d="M452 196 H500"/>
|
|
<rect x="500" y="174" width="90" height="44" rx="6" class="gate"/>
|
|
<text x="545" y="192" class="gate-l">one-shot</text><text x="545" y="207" class="gate-s">U1-1 · t_w ≈ 0.45 s</text>
|
|
<path class="wire" d="M590 196 H620 V156 H760"/>
|
|
<circle cx="620" cy="196" r="3.5" class="dot"/>
|
|
<text x="630" y="190" class="net">WDOG_ALIVE</text>
|
|
<!-- charge_pump_alive readback -->
|
|
<path class="wire" d="M620 196 V222"/>
|
|
<rect x="540" y="222" width="212" height="24" rx="5" class="rb-tag"/>
|
|
<text x="548" y="238" class="tag-t">charge_pump_alive</text><text x="672" y="238" class="tag-s">GPIO1_08 (¬Q)</text>
|
|
<!-- AND U17-4 -->
|
|
<rect x="760" y="124" width="64" height="44" rx="6" class="gate"/>
|
|
<text x="792" y="143" class="gate-l">AND</text><text x="792" y="158" class="gate-s">U17-4</text>
|
|
<path class="wire-out" d="M824 146 H1300"/>
|
|
<circle cx="880" cy="146" r="3.5" class="dot"/>
|
|
<text x="900" y="166" class="net">HV_ENABLE</text>
|
|
<!-- U24 inverter -> hv_enable readback (factory net name E-STOP) -->
|
|
<path class="wire" d="M880 146 V88 H930"/>
|
|
<rect x="930" y="70" width="64" height="36" rx="6" class="gate"/>
|
|
<text x="962" y="86" class="gate-l">NOT</text><text x="962" y="99" class="gate-s">U24</text>
|
|
<path class="wire" d="M994 88 H1010"/>
|
|
<rect x="1010" y="76" width="262" height="24" rx="5" class="rb-tag"/>
|
|
<text x="1018" y="92" class="tag-t">hv_enable</text><text x="1092" y="92" class="tag-s">EV_SW 4 · GPIO4_06 · readback</text>
|
|
<!-- PSU tag HV_ENABLE -->
|
|
<rect x="1300" y="132" width="172" height="28" rx="5" class="psu-tag"/>
|
|
<text x="1308" y="151" class="tag-t">J1_16</text><text x="1354" y="151" class="tag-s">HV_ENABLE</text>
|
|
<text x="1300" y="180" class="note">HV runs only while this</text>
|
|
<text x="1300" y="196" class="note">line is alive (pulsed).</text>
|
|
|
|
<!-- ===================== Row C: button latch ===================== -->
|
|
<!-- ¬DOORS_OK -->
|
|
<path class="wire" d="M470 106 V190 A6 6 0 0 1 470 202 V288 H500"/>
|
|
<rect x="500" y="270" width="64" height="36" rx="6" class="gate"/>
|
|
<text x="532" y="286" class="gate-l">NOT</text><text x="532" y="299" class="gate-s">U5-4</text>
|
|
<path class="wire" d="M564 288 H584 V280 H600"/>
|
|
<text x="565" y="266" class="net">lid open</text>
|
|
<!-- LATCH_RESET -->
|
|
<rect x="262" y="296" width="190" height="40" rx="5" class="out-tag"/>
|
|
<text x="270" y="312" class="tag-t">LATCH_RESET</text><text x="366" y="312" class="tag-s">GPIO1_07</text>
|
|
<text x="270" y="327" class="tag-s">cnc/laser_latch: 1 = lock (FIRE also Hi-Z)</text>
|
|
<path class="wire" d="M452 316 H584 V300 H600"/>
|
|
<!-- OR U32 -->
|
|
<rect x="600" y="268" width="64" height="44" rx="6" class="gate"/>
|
|
<text x="632" y="287" class="gate-l">OR</text><text x="632" y="302" class="gate-s">U32</text>
|
|
<path class="wire" d="M664 290 H720"/>
|
|
<!-- button latch -->
|
|
<rect x="720" y="272" width="124" height="76" rx="6" class="gate"/>
|
|
<text x="782" y="292" class="gate-l">Button latch</text>
|
|
<text x="782" y="306" class="gate-s">U23-1 · CD4043B</text>
|
|
<text x="782" y="320" class="gate-s">set-dominant</text>
|
|
<text x="726" y="294" class="pin">S</text>
|
|
<text x="726" y="336" class="pin">R</text>
|
|
<text x="832" y="314" class="pin">Q</text>
|
|
<!-- BUTTON -->
|
|
<rect x="40" y="332" width="172" height="28" rx="5" class="in-tag"/>
|
|
<text x="50" y="351" class="tag-t">BUTTON</text><text x="118" y="351" class="tag-s">J5 · pressed = 1</text>
|
|
<path class="wire" d="M212 346 H700 V332 H720"/>
|
|
<path class="wire" d="M330 346 V356"/>
|
|
<rect x="270" y="356" width="150" height="24" rx="5" class="rb-tag"/>
|
|
<text x="278" y="372" class="tag-t">button</text><text x="326" y="372" class="tag-s">EV_SW 2 · GPIO4_09</text>
|
|
<!-- Q1 -> NOT -> AND2 -->
|
|
<path class="wire" d="M844 311 H890"/>
|
|
<circle cx="868" cy="311" r="3.5" class="dot"/>
|
|
<rect x="890" y="293" width="64" height="36" rx="6" class="gate"/>
|
|
<text x="922" y="309" class="gate-l">NOT</text><text x="922" y="322" class="gate-s">U5-6</text>
|
|
<path class="wire" d="M954 311 H975 V380 H1000"/>
|
|
<text x="958" y="345" class="net">¬Q1</text>
|
|
<!-- button_latch readback -->
|
|
<path class="wire" d="M868 311 V262"/>
|
|
<rect x="770" y="238" width="222" height="24" rx="5" class="rb-tag"/>
|
|
<text x="778" y="254" class="tag-t">button_latch</text><text x="864" y="254" class="tag-s">GPIO1_03 · = Q1 · 1 = set</text>
|
|
|
|
<!-- ===================== Row D: interlock latch ===================== -->
|
|
<rect x="262" y="462" width="190" height="40" rx="5" class="out-tag"/>
|
|
<text x="270" y="478" class="tag-t">INTERLOCK_RESET</text><text x="386" y="478" class="tag-s">GPIO4_05</text>
|
|
<text x="270" y="493" class="tag-s">1 while loop open or unobserved</text>
|
|
<path class="wire" d="M452 476 H720"/>
|
|
<rect x="720" y="458" width="124" height="76" rx="6" class="gate"/>
|
|
<text x="782" y="478" class="gate-l">Interlock latch</text>
|
|
<text x="782" y="492" class="gate-s">U23-2 · CD4043B</text>
|
|
<text x="782" y="506" class="gate-s">set-dominant</text>
|
|
<text x="726" y="480" class="pin">S</text>
|
|
<text x="726" y="522" class="pin">R</text>
|
|
<text x="832" y="500" class="pin">Q</text>
|
|
<!-- INTERLOCK loop -->
|
|
<rect x="40" y="504" width="172" height="40" rx="5" class="in-tag"/>
|
|
<text x="50" y="520" class="tag-t">INTERLOCK loop</text><text x="160" y="520" class="tag-s">J8</text>
|
|
<text x="50" y="535" class="tag-s">jumpered on Basic/Plus · closed = 1</text>
|
|
<path class="wire" d="M212 518 H720"/>
|
|
<path class="wire" d="M330 518 V540"/>
|
|
<rect x="270" y="540" width="262" height="24" rx="5" class="rb-tag"/>
|
|
<text x="278" y="556" class="tag-t">interlock</text><text x="340" y="556" class="tag-s">EV_SW 5 · GPIO1_09 · active = open</text>
|
|
<!-- Q2 -> NOT -> AND2 -->
|
|
<path class="wire" d="M844 497 H890"/>
|
|
<circle cx="868" cy="497" r="3.5" class="dot"/>
|
|
<rect x="890" y="479" width="64" height="36" rx="6" class="gate"/>
|
|
<text x="922" y="495" class="gate-l">NOT</text><text x="922" y="508" class="gate-s">U6-3</text>
|
|
<path class="wire" d="M954 497 H985 V400 H1000"/>
|
|
<text x="958" y="470" class="net">¬Q2</text>
|
|
<!-- interlock_latch readback -->
|
|
<path class="wire" d="M868 497 V546"/>
|
|
<rect x="770" y="546" width="236" height="24" rx="5" class="rb-tag"/>
|
|
<text x="778" y="562" class="tag-t">interlock_latch</text><text x="878" y="562" class="tag-s">EV_SW 6 · GPIO1_02 · = Q2</text>
|
|
|
|
<!-- ===================== Row E: LASER_ON ===================== -->
|
|
<rect x="1000" y="368" width="64" height="44" rx="6" class="gate"/>
|
|
<text x="1032" y="387" class="gate-l">AND</text><text x="1032" y="402" class="gate-s">U17-2</text>
|
|
<path class="wire" d="M1064 390 H1110"/>
|
|
<rect x="1110" y="378" width="64" height="44" rx="6" class="gate"/>
|
|
<text x="1142" y="397" class="gate-l">AND</text><text x="1142" y="412" class="gate-s">U17-3</text>
|
|
<!-- FIRE -->
|
|
<rect x="850" y="600" width="232" height="40" rx="5" class="out-tag"/>
|
|
<text x="858" y="616" class="tag-t">FIRE</text><text x="896" y="616" class="tag-s">GPIO2_30 (laser_enable)</text>
|
|
<text x="858" y="631" class="tag-s">SDMA pulse-byte bit 4 · Hi-Z when locked or idle</text>
|
|
<path class="wire" d="M1082 620 H1094 V410 H1110"/>
|
|
<!-- LASER_ON out -->
|
|
<path class="wire-out" d="M1174 400 H1300"/>
|
|
<circle cx="1210" cy="400" r="3.5" class="dot"/>
|
|
<text x="1182" y="392" class="net">LASER_ON</text>
|
|
<path class="wire" d="M1210 400 V446"/>
|
|
<rect x="1112" y="446" width="146" height="24" rx="5" class="rb-tag"/>
|
|
<text x="1120" y="462" class="tag-t">laser_on</text><text x="1182" y="462" class="tag-s">GPIO1_05</text>
|
|
<!-- PSU tag LASER_ON -->
|
|
<rect x="1300" y="386" width="172" height="28" rx="5" class="psu-tag"/>
|
|
<text x="1308" y="405" class="tag-t">J1_12</text><text x="1354" y="405" class="tag-s">LASER_ON</text>
|
|
<text x="1300" y="434" class="note">The tube fires only while</text>
|
|
<text x="1300" y="450" class="note">this line is high (and HV</text>
|
|
<text x="1300" y="466" class="note">is enabled). Power comes</text>
|
|
<text x="1300" y="482" class="note">from PWM on J1_13, which</text>
|
|
<text x="1300" y="498" class="note">is not part of the chain.</text>
|
|
|
|
<!-- ===================== equations ===================== -->
|
|
<text x="262" y="612" class="note" font-weight="700">HV_ENABLE = DOORS_OK · WDOG_ALIVE</text>
|
|
<text x="262" y="630" class="note" font-weight="700">LASER_ON = FIRE · ¬Q1 · ¬Q2</text>
|
|
<text x="262" y="652" class="note">Button latch: SET = lid open OR LATCH_RESET; RESET = button pressed. Cleared only by a press while the lid is closed and the lock released.</text>
|
|
<text x="262" y="670" class="note">Interlock latch: SET = INTERLOCK_RESET (driven by glowforge.ko while the loop reads open); RESET = loop closed. Both latches are set-dominant.</text>
|
|
|
|
<!-- ===================== legend ===================== -->
|
|
<rect x="20" y="712" width="1462" height="128" rx="6" fill="#ffffff" stroke="#b8bec8"/>
|
|
<text x="34" y="734" class="region-l">LEGEND</text>
|
|
<rect x="34" y="746" width="26" height="16" rx="3" class="in-tag"/>
|
|
<text x="68" y="759" class="note">physical switch or loop, wired to the board</text>
|
|
<rect x="34" y="770" width="26" height="16" rx="3" class="out-tag"/>
|
|
<text x="68" y="783" class="note">line driven by the SoC (glowforge.ko)</text>
|
|
<rect x="34" y="794" width="26" height="16" rx="3" class="rb-tag"/>
|
|
<text x="68" y="807" class="note">line read by the SoC — gpio-keys switch (EV_SW code) or /sys/glowforge/cnc attribute; monitoring only</text>
|
|
<rect x="34" y="818" width="26" height="16" rx="3" class="psu-tag"/>
|
|
<text x="68" y="831" class="note">output to the laser power supply</text>
|
|
<text x="760" y="759" class="note">Boxes are logic functions on the control board (part reference below each). Wires carry logic levels: 1 = true as named.</text>
|
|
<text x="760" y="777" class="note">Software can only withhold FIRE, hold LATCH_RESET, drive INTERLOCK_RESET, or stop feeding CHG_PUMP —</text>
|
|
<text x="760" y="795" class="note">every one of those makes the hardware block emission. Nothing on the SoC side can add an emission path.</text>
|
|
<text x="760" y="817" class="note">Also read: door1 / door2 (EV_SW 0 / 1, GPIO4_14 / GPIO1_06), the two lid switches individually;</text>
|
|
<text x="760" y="833" class="note">laser_pgood (GPIO4_21), the supply's HV_OK line on J1_14.</text>
|
|
</svg>
|