文件
phonerail/.claude/obsolete/p2-nets.py
T
zhou yang和Claude Opus 5 2bfe308b30 初始导入:PhoneRail 五路手机直供电源板
原理图/PCB 已在 EasyEDA 里做到 12 页跨页 0 漏接,固件刚完成骨架包 A1。
这次是把已有的一切一次性纳入版本控制,没有改动任何设计内容。

纳入:
- 设计与需求文档、PROGRESS.md、小米8 参考原理图 PDF 与追脚脚本
- .claude/ 下的 EasyEDA 桥接工具链与几何/网表缓存(eda-parts.json、
  pcb-parts.json、pcb-pads.json、p2-ch1.json 等,是重画各页的唯一事实来源)
- 117 张验证截图(本项目所有方向问题都是靠人眼看截图发现的,属于证据不是垃圾)
- firmware/ 的 A1 骨架与 site/ 文档站源码

.gitignore 排除:构建产物(firmware/build、host/build、sdkconfig)、
site/node_modules、__pycache__、桥接日志 _bridge.log、脚本自标的 *.stale。

.gitattributes 默认 `* -text`:现有 .py/.json 大多是 CRLF,原样存,
不让 git 重写行尾。唯一例外是 *.sh 强制 LF —— 带 \r 的 shell 脚本 bash 跑不了。

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01QYuExfgyYa6DzRRcUso8M8
2026-09-06 18:18:14 +08:00

192 行
8.9 KiB
Python

# -*- coding: utf-8 -*-
"""P2-CHANNEL 单路完整连线定义。跑 `python nets.py` 做本地几何校验。"""
import sys
from router import w, gnd, pwr, port, txt, check, crossings, SEGS, FLAGS, PORTS
MULTI = {'GND', '+3V3', '+12V', 'VO1', 'EFUSE_EN1', 'VO1_P'}
# ===== Block 1 Buck =====
pwr('+12V', 90, 795)
w('+12V', (90, 795), (90, 645))
w('+12V', (90, 775), (225, 775))
for x in (120, 155, 190, 225):
w('+12V', (x, 775), (x, 760))
w('+12V', (90, 645), (230, 645)); w('+12V', (230, 645), (240, 645))
w('+12V', (230, 645), (230, 665))
w('+12V', (230, 655), (240, 655))
w('+12V', (230, 665), (240, 665))
for x in (120, 155, 190, 225):
w('GND', (x, 720), (x, 705))
w('GND', (100, 705), (225, 705))
w('GND', (100, 695), (100, 705))
w('GND', (240, 685), (210, 685)); w('GND', (240, 675), (210, 675))
w('GND', (210, 675), (210, 705))
w('GND', (170, 705), (170, 690)); gnd(170, 690)
w('RT1', (240, 695), (140, 695))
w('EN12V', (360, 655), (430, 655)); w('EN12V', (430, 655), (430, 550))
w('EN12V', (430, 550), (445, 550))
w('EN12V', (445, 570), (445, 530))
w('+12V', (445, 610), (445, 630)); pwr('+12V', 445, 630)
w('GND', (445, 490), (445, 470)); gnd(445, 470)
w('SS1', (360, 645), (400, 645)); w('SS1', (400, 645), (400, 615))
w('GND', (400, 585), (400, 565)); gnd(400, 565)
w('COMP1', (360, 635), (385, 635)); w('COMP1', (385, 635), (385, 565))
w('COMP1', (385, 565), (340, 565))
w('COMP1', (295, 525), (295, 590)); w('COMP1', (295, 590), (385, 590))
w('COMPZ', (340, 525), (340, 505))
w('GND', (340, 470), (340, 450)); w('GND', (295, 495), (295, 450))
w('GND', (295, 450), (340, 450)); w('GND', (315, 450), (315, 435)); gnd(315, 435)
w('GND', (360, 625), (375, 625)); w('GND', (375, 625), (375, 610)); gnd(375, 610)
w('BOOT1', (360, 685), (380, 685)); w('BOOT1', (380, 685), (380, 730))
w('SW1', (360, 675), (420, 675))
w('SW1', (360, 665), (400, 665)); w('SW1', (400, 665), (400, 675))
w('SW1', (420, 730), (420, 700)); w('SW1', (420, 700), (410, 700))
w('SW1', (410, 700), (410, 675))
w('PWRGD', (360, 695), (370, 695)); w('PWRGD', (370, 695), (370, 760))
port('BUCK_PG', 370, 760, 0, 'OUT')
# ===== VO1 母线 =====
w('VO1', (460, 675), (630, 675))
w('VO1', (480, 655), (480, 675)); w('VO1', (515, 655), (515, 675))
w('VO1', (550, 660), (550, 675))
w('GND', (480, 625), (480, 615)); w('GND', (515, 625), (515, 615))
w('GND', (550, 620), (550, 615))
w('GND', (480, 615), (550, 615)); w('GND', (480, 615), (480, 600)); gnd(480, 600)
w('VO1', (465, 675), (465, 705)); port('VO1', 465, 705, 0, 'OUT')
# ===== Block 2 反馈 + DAC 注入 =====
w('VO1', (180, 360), (180, 385)); port('VO1', 180, 385, 0, 'IN')
w('FB1', (180, 320), (180, 280))
w('FB1', (240, 300), (180, 300))
w('FB1', (215, 300), (215, 635)); w('FB1', (215, 635), (240, 635))
w('GND', (180, 240), (180, 220)); gnd(180, 220)
w('VDAC_F', (280, 300), (350, 300))
w('VDAC_F', (325, 300), (325, 270))
w('GND', (325, 240), (325, 220)); gnd(325, 220)
w('VDAC1', (390, 300), (420, 300)); port('VDAC1', 420, 300, 0, 'IN')
# ===== Block 3 eFuse =====
w('VO1', (610, 675), (610, 655))
w('VO1', (610, 665), (630, 665)); w('VO1', (610, 655), (630, 655))
w('VO1', (600, 675), (600, 720)); w('VO1', (600, 720), (770, 720))
w('VO1', (770, 720), (770, 660))
w('VO1', (770, 675), (730, 675)); w('VO1', (770, 665), (730, 665))
w('EFUSE_EN1', (630, 645), (565, 645)); w('EFUSE_EN1', (565, 645), (565, 570))
w('EFUSE_EN1', (565, 570), (490, 570))
w('EFUSE_EN1', (530, 570), (530, 600)); port('EFUSE_EN1', 530, 600, 0, 'IN')
w('GND', (490, 530), (490, 510)); gnd(490, 510)
w('OVP1', (630, 635), (575, 635)); w('OVP1', (575, 635), (575, 525))
w('OVP1', (575, 525), (465, 525)); w('OVP1', (465, 525), (465, 500))
w('VO1', (465, 565), (465, 675))
w('GND', (465, 460), (465, 440)); gnd(465, 440)
w('GND', (630, 625), (585, 625)); w('GND', (585, 625), (585, 510))
w('GND', (585, 510), (545, 510)); gnd(545, 510)
w('ILIM1', (630, 615), (595, 615)); w('ILIM1', (595, 615), (595, 500))
w('ILIM1', (595, 500), (565, 500))
w('GND', (565, 460), (540, 460)); w('GND', (540, 460), (540, 445)); gnd(540, 445)
w('DVDT1', (630, 605), (605, 605)); w('DVDT1', (605, 605), (605, 440))
w('DVDT1', (605, 440), (595, 440))
w('GND', (595, 405), (595, 385)); w('GND', (595, 385), (575, 385)); gnd(575, 385)
w('IMON1', (630, 595), (610, 595)); w('IMON1', (610, 595), (610, 400))
w('IMON1', (610, 400), (520, 400))
w('GND', (480, 400), (460, 400)); w('GND', (460, 400), (460, 385)); gnd(460, 385)
w('FLT1', (630, 585), (620, 585)); w('FLT1', (620, 585), (620, 355))
w('FLT1', (620, 355), (545, 355))
w('+3V3', (545, 395), (545, 415)); pwr('+3V3', 545, 415)
w('FLT1', (600, 355), (600, 375)); port('EFUSE_FLT1', 600, 375, 0, 'OUT')
w('GND', (630, 575), (625, 575)); w('GND', (625, 575), (625, 340))
w('GND', (625, 340), (615, 340)); gnd(615, 340)
w('GND', (730, 585), (755, 585)); w('GND', (755, 585), (755, 565)); gnd(755, 565)
w('EFUSE_PG1', (730, 595), (790, 595)); w('EFUSE_PG1', (790, 595), (790, 565))
w('+3V3', (790, 525), (790, 505)); pwr('+3V3', 790, 505)
w('EFUSE_PG1', (760, 595), (760, 530)); port('EFUSE_PG1', 760, 530, 180, 'OUT')
w('PGTH1', (730, 605), (810, 605)); w('PGTH1', (810, 605), (810, 585))
w('PGTH1', (810, 585), (830, 585)); w('PGTH1', (830, 595), (830, 575))
w('GND', (830, 535), (830, 515)); gnd(830, 515)
for y in (615, 625, 635, 645, 655):
w('VO1_F', (730, y), (790, y))
w('VO1_F', (790, 655), (790, 615))
w('VO1_F', (790, 635), (900, 635))
w('VO1_P', (900, 675), (900, 695)); w('VO1_P', (900, 695), (1130, 695))
w('VO1_P', (1060, 695), (1060, 765)); w('VO1_P', (1060, 765), (1100, 765))
w('GND', (1100, 755), (1075, 755)); gnd(1075, 755)
# ===== INA226 =====
w('VO1_F', (870, 480), (880, 480)); w('VO1_F', (880, 480), (880, 635))
w('VO1_P', (870, 470), (930, 470)); w('VO1_P', (930, 470), (930, 695))
w('VO1_P', (870, 460), (890, 460)); w('VO1_P', (890, 460), (890, 470))
w('GND', (870, 450), (920, 450)); w('GND', (920, 450), (920, 425)); gnd(920, 425)
w('+3V3', (870, 440), (960, 440)); w('+3V3', (960, 440), (960, 520))
w('+3V3', (960, 520), (975, 520)); w('+3V3', (960, 545), (960, 520)); pwr('+3V3', 960, 545)
w('GND', (1015, 520), (1035, 520)); w('GND', (1035, 520), (1035, 500)); gnd(1035, 500)
w('GND', (770, 480), (740, 480)); w('GND', (770, 470), (740, 470))
w('GND', (740, 470), (740, 480)); w('GND', (740, 480), (685, 480))
w('GND', (685, 480), (685, 440)); gnd(685, 440)
w('INA_ALERT', (770, 460), (700, 460)); port('INA_ALERT', 700, 460, 180, 'OUT')
w('SDA', (770, 450), (700, 450)); w('SDA', (700, 450), (700, 400))
port('SDA', 700, 400, 180, 'BI')
w('SCL', (770, 440), (750, 440)); w('SCL', (750, 440), (750, 395))
port('SCL', 750, 395, 0, 'BI')
# ===== 放电联锁 =====
w('+3V3', (1060, 565), (1060, 585)); pwr('+3V3', 1060, 585)
w('DIS1_G', (1060, 525), (1060, 505)); w('DIS1_G', (1060, 505), (1090, 505))
w('DIS1_G', (1090, 505), (1090, 490))
w('DIS1_G', (1075, 505), (1075, 560)); w('DIS1_G', (1075, 560), (1100, 560))
w('GND', (1090, 450), (1090, 430)); gnd(1090, 430)
w('EFUSE_EN1', (1060, 470), (1060, 430)); w('EFUSE_EN1', (1060, 430), (1000, 430))
port('EFUSE_EN1', 1000, 430, 180, 'IN')
w('VO1_P', (1130, 650), (1130, 695))
w('DIS1_D', (1130, 610), (1130, 580))
w('GND', (1130, 540), (1130, 520)); gnd(1130, 520)
# ===== Block 4 按键驱动 + J7 =====
KEYS = [
('K1_PWR', 600, 380),
('K1_VUP', 760, 370),
('K1_VDN', 920, 360),
]
for name, rx, jy in KEYS:
w(name, (rx - 20, 300), (rx - 40, 300)); w(name, (rx - 40, 300), (rx - 40, 340))
port(name, rx - 40, 340, 0, 'IN')
w(name + '_G', (rx + 20, 300), (rx + 30, 300))
w(name + '_G', (rx + 25, 300), (rx + 25, 285))
w('GND', (rx + 25, 245), (rx + 25, 230)); gnd(rx + 25, 230)
w('GND', (rx + 60, 280), (rx + 60, 255)); gnd(rx + 60, 255)
w(name + '_D', (rx + 60, 320), (rx + 60, jy)); w(name + '_D', (rx + 60, jy), (1025, jy))
w('GND', (1025, 350), (1010, 350)); w('GND', (1010, 350), (1010, 330)); gnd(1010, 330)
w('GND', (1025, 330), (1010, 330))
w('GND', (1025, 400), (1025, 420)); w('GND', (1025, 420), (960, 420)); gnd(960, 420)
# ===== 文字 =====
txt('P2 CH1 单路通道(5 路完全相同:复制后改位号 / INA226 地址 / 网络名后缀)', 60, 805, 16)
txt('TPS54622: Vref 0.6V, fsw 480kHz(R3=100k), Vout = 4.222 - 0.2813*Vd', 60, 185, 11)
txt('TPS25940A: OVP 4.36V(R9/R10), ILIM 4.45A(R11), dVdT 33nF -> 0.36V/ms', 60, 165, 11)
txt('缓启动 11.5ms / 涌流 0.8A ; INA226 CH1: A1=A0=GND -> 0x40', 60, 145, 11)
txt('放电互锁: EN 低 -> Q1 截止 -> Q2 导通 -> R19 10R 泄放手机侧 2200uF', 60, 125, 11)
if __name__ == '__main__':
errs = [e for e in check()
if not any(e.startswith('网络 %s ' % m) for m in MULTI)]
for e in errs:
print('ERR', e)
print('--- segs %d flags %d ports %d ---' % (len(SEGS), len(FLAGS), len(PORTS)))
cr = crossings()
print('crossings %d:' % len(cr))
for c in cr:
print(' ', c)
sys.exit(1 if errs else 0)