diff --git a/GNUmakefile b/GNUmakefile index ef6af6f2d3..2ad4f323b4 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -215,58 +215,112 @@ fmt-check: ## Warn if any source needs reformatting gen-device: gen-device-avr gen-device-esp gen-device-nrf gen-device-sam gen-device-sifive gen-device-kendryte gen-device-nxp gen-device-rp ## Generate microcontroller-specific sources ifneq ($(RENESAS), 0) -gen-device: gen-device-renesas +# Renesas is currently unused +#gen-device: gen-device-renesas endif ifneq ($(STM32), 0) gen-device: gen-device-stm32 endif -gen-device-avr: - @if [ ! -e lib/avr/README.md ]; then echo "Submodules have not been downloaded. Please download them using:\n git submodule update --init"; exit 1; fi - $(GO) build -o ./build/gen-device-avr ./tools/gen-device-avr/ - ./build/gen-device-avr lib/avr/packs/atmega src/device/avr/ - ./build/gen-device-avr lib/avr/packs/tiny src/device/avr/ - @GO111MODULE=off $(GO) fmt ./src/device/avr +build/gen-device-%: ./tools/gen-device-%/*.go + $(GO) build -o $@ ./tools/gen-device-$*/ -build/gen-device-svd: ./tools/gen-device-svd/*.go - $(GO) build -o $@ ./tools/gen-device-svd/ +gen-device-avr: gen-device-atmega gen-device-attiny -gen-device-esp: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/posborne/cmsis-svd/tree/master/data/Espressif-Community -interrupts=software lib/cmsis-svd/data/Espressif-Community/ src/device/esp/ - ./build/gen-device-svd -source=https://github.com/posborne/cmsis-svd/tree/master/data/Espressif -interrupts=software lib/cmsis-svd/data/Espressif/ src/device/esp/ - GO111MODULE=off $(GO) fmt ./src/device/esp +# ATmega -gen-device-nrf: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/NordicSemiconductor/nrfx/tree/master/mdk lib/nrfx/mdk/ src/device/nrf/ - GO111MODULE=off $(GO) fmt ./src/device/nrf +DEVICES_AVR_MEGA = 1280 1284P 2560 328PB 328P 32U4 -gen-device-nxp: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/posborne/cmsis-svd/tree/master/data/NXP lib/cmsis-svd/data/NXP/ src/device/nxp/ - GO111MODULE=off $(GO) fmt ./src/device/nxp +gen-device-atmega: $(foreach m,$(DEVICES_AVR_MEGA),src/device/avr/ATmega$(m).go src/device/avr/ATmega$(m).s src/device/avr/ATmega$(m).ld) -gen-device-sam: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/posborne/cmsis-svd/tree/master/data/Atmel lib/cmsis-svd/data/Atmel/ src/device/sam/ - GO111MODULE=off $(GO) fmt ./src/device/sam +src/device/avr/ATmega%.go src/device/avr/ATmega%.s src/device/avr/ATmega%.ld: lib/avr/packs/atmega/ATmega%.atdf build/gen-device-avr + build/gen-device-avr $< src/device/avr/ATmega$*.go src/device/avr/ATmega$*.s src/device/avr/ATmega$*.ld -gen-device-sifive: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/posborne/cmsis-svd/tree/master/data/SiFive-Community -interrupts=software lib/cmsis-svd/data/SiFive-Community/ src/device/sifive/ - GO111MODULE=off $(GO) fmt ./src/device/sifive +# ATtiny -gen-device-kendryte: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/posborne/cmsis-svd/tree/master/data/Kendryte-Community -interrupts=software lib/cmsis-svd/data/Kendryte-Community/ src/device/kendryte/ - GO111MODULE=off $(GO) fmt ./src/device/kendryte +DEVICES_AVR_TINY = 1616 85 -gen-device-stm32: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/tinygo-org/stm32-svd lib/stm32-svd/svd src/device/stm32/ - GO111MODULE=off $(GO) fmt ./src/device/stm32 +gen-device-attiny: $(foreach m,$(DEVICES_AVR_TINY),src/device/avr/ATtiny$(m).go src/device/avr/ATtiny$(m).s src/device/avr/ATtiny$(m).ld) -gen-device-rp: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/posborne/cmsis-svd/tree/master/data/RaspberryPi lib/cmsis-svd/data/RaspberryPi/ src/device/rp/ - GO111MODULE=off $(GO) fmt ./src/device/rp +src/device/avr/ATtiny%.go src/device/avr/ATtiny%.s src/device/avr/ATtiny%.ld: lib/avr/packs/tiny/ATtiny%.atdf build/gen-device-avr + build/gen-device-avr $< src/device/avr/ATtiny$*.go src/device/avr/ATtiny$*.s src/device/avr/ATtiny$*.ld + +# Espressif + +# Both Espressif and Espressif-Community define esp32. +# The Espressif directory takes priority. + +gen-device-esp: src/device/esp/esp32c3.go src/device/esp/esp32s3.go src/device/esp/esp32.go src/device/esp/esp8266.go + +src/device/esp/%.go: lib/cmsis-svd/data/Espressif/%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/posborne/cmsis-svd/tree/master/data/Espressif -interrupts=software $< $@ + +src/device/esp/%.go: lib/cmsis-svd/data/Espressif-Community/%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/posborne/cmsis-svd/tree/master/data/Espressif-Community -interrupts=software $< $@ + +# NRF + +DEVICES_NRF = 51 52833 52840 52 + +gen-device-nrf: $(foreach m,$(DEVICES_NRF),src/device/nrf/nrf$(m).go src/device/nrf/nrf$(m).s) + +src/device/nrf/nrf%.go src/device/nrf/nrf%.s: lib/nrfx/mdk/nrf%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/NordicSemiconductor/nrfx/tree/master/mdk -asm=src/device/nrf/nrf$*.s $< src/device/nrf/nrf$*.go + +# NXP + +DEVICES_NXP = MIMXRT1062 MK66F18 + +gen-device-nxp: $(foreach m,$(DEVICES_NXP),src/device/nxp/$(m).go src/device/nxp/$(m).s) + +src/device/nxp/%.go src/device/nxp/%.s: lib/cmsis-svd/data/NXP/%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/posborne/cmsis-svd/tree/master/data/NXP -asm=src/device/nxp/$*.s $< src/device/nxp/$*.go + +# SAM + +DEVICES_SAM = D21E18A D21G18A D51G19A D51J19A D51J20A D51P19A D51P20A D51J19A E51J19A E54P20A + +gen-device-sam: $(foreach m,$(DEVICES_SAM),src/device/sam/ATSAM$(m).go src/device/sam/ATSAM$(m).s) + +src/device/sam/ATSAM%.go src/device/sam/ATSAM%.s: lib/cmsis-svd/data/Atmel/ATSAM%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/posborne/cmsis-svd/tree/master/data/Atmel -asm=src/device/sam/ATSAM$*.s $< src/device/sam/ATSAM$*.go + +# SiFive + +DEVICES_SIFIVE = e310x + +gen-device-sifive: $(foreach m,$(DEVICES_SIFIVE),src/device/sifive/$(m).go) + +src/device/sifive/%.go: lib/cmsis-svd/data/SiFive-Community/%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/posborne/cmsis-svd/tree/master/data/SiFive-Community -interrupts=software $< $@ + +# Kendryte + +DEVICES_KENDRYTE = 210 + +gen-device-kendryte: $(foreach m,$(DEVICES_KENDRYTE),src/device/kendryte/k$(m).go) + +src/device/kendryte/k%.go: lib/cmsis-svd/data/Kendryte-Community/k%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/posborne/cmsis-svd/tree/master/data/Kendryte-Community -interrupts=software $< $@ + +# STM32 + +DEVICES_STM32 = f103 f405 f407 f469 f722 g0b1 l4r5 l0x1 l0x2 l4x2 l4x5 l4x6 l552 u585 wl5x_cm4 wle5 + +gen-device-stm32: $(foreach m,$(DEVICES_STM32),src/device/stm32/stm32$(m).go src/device/stm32/stm32$(m).s) + +src/device/stm32/stm32%.go src/device/stm32/stm32%.s: lib/stm32-svd/svd/stm32%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/tinygo-org/stm32-svd -asm=src/device/stm32/stm32$*.s $< src/device/stm32/stm32$*.go + +# Raspberry Pi + +DEVICES_RP = 2040 2350 + +gen-device-rp: $(foreach m,$(DEVICES_RP),src/device/rp/rp$(m).go src/device/rp/rp$(m).s) + +src/device/rp/rp%.go src/device/rp/rp%.s: lib/cmsis-svd/data/RaspberryPi/rp%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/posborne/cmsis-svd/tree/master/data/RaspberryPi -asm=src/device/rp/rp$*.s $< src/device/rp/rp$*.go -gen-device-renesas: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/cmsis-svd/cmsis-svd-data/tree/master/data/Renesas lib/cmsis-svd/data/Renesas/ src/device/renesas/ - GO111MODULE=off $(GO) fmt ./src/device/renesas $(LLVM_PROJECTDIR)/llvm: git clone -b tinygo_20.x --depth=1 https://github.com/tinygo-org/llvm-project $(LLVM_PROJECTDIR) diff --git a/src/device/kendryte/.gitignore b/src/device/kendryte/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/device/sifive/.gitignore b/src/device/sifive/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/device/stm32/.gitignore b/src/device/stm32/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/targets/atmega1280.json b/targets/atmega1280.json index 34e78f41df..6eb102f007 100644 --- a/targets/atmega1280.json +++ b/targets/atmega1280.json @@ -6,9 +6,9 @@ "ldflags": [ "--defsym=_stack_size=512" ], - "linkerscript": "src/device/avr/atmega1280.ld", + "linkerscript": "src/device/avr/ATmega1280.ld", "extra-files": [ "targets/avr.S", - "src/device/avr/atmega1280.s" + "src/device/avr/ATmega1280.s" ] } diff --git a/targets/atmega1284p.json b/targets/atmega1284p.json index 501fb58d17..9256513f04 100644 --- a/targets/atmega1284p.json +++ b/targets/atmega1284p.json @@ -7,10 +7,10 @@ "--defsym=_bootloader_size=0", "--defsym=_stack_size=512" ], - "linkerscript": "src/device/avr/atmega1284p.ld", + "linkerscript": "src/device/avr/ATmega1284P.ld", "extra-files": [ "targets/avr.S", - "src/device/avr/atmega1284p.s" + "src/device/avr/ATmega1284P.s" ], "emulator": "simavr -m atmega1284p -f 20000000 {}" } diff --git a/targets/atmega2560.json b/targets/atmega2560.json index a00179ef98..eb454e8caf 100644 --- a/targets/atmega2560.json +++ b/targets/atmega2560.json @@ -6,9 +6,9 @@ "ldflags": [ "--defsym=_stack_size=512" ], - "linkerscript": "src/device/avr/atmega2560.ld", + "linkerscript": "src/device/avr/ATmega2560.ld", "extra-files": [ "targets/avr.S", - "src/device/avr/atmega2560.s" + "src/device/avr/ATmega2560.s" ] } diff --git a/targets/atmega328p.json b/targets/atmega328p.json index d4098d4b86..c281dcec29 100644 --- a/targets/atmega328p.json +++ b/targets/atmega328p.json @@ -3,9 +3,9 @@ "cpu": "atmega328p", "build-tags": ["atmega328p", "atmega", "avr5"], "serial": "uart", - "linkerscript": "src/device/avr/atmega328p.ld", + "linkerscript": "src/device/avr/ATmega328P.ld", "extra-files": [ "targets/avr.S", - "src/device/avr/atmega328p.s" + "src/device/avr/ATmega328P.s" ] } diff --git a/targets/atmega328pb.json b/targets/atmega328pb.json index c4e1b447f4..1789f9f45f 100644 --- a/targets/atmega328pb.json +++ b/targets/atmega328pb.json @@ -7,9 +7,9 @@ "--defsym=_stack_size=512" ], "serial": "uart", - "linkerscript": "src/device/avr/atmega328pb.ld", + "linkerscript": "src/device/avr/ATmega328PB.ld", "extra-files": [ "targets/avr.S", - "src/device/avr/atmega328pb.s" + "src/device/avr/ATmega328PB.s" ] } diff --git a/targets/atmega32u4.json b/targets/atmega32u4.json index 7aa2c08bd2..75c7efb542 100644 --- a/targets/atmega32u4.json +++ b/targets/atmega32u4.json @@ -3,9 +3,9 @@ "cpu": "atmega32u4", "build-tags": ["atmega32u4", "avr5"], "serial": "none", - "linkerscript": "src/device/avr/atmega32u4.ld", + "linkerscript": "src/device/avr/ATmega32U4.ld", "extra-files": [ "targets/avr.S", - "src/device/avr/atmega32u4.s" + "src/device/avr/ATmega32U4.s" ] } diff --git a/targets/atsamd21e18a.json b/targets/atsamd21e18a.json index 92b671c9f6..fb42e1e0b2 100644 --- a/targets/atsamd21e18a.json +++ b/targets/atsamd21e18a.json @@ -4,7 +4,7 @@ "serial": "usb", "linkerscript": "targets/atsamd21.ld", "extra-files": [ - "src/device/sam/atsamd21e18a.s" + "src/device/sam/ATSAMD21E18A.s" ], "openocd-transport": "swd", "openocd-target": "at91samdXX" diff --git a/targets/atsamd21g18a.json b/targets/atsamd21g18a.json index db46c96288..e6bb4231d1 100644 --- a/targets/atsamd21g18a.json +++ b/targets/atsamd21g18a.json @@ -4,7 +4,7 @@ "serial": "usb", "linkerscript": "targets/atsamd21.ld", "extra-files": [ - "src/device/sam/atsamd21g18a.s" + "src/device/sam/ATSAMD21G18A.s" ], "openocd-transport": "swd", "openocd-target": "at91samdXX" diff --git a/targets/atsamd51g19a.json b/targets/atsamd51g19a.json index 4534d1c1a8..5708bbec06 100644 --- a/targets/atsamd51g19a.json +++ b/targets/atsamd51g19a.json @@ -3,7 +3,7 @@ "build-tags": ["atsamd51g19a", "atsamd51g19", "atsamd51", "sam"], "linkerscript": "targets/atsamd51.ld", "extra-files": [ - "src/device/sam/atsamd51g19a.s" + "src/device/sam/ATSAMD51G19A.s" ], "openocd-transport": "swd", "openocd-target": "atsame5x" diff --git a/targets/atsamd51j19a.json b/targets/atsamd51j19a.json index 2493ca4ddc..18c5011e53 100644 --- a/targets/atsamd51j19a.json +++ b/targets/atsamd51j19a.json @@ -3,7 +3,7 @@ "build-tags": ["atsamd51j19a", "atsamd51j19", "atsamd51", "sam"], "linkerscript": "targets/atsamd51.ld", "extra-files": [ - "src/device/sam/atsamd51j19a.s" + "src/device/sam/ATSAMD51J19A.s" ], "openocd-transport": "swd", "openocd-target": "atsame5x" diff --git a/targets/atsamd51j20a.json b/targets/atsamd51j20a.json index 9f59e32d46..d5493a32eb 100644 --- a/targets/atsamd51j20a.json +++ b/targets/atsamd51j20a.json @@ -3,7 +3,7 @@ "build-tags": ["sam", "atsamd51", "atsamd51j20", "atsamd51j20a"], "linkerscript": "targets/atsamd51j20a.ld", "extra-files": [ - "src/device/sam/atsamd51j20a.s" + "src/device/sam/ATSAMD51J20A.s" ], "openocd-transport": "swd", "openocd-target": "atsame5x" diff --git a/targets/atsamd51p19a.json b/targets/atsamd51p19a.json index 6b2f6b5b39..c51adb00df 100644 --- a/targets/atsamd51p19a.json +++ b/targets/atsamd51p19a.json @@ -3,7 +3,7 @@ "build-tags": ["atsamd51p19a", "atsamd51p19", "atsamd51", "sam"], "linkerscript": "targets/atsamd51.ld", "extra-files": [ - "src/device/sam/atsamd51p19a.s" + "src/device/sam/ATSAMD51P19A.s" ], "openocd-transport": "swd", "openocd-target": "atsame5x" diff --git a/targets/atsamd51p20a.json b/targets/atsamd51p20a.json index bc66ca0321..d18161b91e 100644 --- a/targets/atsamd51p20a.json +++ b/targets/atsamd51p20a.json @@ -3,7 +3,7 @@ "build-tags": ["sam", "atsamd51", "atsamd51p20", "atsamd51p20a"], "linkerscript": "targets/atsamd51p20a.ld", "extra-files": [ - "src/device/sam/atsamd51p20a.s" + "src/device/sam/ATSAMD51P20A.s" ], "openocd-transport": "swd", "openocd-target": "atsame5x" diff --git a/targets/atsame51j19a.json b/targets/atsame51j19a.json index 98136769dd..93ef8599d4 100644 --- a/targets/atsame51j19a.json +++ b/targets/atsame51j19a.json @@ -3,7 +3,7 @@ "build-tags": ["atsame51j19a", "atsame51j19", "atsame51", "atsame5x", "sam"], "linkerscript": "targets/atsame5xx19.ld", "extra-files": [ - "src/device/sam/atsame51j19a.s" + "src/device/sam/ATSAME51J19A.s" ], "openocd-transport": "swd", "openocd-target": "atsame5x" diff --git a/targets/atsame54p20a.json b/targets/atsame54p20a.json index f2450fb421..04192be37f 100644 --- a/targets/atsame54p20a.json +++ b/targets/atsame54p20a.json @@ -3,7 +3,7 @@ "build-tags": ["sam", "atsame5x", "atsame54", "atsame54p20", "atsame54p20a"], "linkerscript": "targets/atsame5xx20-no-bootloader.ld", "extra-files": [ - "src/device/sam/atsame54p20a.s" + "src/device/sam/ATSAME54P20A.s" ], "openocd-transport": "swd", "openocd-target": "atsame5x" diff --git a/targets/attiny1616.json b/targets/attiny1616.json index 38e645ae1b..8c5c50c79d 100644 --- a/targets/attiny1616.json +++ b/targets/attiny1616.json @@ -6,9 +6,9 @@ "cflags": [ "-D__AVR_ARCH__=103" ], - "linkerscript": "src/device/avr/attiny1616.ld", + "linkerscript": "src/device/avr/ATtiny1616.ld", "extra-files": [ - "src/device/avr/attiny1616.s" + "src/device/avr/ATtiny1616.s" ], "flash-command": "pymcuprog write -f {hex} --erase --verify -d attiny1616 -t uart -u {port}" } diff --git a/targets/attiny85.json b/targets/attiny85.json index 3fb1111479..a3f24b6718 100644 --- a/targets/attiny85.json +++ b/targets/attiny85.json @@ -5,9 +5,9 @@ "cflags": [ "-D__AVR_ARCH__=25" ], - "linkerscript": "src/device/avr/attiny85.ld", + "linkerscript": "src/device/avr/ATtiny85.ld", "extra-files": [ "targets/avr.S", - "src/device/avr/attiny85.s" + "src/device/avr/ATtiny85.s" ] } diff --git a/targets/teensy36.json b/targets/teensy36.json index 253e397043..78503c74f6 100644 --- a/targets/teensy36.json +++ b/targets/teensy36.json @@ -4,9 +4,8 @@ "serial": "uart", "linkerscript": "targets/nxpmk66f18.ld", "extra-files": [ - "src/device/nxp/mk66f18.s", + "src/device/nxp/MK66F18.s", "targets/teensy36.s" ], "flash-command": "teensy_loader_cli -mmcu=mk66fx1m0 -v -w {hex}" } - diff --git a/targets/teensy40.json b/targets/teensy40.json index 223db6f6f1..3595a059e8 100644 --- a/targets/teensy40.json +++ b/targets/teensy40.json @@ -5,7 +5,7 @@ "automatic-stack-size": false, "linkerscript": "targets/mimxrt1062-teensy40.ld", "extra-files": [ - "src/device/nxp/mimxrt1062.s", + "src/device/nxp/MIMXRT1062.s", "targets/teensy40.s" ], "flash-command": "teensy_loader_cli -mmcu=imxrt1062 -v -w {hex}" diff --git a/targets/teensy41.json b/targets/teensy41.json index 8866bc48e3..28b2ea42ec 100644 --- a/targets/teensy41.json +++ b/targets/teensy41.json @@ -5,7 +5,7 @@ "automatic-stack-size": false, "linkerscript": "targets/mimxrt1062-teensy40.ld", "extra-files": [ - "src/device/nxp/mimxrt1062.s", + "src/device/nxp/MIMXRT1062.s", "targets/teensy40.s" ], "flash-command": "teensy_loader_cli -mmcu=imxrt1062 -v -w {hex}" diff --git a/tools/gen-device-avr/gen-device-avr.go b/tools/gen-device-avr/gen-device-avr.go index de32e3ed95..0fc01d04a4 100755 --- a/tools/gen-device-avr/gen-device-avr.go +++ b/tools/gen-device-avr/gen-device-avr.go @@ -1,18 +1,17 @@ package main import ( - "bufio" + "bytes" "encoding/xml" "fmt" + "go/format" "html/template" "math/bits" "os" "path/filepath" - "runtime" "sort" "strconv" "strings" - "sync" ) type AVRToolsDeviceFile struct { @@ -398,14 +397,8 @@ func readATDF(path string) (*Device, error) { }, nil } -func writeGo(outdir string, device *Device) error { +func writeGo(dst string, device *Device) error { // The Go module for this device. - outf, err := os.Create(outdir + "/" + device.metadata["nameLower"].(string) + ".go") - if err != nil { - return err - } - defer outf.Close() - w := bufio.NewWriter(outf) maxInterruptNum := 0 for _, intr := range device.interrupts { @@ -484,9 +477,11 @@ type {{.Name}}_Type struct { {{end}} {{end}} `)) - err = t.Execute(w, map[string]interface{}{ + var buf bytes.Buffer + w := &buf + err := t.Execute(w, map[string]interface{}{ "metadata": device.metadata, - "pkgName": filepath.Base(strings.TrimRight(outdir, "/")), + "pkgName": filepath.Base(filepath.Dir(dst)), "interrupts": device.interrupts, "interruptMax": maxInterruptNum, "instances": device.instances, @@ -559,12 +554,20 @@ type {{.Name}}_Type struct { } fmt.Fprintf(w, ")\n") } - return w.Flush() + + // Format the source. + formatted, err := format.Source(buf.Bytes()) + if err != nil { + return err + } + + // Save the file. + return os.WriteFile(dst, formatted, 0666) } -func writeAsm(outdir string, device *Device) error { +func writeAsm(dst string, device *Device) error { // The interrupt vector, which is hard to write directly in Go. - out, err := os.Create(outdir + "/" + device.metadata["nameLower"].(string) + ".s") + out, err := os.Create(dst) if err != nil { return err } @@ -628,9 +631,9 @@ __vector_default: return nil } -func writeLD(outdir string, device *Device) error { +func writeLD(dst string, device *Device) error { // Variables for the linker script. - out, err := os.Create(outdir + "/" + device.metadata["nameLower"].(string) + ".ld") + out, err := os.Create(dst) if err != nil { return err } @@ -649,73 +652,28 @@ __num_isrs = {{.numInterrupts}}; return t.Execute(out, device.metadata) } -func processFile(filepath, outdir string) error { - device, err := readATDF(filepath) +func main() { + src := os.Args[1] + dstGo := os.Args[2] + dstASM := os.Args[3] + dstLD := os.Args[4] + + device, err := readATDF(src) if err != nil { - return err + fmt.Fprintln(os.Stderr, err) + os.Exit(1) } - err = writeGo(outdir, device) + err = writeGo(dstGo, device) if err != nil { - return err + fmt.Fprintln(os.Stderr, err) + os.Exit(1) } - err = writeAsm(outdir, device) + err = writeAsm(dstASM, device) if err != nil { - return err - } - return writeLD(outdir, device) -} - -func generate(indir, outdir string) error { - // Read list of ATDF files to process. - matches, err := filepath.Glob(indir + "/*.atdf") - if err != nil { - return err - } - - // Start worker goroutines. - var wg sync.WaitGroup - workChan := make(chan string) - errChan := make(chan error, 1) - for i := 0; i < runtime.NumCPU(); i++ { - go func() { - for filepath := range workChan { - err := processFile(filepath, outdir) - wg.Done() - if err != nil { - // Store error to errChan if no error was stored before. - select { - case errChan <- err: - default: - } - } - } - }() - } - - // Submit all jobs to the goroutines. - wg.Add(len(matches)) - for _, filepath := range matches { - fmt.Println(filepath) - workChan <- filepath - } - close(workChan) - - // Wait until all workers have finished. - wg.Wait() - - // Check for an error. - select { - case err := <-errChan: - return err - default: - return nil + fmt.Fprintln(os.Stderr, err) + os.Exit(1) } -} - -func main() { - indir := os.Args[1] // directory with register descriptor files (*.atdf) - outdir := os.Args[2] // output directory - err := generate(indir, outdir) + err = writeLD(dstLD, device) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) diff --git a/tools/gen-device-svd/gen-device-svd.go b/tools/gen-device-svd/gen-device-svd.go index ef9dedff97..5b5d73e211 100755 --- a/tools/gen-device-svd/gen-device-svd.go +++ b/tools/gen-device-svd/gen-device-svd.go @@ -2,11 +2,11 @@ package main import ( "bufio" + "bytes" "encoding/xml" - "errors" "flag" "fmt" - "io/fs" + "go/format" "os" "path/filepath" "regexp" @@ -1215,14 +1215,7 @@ func parseRegister(groupName string, regEl *SVDRegister, baseAddress uint64, bit } // The Go module for this device. -func writeGo(outdir string, device *Device, interruptSystem string) error { - outf, err := os.Create(filepath.Join(outdir, device.Metadata.NameLower+".go")) - if err != nil { - return err - } - defer outf.Close() - w := bufio.NewWriter(outf) - +func writeGo(dst string, device *Device, interruptSystem string) error { maxInterruptValue := 0 for _, intr := range device.Interrupts { if intr.Value > maxInterruptValue { @@ -1326,10 +1319,12 @@ var ( ) `)) - pkgName := filepath.Base(strings.TrimRight(outdir, "/")) + pkgName := filepath.Base(filepath.Dir(dst)) tweakDevice(device, pkgName) - err = t.Execute(w, map[string]interface{}{ + var buf bytes.Buffer + w := &buf + err := t.Execute(w, map[string]interface{}{ "device": device, "pkgName": pkgName, "interruptMax": maxInterruptValue, @@ -1594,10 +1589,17 @@ var ( w.WriteString(")\n") } - return w.Flush() + // Format the source. + formatted, err := format.Source(buf.Bytes()) + if err != nil { + return err + } + + // Save the file. + return os.WriteFile(dst, formatted, 0666) } -func writeGoRegisterConstants(w *bufio.Writer, register *PeripheralField, name string) { +func writeGoRegisterConstants(w *bytes.Buffer, register *PeripheralField, name string) { w.WriteString("\n\t// " + name) if register.Description != "" { if isMultiline(register.Description) { @@ -1619,7 +1621,7 @@ func writeGoRegisterConstants(w *bufio.Writer, register *PeripheralField, name s } } -func writeGoRegisterBitfieldType(w *bufio.Writer, register *PeripheralField, peripheralName, registerName string) { +func writeGoRegisterBitfieldType(w *bytes.Buffer, register *PeripheralField, peripheralName, registerName string) { if len(register.Bitfields) == 0 { return } @@ -1692,8 +1694,8 @@ func writeGoRegisterBitfieldType(w *bufio.Writer, register *PeripheralField, per } // The interrupt vector, which is hard to write directly in Go. -func writeAsm(outdir string, device *Device) error { - outf, err := os.Create(filepath.Join(outdir, device.Metadata.NameLower+".s")) +func writeAsm(dst string, device *Device) error { + outf, err := os.Create(dst) if err != nil { return err } @@ -1796,58 +1798,33 @@ __isr_vector: return w.Flush() } -func generate(indir, outdir, sourceURL, interruptSystem string) error { - if _, err := os.Stat(indir); errors.Is(err, fs.ErrNotExist) { - fmt.Fprintln(os.Stderr, "cannot find input directory:", indir) - os.Exit(1) - } - os.MkdirAll(outdir, 0777) - - infiles, err := filepath.Glob(filepath.Join(indir, "*.svd")) - if err != nil { - fmt.Fprintln(os.Stderr, "could not read .svd files:", err) - os.Exit(1) - } - sort.Strings(infiles) - for _, infile := range infiles { - fmt.Println(infile) - device, err := readSVD(infile, sourceURL) - if err != nil { - return fmt.Errorf("failed to read: %w", err) - } - err = writeGo(outdir, device, interruptSystem) - if err != nil { - return fmt.Errorf("failed to write Go file: %w", err) - } - switch interruptSystem { - case "software": - // Nothing to do. - case "hardware": - err = writeAsm(outdir, device) - if err != nil { - return fmt.Errorf("failed to write assembly file: %w", err) - } - default: - return fmt.Errorf("unknown interrupt system: %s", interruptSystem) - } - } - return nil -} - func main() { - sourceURL := flag.String("source", "", "source SVD file") + sourceURL := flag.String("url", "", "URL of source SVD repository") interruptSystem := flag.String("interrupts", "hardware", "interrupt system in use (software, hardware)") + asmDst := flag.String("asm", "", "destination path for assembly") flag.Parse() if flag.NArg() != 2 { - fmt.Fprintln(os.Stderr, "provide exactly two arguments: input directory (with .svd files) and output directory for generated files") + fmt.Fprintln(os.Stderr, "provide exactly two arguments: input path (.svd) and output path (.go)") flag.PrintDefaults() return } - indir := flag.Arg(0) - outdir := flag.Arg(1) - err := generate(indir, outdir, *sourceURL, *interruptSystem) + src := flag.Arg(0) + dst := flag.Arg(1) + device, err := readSVD(src, *sourceURL) + if err != nil { + fmt.Fprintf(os.Stderr, "failed to read: %s\n", err) + os.Exit(1) + } + err = writeGo(dst, device, *interruptSystem) if err != nil { - fmt.Fprintln(os.Stderr, err) + fmt.Fprintf(os.Stderr, "failed to write Go file: %s\n", err) os.Exit(1) } + if asm := *asmDst; asm != "" { + err = writeAsm(asm, device) + if err != nil { + fmt.Fprintf(os.Stderr, "failed to write assembly file: %s\n", err) + os.Exit(1) + } + } }