Compare commits

..

No commits in common. "master" and "csa_mirror" have entirely different histories.

26 changed files with 25 additions and 346 deletions

5
.gitignore vendored
View file

@ -14,6 +14,9 @@ thhor_crs.xy
*.gbr
*.cnc
*.zip
gerber/*.pdf
gerber/*.odt
gerber/thhor_crs-*.png
*.o
*.d
*.eeprom
@ -25,6 +28,6 @@ sensor/*.pdf
vcd
*.log
sallen-key-pulse.hex
*~.pcb
*.backup
*.xy

9
gerber/.gitignore vendored
View file

@ -1,9 +0,0 @@
*.xy
*.gbr
*.cnc
*.zip
*.pdf
*.odt
*-bot.png
*-top.png
*.bom

View file

@ -1,3 +1,3 @@
PROJ = thhor_crs
VERSION = v01
include ../gerber.makefile
include gerber.makefile

View file

@ -2,10 +2,8 @@
# PROJ = …
# VERSION = v01
HERE = ..
PCBDIR = $(HERE)/..
GERBERS = $(PROJ).plated-drill.cnc
GVP2MAKE = $(HERE)/gvp2make.py
GVP2MAKE = ./gvp2make.py
GV_OPT = -D600
default: zip bom png
@ -23,21 +21,18 @@ GERBER_AWK = '/- +[-a-z_]+\.[-a-z]+\.[-a-z]+ +[a-z]/{print $$2}'
rm -fv $@
zip $@ $< $$(awk $(GERBER_AWK) $<)
%.plated-drill.cnc: $(PCBDIR)/%.pcb
%.plated-drill.cnc: ../%.pcb
pcb -x gerber --gerberfile $* --name-style single $<
bom: $(PROJ)_bom.pdf
%.bom: $(PCBDIR)/%.pcb
%.bom: ../%.pcb
pcb -x bom --bomfile $@ $<
%_bom.txt: %.bom
bom.py -h $< > $@
%_bom.pdf: %.bom $(HERE)/bom.py
$(word 2,$^) -h $< | utf82pdf > $@
%_bom.pdf: %.bom bom.py
bom.py -h $< | utf82pdf > $@
.PRECIOUS: %.plated-drill.cnc %.png
clean:
rm -f *.png *.pdf *.bom *.gbr *.cnc

BIN
gerber/thhor_crs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

View file

@ -1,3 +0,0 @@
PROJ = thhor_csa
VERSION = v01
include ../gerber.makefile

View file

@ -1,28 +0,0 @@
# Project thhor_csa version v01
Six layer rigid PCB, 6mil/8mil rules, 0.3mm vias, 8mil annular
- Size: 60x80 mm²
- Thickness: 1.6 mm.
- With soldermask, no silk.
- Surface finish HAL.
## Copper layer order:
- thhor_csa.top.gbr top side copper
- thhor_csa.ground.gbr chassis/analog ground
- thhor_csa.vcc.gbr power Vcc plane
- thhor_csa.vss.gbr power Vss plane
- thhor_csa.vfet.gbr power Vfet plane
- thhor_csa.bottom.gbr back side copper
## Mechanical layers
- thhor_csa.plated-drill.cnc drill file
- thhor_csa.outline.gbr board outline
- thhor_csa.topmask.gbr soldermask top
- thhor_csa.bottommask.gbr soldermask bottom
## Pretty picture
![gerbv export](thhor_csa.png)

View file

@ -1,82 +0,0 @@
(gerbv-file-version! "2.0A")
(define-layer! 14 (cons 'filename "thhor_csa.ground.gbr")
(cons 'visible #f)
(cons 'color #(27113 27113 27113))
(cons 'alpha #(12079))
)
(define-layer! 13 (cons 'filename "thhor_csa.vfet.gbr")
(cons 'visible #f)
(cons 'color #(65535 50491 34053))
(cons 'alpha #(12079))
)
(define-layer! 12 (cons 'filename "thhor_csa.vss.gbr")
(cons 'visible #f)
(cons 'color #(65535 34990 63468))
(cons 'alpha #(15163))
)
(define-layer! 11 (cons 'filename "thhor_csa.vcc.gbr")
(cons 'visible #f)
(cons 'color #(0 24400 24400))
(cons 'alpha #(15163))
)
(define-layer! 10 (cons 'filename "thhor_csa.bottom.gbr")
(cons 'visible #t)
(cons 'color #(60294 24022 3320))
)
(define-layer! 9 (cons 'filename "thhor_csa.bottompaste.gbr")
(cons 'visible #t)
(cons 'color #(63479 30069 17733))
)
(define-layer! 8 (cons 'filename "thhor_csa.bottommask.gbr")
(cons 'visible #f)
(cons 'color #(29344 65535 28765))
)
(define-layer! 7 (cons 'filename "thhor_csa.top.gbr")
(cons 'visible #f)
(cons 'color #(63383 4945 17070))
(cons 'alpha #(27242))
)
(define-layer! 6 (cons 'filename "thhor_csa.toppaste.gbr")
(cons 'visible #f)
(cons 'color #(65535 2469 0))
(cons 'alpha #(23644))
)
(define-layer! 5 (cons 'filename "thhor_csa.topmask.gbr")
(cons 'inverted #t)
(cons 'visible #f)
(cons 'color #(25200 65535 30627))
)
(define-layer! 4 (cons 'filename "thhor_csa.plated-drill.cnc")
(cons 'visible #t)
(cons 'color #(61307 61307 61307))
(cons 'alpha #(65535))
(cons 'attribs (list
(list 'autodetect 'Boolean 1)
(list 'zero_suppression 'Enum 0)
(list 'units 'Enum 0)
(list 'digits 'Integer 4)
))
)
(define-layer! 3 (cons 'filename "thhor_csa.bottomsilk.gbr")
(cons 'visible #t)
(cons 'color #(0 0 0))
(cons 'alpha #(65535))
)
(define-layer! 2 (cons 'filename "thhor_csa.topsilk.gbr")
(cons 'visible #f)
(cons 'color #(0 0 0))
(cons 'alpha #(65535))
)
(define-layer! 1 (cons 'filename "thhor_csa.outline.gbr")
(cons 'visible #t)
(cons 'color #(65535 47429 0))
(cons 'alpha #(65535))
)
(define-layer! 0 (cons 'filename "thhor_csa.fab.gbr")
(cons 'visible #f)
(cons 'color #(0 0 0))
)
(define-layer! -1 (cons 'filename "/home/falbala/stephan/eda/thhor_crs/gerber/thhor_csa")
(cons 'color #(65535 65535 65535))
)
(set-render-type! 3)

View file

@ -1,82 +0,0 @@
(gerbv-file-version! "2.0A")
(define-layer! 14 (cons 'filename "thhor_csa.ground.gbr")
(cons 'visible #f)
(cons 'color #(27113 27113 27113))
(cons 'alpha #(12079))
)
(define-layer! 13 (cons 'filename "thhor_csa.vfet.gbr")
(cons 'visible #f)
(cons 'color #(65535 50491 34053))
(cons 'alpha #(12079))
)
(define-layer! 12 (cons 'filename "thhor_csa.vss.gbr")
(cons 'visible #f)
(cons 'color #(65535 34990 63468))
(cons 'alpha #(15163))
)
(define-layer! 11 (cons 'filename "thhor_csa.vcc.gbr")
(cons 'visible #f)
(cons 'color #(0 24400 24400))
(cons 'alpha #(15163))
)
(define-layer! 10 (cons 'filename "thhor_csa.bottom.gbr")
(cons 'visible #f)
(cons 'color #(60294 24022 3320))
)
(define-layer! 9 (cons 'filename "thhor_csa.bottompaste.gbr")
(cons 'visible #f)
(cons 'color #(63479 30069 17733))
)
(define-layer! 8 (cons 'filename "thhor_csa.bottommask.gbr")
(cons 'visible #f)
(cons 'color #(29344 65535 28765))
)
(define-layer! 7 (cons 'filename "thhor_csa.top.gbr")
(cons 'visible #t)
(cons 'color #(63383 4945 17070))
(cons 'alpha #(27242))
)
(define-layer! 6 (cons 'filename "thhor_csa.toppaste.gbr")
(cons 'visible #t)
(cons 'color #(65535 2469 0))
(cons 'alpha #(23644))
)
(define-layer! 5 (cons 'filename "thhor_csa.topmask.gbr")
(cons 'inverted #t)
(cons 'visible #f)
(cons 'color #(25200 65535 30627))
)
(define-layer! 4 (cons 'filename "thhor_csa.plated-drill.cnc")
(cons 'visible #t)
(cons 'color #(61307 61307 61307))
(cons 'alpha #(65535))
(cons 'attribs (list
(list 'autodetect 'Boolean 1)
(list 'zero_suppression 'Enum 0)
(list 'units 'Enum 0)
(list 'digits 'Integer 4)
))
)
(define-layer! 3 (cons 'filename "thhor_csa.bottomsilk.gbr")
(cons 'visible #f)
(cons 'color #(0 0 0))
(cons 'alpha #(65535))
)
(define-layer! 2 (cons 'filename "thhor_csa.topsilk.gbr")
(cons 'visible #t)
(cons 'color #(0 0 0))
(cons 'alpha #(65535))
)
(define-layer! 1 (cons 'filename "thhor_csa.outline.gbr")
(cons 'visible #t)
(cons 'color #(65535 47429 0))
(cons 'alpha #(65535))
)
(define-layer! 0 (cons 'filename "thhor_csa.fab.gbr")
(cons 'visible #f)
(cons 'color #(0 0 0))
)
(define-layer! -1 (cons 'filename "/home/falbala/stephan/eda/thhor_crs/gerber/thhor_csa")
(cons 'color #(65535 65535 65535))
)
(set-render-type! 3)

View file

@ -1,82 +0,0 @@
(gerbv-file-version! "2.0A")
(define-layer! 14 (cons 'filename "thhor_csa.ground.gbr")
(cons 'visible #t)
(cons 'color #(27113 27113 27113))
(cons 'alpha #(12079))
)
(define-layer! 13 (cons 'filename "thhor_csa.vfet.gbr")
(cons 'visible #t)
(cons 'color #(65535 50491 34053))
(cons 'alpha #(12079))
)
(define-layer! 12 (cons 'filename "thhor_csa.vss.gbr")
(cons 'visible #t)
(cons 'color #(65535 34990 63468))
(cons 'alpha #(15163))
)
(define-layer! 11 (cons 'filename "thhor_csa.vcc.gbr")
(cons 'visible #t)
(cons 'color #(0 24400 24400))
(cons 'alpha #(15163))
)
(define-layer! 10 (cons 'filename "thhor_csa.bottom.gbr")
(cons 'visible #t)
(cons 'color #(60294 24022 3320))
)
(define-layer! 9 (cons 'filename "thhor_csa.bottompaste.gbr")
(cons 'visible #f)
(cons 'color #(63479 30069 17733))
)
(define-layer! 8 (cons 'filename "thhor_csa.bottommask.gbr")
(cons 'visible #f)
(cons 'color #(29344 65535 28765))
)
(define-layer! 7 (cons 'filename "thhor_csa.top.gbr")
(cons 'visible #t)
(cons 'color #(63383 4945 17070))
(cons 'alpha #(27242))
)
(define-layer! 6 (cons 'filename "thhor_csa.toppaste.gbr")
(cons 'visible #f)
(cons 'color #(65535 2469 0))
(cons 'alpha #(23644))
)
(define-layer! 5 (cons 'filename "thhor_csa.topmask.gbr")
(cons 'inverted #t)
(cons 'visible #f)
(cons 'color #(25200 65535 30627))
)
(define-layer! 4 (cons 'filename "thhor_csa.plated-drill.cnc")
(cons 'visible #t)
(cons 'color #(61307 61307 61307))
(cons 'alpha #(65535))
(cons 'attribs (list
(list 'autodetect 'Boolean 1)
(list 'zero_suppression 'Enum 0)
(list 'units 'Enum 0)
(list 'digits 'Integer 4)
))
)
(define-layer! 3 (cons 'filename "thhor_csa.bottomsilk.gbr")
(cons 'visible #f)
(cons 'color #(0 0 0))
(cons 'alpha #(65535))
)
(define-layer! 2 (cons 'filename "thhor_csa.topsilk.gbr")
(cons 'visible #f)
(cons 'color #(0 0 0))
(cons 'alpha #(65535))
)
(define-layer! 1 (cons 'filename "thhor_csa.outline.gbr")
(cons 'visible #t)
(cons 'color #(65535 47429 0))
(cons 'alpha #(65535))
)
(define-layer! 0 (cons 'filename "thhor_csa.fab.gbr")
(cons 'visible #f)
(cons 'color #(0 0 0))
)
(define-layer! -1 (cons 'filename "/home/falbala/stephan/eda/thhor_crs/gerber/thhor_csa")
(cons 'color #(65535 65535 65535))
)
(set-render-type! 3)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

View file

@ -21,17 +21,15 @@ const struct config config = {
[0] = 0xd1 | FM_READ, // Buffer 1 Read (Low-Frequency)
[1] = 0xd3 | FM_READ, // Buffer 2 Read (Low-Frequency)
},
.page_start = 0x0400,
.page_start = 0x0800,
.page_end = 0x1000,
#ifdef HAVE_nFETs
.pwm_min = 0x0000,
.pwm_max = 0xffff,
#endif
#ifdef HAVE_FPGA
.fpga_config_page = 0x100,
.fpga_config_count = 3955,
.dorn_config_page = 8,
.dorn_config_count = 1,
.fpga_config_page = 8,
.fpga_config_count = 504,
#endif
};

View file

@ -26,8 +26,6 @@ struct config {
#ifdef HAVE_FPGA
uint16_t fpga_config_page;
uint16_t fpga_config_count;
uint16_t dorn_config_page;
uint16_t dorn_config_count;
#endif
};

View file

@ -645,7 +645,7 @@ class dose_cmd(uart.uart):
status |= 0x10 # PS_528
dest &=~ self.PIPE["FLASH"]
if dest & self.PIPE["FPGA"] and not n:
n = 512//64 * npages
n = 512/64 * npages
if dest & self.PIPE["FLASH"]:
flash = flags2int(self.FSS, ["Write", "Ready", "P528"])
status |= 0x10 # PS_528
@ -661,8 +661,6 @@ class dose_cmd(uart.uart):
source, dest, status, valid, 0,
astatus, n, psize//2, 0, 0,
page, npages-1, flash)
if self._verbose >= 2:
print(f"PIPE {n=} {b2hex(d)}", file=sys.stderr)
return self.cmd(c, d)
def erase_flash(self, page, npages=1):
@ -744,7 +742,7 @@ class dose_cmd(uart.uart):
f.close()
return result
def write_pipe(self, data=[], timeout=2, n=None, parity=None, bfill=b'\0', pfill=b'\xff'):
def write_pipe(self, data=[], timeout=2, n=None, parity="pipe", bfill=b'\0', pfill=b'\xff'):
if isinstance(data, str):
f = open(data, "rb")
data = []
@ -806,7 +804,7 @@ class dose_cmd(uart.uart):
s = 1
if nn:
break
if parity and bb != b:
if bb != b:
raise ValueError(f"block number mismatch {b=} != {bb=}")
if b >= len(page):
break
@ -842,11 +840,6 @@ class dose_cmd(uart.uart):
self.pipe("CMD", "CONFIG", n=n*64)
self.write_pipe(filename, n=n)
def fpga_config_f(self, filename="../fpga/quartus/thhor_crs.rbf"):
self.fpga_reset()
n = os.stat(filename).st_size
self.pipe("FLASH", "CONFIG", page=0x100, n=n)
def fix_page(self, page):
if self.load_galois():
page = bch.fix_page(page)

View file

@ -168,7 +168,7 @@ uint8_t fpga_pipe_ready()
const struct pipe pipe_config_fpga_config = {
.source = pipe_flash,
.dest = pipe_fpga,
.status = PS_BCH | PS_528 | PS_OUT,
.status = PS_BCH | PS_528,
.fpga = {
.status = AS_CONFIG,
},
@ -179,5 +179,5 @@ void fpga_config(uint16_t page, uint16_t count)
fpga_reset();
pipe = pipe_config_fpga_config;
pipe.fpga.count = count;
flash_start_stream(page, count >> 3, FS_Read|FS_528|FS_Ready);
flash_start_stream(page, count >> 3, FS_Read|FS_528);
}

View file

@ -22,8 +22,6 @@ uint8_t pipe_busy()
return 0;
}
uint8_t pipe_sleep;
uint8_t pipe_poll()
{
/************************************************************
@ -49,7 +47,6 @@ uint8_t pipe_poll()
// the data goes nowhere.
uint8_t r = pipe.status;
uint8_t dest = pipe.dest;
pipe_sleep = 1;
if (pipe_busy() || !dest)
return r;
@ -68,11 +65,10 @@ uint8_t pipe_poll()
if (dest & pipe_cmd && valid & 0x1f)
// cmd did not drain the buffer, yet
goto done;
if (dest & pipe_flash && ~fs.status & FS_Ready) {
if (dest & pipe_flash && ~fs.status & FS_Ready)
// flash did not finish yet, successfully
pipe_sleep = ~fs.status & FS_Busy;
goto done;
}
// Return if next ADC reading is not yet due.
// Come back here, until is is.
@ -83,7 +79,6 @@ uint8_t pipe_poll()
// We are done with this buffer
r &=~ PS_OUT;
pipe_sleep = 0;
// Continue the flash stream.
@ -205,7 +200,6 @@ adc_done:
goto done;
// The buffer is full, send it.
pipe_sleep = 0;
r |= PS_OUT;
#ifdef HAVE_FPGA

View file

@ -35,8 +35,6 @@ struct pipe {
#endif
} pipe;
extern uint8_t pipe_sleep;
struct pipe_config {
struct pipe pipe;
uint16_t page;

View file

@ -48,7 +48,7 @@ int main()
// The sleep command will execute even when an irq becomes
// pending after cli(). It will wake us immediately.
cli();
if (!command_pending() && pipe_sleep) {
if (!command_pending() || adc_busy() || spi_busy_p()) {
sei();
sleep_cpu();
}
@ -56,7 +56,5 @@ int main()
command();
if (~magic.flags & hold_pipe)
pipe_poll();
else
pipe_sleep = 1;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

After

Width:  |  Height:  |  Size: 934 KiB

Before After
Before After

View file

@ -9,8 +9,8 @@ Grid[0.5000mm 0.0000 0.0000 1]
PolyArea[200000000.000000]
Thermal[0.500000]
DRC[0.1999mm 0.0100mm 0.1500mm 0.0025mm 0.3000mm 0.2000mm]
Flags("nameonpcb,alldirection,clearnew,thindrawpoly")
Groups("1,c:2:5:4:3:6,s:7:8")
Flags("nameonpcb,alldirection,clearnew,thindrawpoly,locknames")
Groups("1,c:2:3:4:5:6,s:7:8")
Styles["Signal,0.2000mm,0.7000mm,0.3000mm,0.2000mm,0.5000mm:Power,0.6000mm,1.0000mm,0.5000mm,0.2000mm,0.8000mm:Fat,1.0000mm,4.0000mm,2.2000mm,0.2000mm,4.1000mm:Skinny,0.1524mm,0.6101mm,0.3000mm,0.1524mm"]
Symbol[' ' 0.4572mm]
(
@ -7581,7 +7581,6 @@ Layer(1 "top" "copper")
Text[21.5000mm 43.0000mm 0 261 "THHOR CSA V01M" "clearline"]
Text[20.9000mm 39.1000mm 1 168 "2026-05-04 SiB" "clearline"]
Text[23.3000mm 39.1000mm 1 152 "FORGE.BEXUS.ORG" "clearline"]
Text[55.5000mm 27.5000mm 1 300 "1" "clearline"]
Polygon("via")
(
[22.2000mm 15.2000mm] [22.1933mm 15.2368mm] [22.1862mm 15.2714mm] [22.1246mm 15.6076mm] [22.1035mm 15.6311mm]
@ -7631,25 +7630,17 @@ Layer(1 "top" "copper")
)
Layer(2 "ground" "copper")
(
Text[55.5000mm 25.5000mm 1 300 "2" "clearline"]
Polygon("clearpoly")
(
[65.0000mm 83.5000mm] [63.5000mm 85.0000mm] [7.5000mm 85.0000mm] [6.0000mm 83.5000mm] [6.0000mm 7.5000mm]
[7.5000mm 6.0000mm] [63.5000mm 6.0000mm] [65.0000mm 7.5000mm]
Hole (
[55.5000mm 12.0000mm] [55.5000mm 28.5000mm] [60.0000mm 28.5000mm] [60.0000mm 12.0000mm]
)
[65.0000mm 83.5000mm] [65.0000mm 7.5000mm] [63.5000mm 6.0000mm] [7.5000mm 6.0000mm] [6.0000mm 7.5000mm]
[6.0000mm 83.5000mm] [7.5000mm 85.0000mm] [63.5000mm 85.0000mm]
)
)
Layer(3 "vfet" "copper")
(
Text[55.5000mm 17.0000mm 1 300 "5" "clearline"]
Polygon("clearpoly")
(
[6.0000mm 6.0000mm] [65.0000mm 6.0000mm] [65.0000mm 85.0000mm] [6.0000mm 85.0000mm]
Hole (
[55.5000mm 12.0000mm] [55.5000mm 28.5000mm] [60.0000mm 28.5000mm] [60.0000mm 12.0000mm]
)
)
)
Layer(4 "vss" "copper")
@ -7690,7 +7681,6 @@ Layer(4 "vss" "copper")
Line[58.3000mm 71.6000mm 58.8000mm 71.6000mm 0.2000mm 0.4000mm "clearline"]
Line[58.8000mm 71.6000mm 61.1000mm 69.3000mm 0.2000mm 0.4000mm "clearline"]
Line[61.1000mm 69.3000mm 61.1000mm 57.2000mm 0.2000mm 0.4000mm "clearline"]
Text[55.5000mm 20.0000mm 1 300 "4" "clearline"]
Polygon("clearpoly")
(
[65.0000mm 39.0000mm] [40.0000mm 39.0000mm] [34.5000mm 33.5000mm] [34.5000mm 6.0000mm] [6.0000mm 6.0000mm]
@ -7709,7 +7699,6 @@ Layer(5 "vcc" "copper")
Line[16.1000mm 66.3000mm 16.3000mm 70.4000mm 0.2000mm 0.4000mm "clearline"]
Line[10.2000mm 57.3000mm 10.2000mm 64.8000mm 0.2000mm 0.4000mm "clearline"]
Line[11.7000mm 66.3000mm 10.2000mm 64.8000mm 0.2000mm 0.4000mm "clearline"]
Text[55.5000mm 22.5000mm 1 300 "3" "clearline"]
Polygon("clearpoly")
(
[34.5000mm 6.0000mm] [6.0000mm 6.0000mm] [6.0000mm 56.5000mm] [65.0000mm 56.5000mm] [65.0000mm 39.0000mm]
@ -8351,7 +8340,6 @@ Layer(6 "bottom" "copper")
Line[54.8000mm 72.1000mm 55.6000mm 72.1000mm 0.2000mm 0.4000mm "clearline"]
Line[55.6000mm 70.4000mm 55.6000mm 72.1000mm 0.2000mm 0.4000mm "clearline"]
Line[54.1000mm 70.4000mm 53.1000mm 72.1000mm 0.2000mm 0.4000mm "clearline"]
Text[55.5000mm 13.0000mm 1 300 "6" "clearline,onsolder"]
)
Layer(7 "outline" "outline")
(