From 1172b444b83a32f19005a1f391e478990ff417bc Mon Sep 17 00:00:00 2001 From: Bdale Garbee Date: Sun, 16 Mar 2025 17:57:13 -0600 Subject: [PATCH] first try at switching to a devicetree overlay --- application/quantimotor.py | 11 +-- bcm2837-rpi-zero-2-w.dtb | Bin 14822 -> 0 bytes bcm2837-rpi-zero-2-w.dts | 152 ---------------------------------- debian/changelog | 6 ++ debian/control | 1 + debian/quantimotor.install | 3 +- devicetree/Makefile | 6 +- devicetree/append_cmdline.dts | 16 ---- devicetree/quantimotor.dtso | 21 +++++ raspi-firmware-custom | 1 + z99-quantimotor | 7 +- 11 files changed, 43 insertions(+), 181 deletions(-) delete mode 100644 bcm2837-rpi-zero-2-w.dtb delete mode 100644 bcm2837-rpi-zero-2-w.dts delete mode 100644 devicetree/append_cmdline.dts create mode 100644 devicetree/quantimotor.dtso create mode 100644 raspi-firmware-custom diff --git a/application/quantimotor.py b/application/quantimotor.py index 9947382..680af04 100755 --- a/application/quantimotor.py +++ b/application/quantimotor.py @@ -18,6 +18,7 @@ VOLTAGES = ['voltage0', 'voltage1'] from gpiod.line import Direction, Value def handler(signum, frame): + print() print('Ctrl+C pressed, shutting down cleanly.') set_line_values( "/dev/gpiochip0", @@ -53,19 +54,19 @@ if __name__ == "__main__": "/dev/gpiochip0", {25: Value.ACTIVE, # take ADS8688 out of reset 4: Value.ACTIVE, # indicate 'ready' to LPC - 16: Value.ACTIVE, # pyro on - 17: Value.ACTIVE, # alarm b on - 20: Value.ACTIVE, # turn continuity LED on + 16: Value.INACTIVE, # pyro off + 17: Value.INACTIVE, # alarm b off + 20: Value.INACTIVE, # turn continuity LED off 21: Value.INACTIVE, # turn armed LED off - 27: Value.ACTIVE # alarm a on + 27: Value.INACTIVE # alarm a off } ) # configure ADC channels for id in VOLTAGES: chan = ctrl.find_channel(id) - chan.attrs['offset'].value = OFFSET chan.attrs['scale'].value = SCALE + chan.attrs['offset'].value = OFFSET # Iterate until ctrl/c while True: diff --git a/bcm2837-rpi-zero-2-w.dtb b/bcm2837-rpi-zero-2-w.dtb deleted file mode 100644 index bb70310d1398908398360909b062707cafd09c0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14822 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 - */ - -/dts-v1/; -#include "bcm2837.dtsi" -#include "bcm2836-rpi.dtsi" -#include "bcm283x-rpi-usb-otg.dtsi" -#include "bcm283x-rpi-wifi-bt.dtsi" - -/ { - compatible = "raspberrypi,model-zero-2-w", "brcm,bcm2837"; - model = "Raspberry Pi Zero 2 W"; - - memory@0 { - device_type = "memory"; - reg = <0 0x20000000>; - }; - - chosen { - /* 8250 auxiliary UART instead of pl011 */ - stdout-path = "serial1:115200n8"; - }; - - leds { - led-act { - gpios = <&gpio 29 GPIO_ACTIVE_LOW>; - }; - }; -}; - -&bt { - shutdown-gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; -}; - -&gpio { - /* - * This is based on the official GPU firmware DT blob. - * - * Legend: - * "NC" = not connected (no rail from the SoC) - * "FOO" = GPIO line named "FOO" on the schematic - * "FOO_N" = GPIO line named "FOO" on schematic, active low - */ - gpio-line-names = "ID_SDA", - "ID_SCL", - "SDA1", - "SCL1", - "GPIO_GCLK", - "GPIO5", - "GPIO6", - "SPI_CE1_N", - "SPI_CE0_N", - "SPI_MISO", - "SPI_MOSI", - "SPI_SCLK", - "GPIO12", - "GPIO13", - /* Serial port */ - "TXD0", - "RXD0", - "GPIO16", - "GPIO17", - "GPIO18", - "GPIO19", - "GPIO20", - "GPIO21", - "GPIO22", - "GPIO23", - "GPIO24", - "GPIO25", - "GPIO26", - "GPIO27", - "HDMI_HPD_N", - "STATUS_LED_N", - "NC", /* GPIO30 */ - "NC", /* GPIO31 */ - "NC", /* GPIO32 */ - "NC", /* GPIO33 */ - "NC", /* GPIO34 */ - "NC", /* GPIO35 */ - "NC", /* GPIO36 */ - "NC", /* GPIO37 */ - "NC", /* GPIO38 */ - "NC", /* GPIO39 */ - "CAM_GPIO0", /* GPIO40 */ - "WL_ON", /* GPIO41 */ - "BT_ON", /* GPIO42 */ - "WIFI_CLK", /* GPIO43 */ - "SDA0", /* GPIO44 */ - "SCL0", /* GPIO45 */ - "SMPS_SCL", - "SMPS_SDA", - /* Used by SD Card */ - "SD_CLK_R", - "SD_CMD_R", - "SD_DATA0_R", - "SD_DATA1_R", - "SD_DATA2_R", - "SD_DATA3_R"; - - pinctrl-0 = <&gpioout &alt0>; -}; - -&hdmi { - hpd-gpios = <&gpio 28 GPIO_ACTIVE_LOW>; - power-domains = <&power RPI_POWER_DOMAIN_HDMI>; - status = "okay"; -}; - -&sdhci { - pinctrl-0 = <&emmc_gpio34 &gpclk2_gpio43>; -}; - -&sdhost { - pinctrl-names = "default"; - pinctrl-0 = <&sdhost_gpio48>; - bus-width = <4>; - status = "okay"; -}; - -&uart0 { - pinctrl-names = "default"; - pinctrl-0 = <&uart0_gpio32 &uart0_ctsrts_gpio30>; -}; - -&uart1 { - pinctrl-names = "default"; - pinctrl-0 = <&uart1_gpio14>; - status = "okay"; -}; - -&wifi_pwrseq { - reset-gpios = <&gpio 41 GPIO_ACTIVE_LOW>; -}; - -&spi { - status = "okay"; - - pinctrl-names = "default"; - cs-gpios = <&gpio 8 GPIO_ACTIVE_LOW>, <&gpio 7 GPIO_ACTIVE_LOW>; - - #address-cells = <1>; - #size-cells = <0>; - - ads8688: ads8688@0 { - compatible = "ti,ads8688"; - reg = <0>; - spi-max-frequency = <1000000>; - }; -}; diff --git a/debian/changelog b/debian/changelog index 464252f..5d2c10e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +quantimotor (2) UNRELEASED; urgency=medium + + * switch to devicetree overlay instead of complete replacement + + -- Bdale Garbee Sun, 16 Mar 2025 17:41:20 -0600 + quantimotor (1) UNRELEASED; urgency=medium * first version of package for QuantiMotor diff --git a/debian/control b/debian/control index 51ba1b9..08abd44 100644 --- a/debian/control +++ b/debian/control @@ -13,6 +13,7 @@ Vcs-Browser: https://git.gag.com/?p=fw/quantimotor Package: quantimotor Architecture: all +Pre-Depends: raspi-firmware Depends: ${shlibs:Depends}, ${misc:Depends}, diff --git a/debian/quantimotor.install b/debian/quantimotor.install index 91d935b..057b469 100644 --- a/debian/quantimotor.install +++ b/debian/quantimotor.install @@ -1,3 +1,4 @@ -bcm2837-rpi-zero-2-w.dtb usr/share/quantimotor +devicetree/*.dtbo boot/firmware/overlays raspi-extra-cmdline etc/default +raspi-firmware-custom etc/default z99-quantimotor etc/kernel/postinst.d diff --git a/devicetree/Makefile b/devicetree/Makefile index 4957e57..3f4fb4b 100644 --- a/devicetree/Makefile +++ b/devicetree/Makefile @@ -1,9 +1,9 @@ -all: append_cmdline.dtbo +all: quantimotor.dtbo -append_cmdline.dtbo: append_cmdline.dts +quantimotor.dtbo: quantimotor.dtso dtc -I dts -O dtb -o $@ $< clean: - rm -f append_cmdline.dtbo + rm -f quantimotor.dtbo .PHONY: clean diff --git a/devicetree/append_cmdline.dts b/devicetree/append_cmdline.dts deleted file mode 100644 index 3f9509f..0000000 --- a/devicetree/append_cmdline.dts +++ /dev/null @@ -1,16 +0,0 @@ -/dts-v1/; -/plugin/; - -/ { - compatible = "brcm,bcm2835"; - - fragment@0 { - target = <&chosen>; - frag0: __overlay__ { - }; - }; - - __overrides__ { - append = <&frag0>, "bootargs"; - }; -}; diff --git a/devicetree/quantimotor.dtso b/devicetree/quantimotor.dtso new file mode 100644 index 0000000..2a58749 --- /dev/null +++ b/devicetree/quantimotor.dtso @@ -0,0 +1,21 @@ +/dts-v1/; +/plugin/; + +/ { + compatible = "brcm,bcm2837"; + + fragment@0 { + target = <&spi0>; + __overlay__ { + /* needed to avoid dtc warning */ + #address-cells = <1>; + #size-cells = <0>; + + ads8688: ads8688@0 { + compatible = "ti,ads8688"; + reg = <0>; + spi-max-frequency = <1000000>; + }; + }; + }; +}; diff --git a/raspi-firmware-custom b/raspi-firmware-custom new file mode 100644 index 0000000..83554b6 --- /dev/null +++ b/raspi-firmware-custom @@ -0,0 +1 @@ +dtoverlay=quantimotor diff --git a/z99-quantimotor b/z99-quantimotor index 3fefa02..272fd02 100755 --- a/z99-quantimotor +++ b/z99-quantimotor @@ -1,7 +1,6 @@ #!/bin/sh -# force /boot/firmware/bcm2837-rpi-zero-2-w.dtb to be the QuantiMotor dtb - -cp /usr/share/quantimotor/bcm2837-rpi-zero-2-w.dtb \ - /boot/firmware/bcm2837-rpi-zero-2-w.dtb +# Manually trigger the kernel postinst hook to ensure our new content +# (overlayd and command line content) gets into the initrd +DEB_MAINT_PARAMS="configure" /etc/kernel/postinst.d/z50-raspi-firmware -- 2.47.2