diff --git a/software/apps/can_node/CMakeLists.txt b/software/apps/can_node/CMakeLists.txt new file mode 100644 index 0000000..b9ea776 --- /dev/null +++ b/software/apps/can_node/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.20) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) + +project(can_node LANGUAGES C) + +zephyr_include_directories(../../include) +add_subdirectory(../../lib lib) + +target_sources(app PRIVATE src/main.c) diff --git a/software/apps/can_node/Kconfig b/software/apps/can_node/Kconfig new file mode 100644 index 0000000..8a35138 --- /dev/null +++ b/software/apps/can_node/Kconfig @@ -0,0 +1,2 @@ +rsource "../../lib/Kconfig" +source "Kconfig.zephyr" \ No newline at end of file diff --git a/software/apps/can_node/VERSION b/software/apps/can_node/VERSION new file mode 100644 index 0000000..2bdb1ca --- /dev/null +++ b/software/apps/can_node/VERSION @@ -0,0 +1,5 @@ +VERSION_MAJOR = 0 +VERSION_MINOR = 0 +PATCHLEVEL = 1 +VERSION_TWEAK = 1 +EXTRAVERSION = devel \ No newline at end of file diff --git a/software/apps/can_node/boards/bluepill_f103rb.conf b/software/apps/can_node/boards/bluepill_f103rb.conf new file mode 100644 index 0000000..17e55de --- /dev/null +++ b/software/apps/can_node/boards/bluepill_f103rb.conf @@ -0,0 +1,7 @@ +# Disable UART console +CONFIG_UART_CONSOLE=n + +# Enable RTT console +CONFIG_RTT_CONSOLE=y +CONFIG_USE_SEGGER_RTT=y +CONFIG_SHELL_BACKEND_RTT=y \ No newline at end of file diff --git a/software/apps/can_node/boards/bluepill_f103rb.overlay b/software/apps/can_node/boards/bluepill_f103rb.overlay new file mode 100644 index 0000000..614e991 --- /dev/null +++ b/software/apps/can_node/boards/bluepill_f103rb.overlay @@ -0,0 +1,43 @@ +/ { + chosen { + zephyr,console = &rtt; + zephyr,shell = &rtt; + zephyr,settings-partition = &storage_partition; + }; + + rtt: rtt { + compatible = "segger,rtt-uart"; + #address-cells = <1>; + #size-cells = <0>; + label = "RTT"; + status = "okay"; + }; +}; + +&flash0 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Application partition starts at the beginning of flash */ + slot0_partition: partition@0 { + label = "image-0"; + reg = <0x00000000 DT_SIZE_K(120)>; + }; + + /* Use the last 8K for settings */ + storage_partition: partition@1E000 { + label = "storage"; + reg = <0x0001E000 DT_SIZE_K(8)>; + }; + }; +}; + +&usart1 { + modbus0 { + compatible = "zephyr,modbus-serial"; + status = "okay"; + }; + status = "okay"; +}; diff --git a/software/apps/can_node/boards/native_sim.overlay b/software/apps/can_node/boards/native_sim.overlay new file mode 100644 index 0000000..6e3de37 --- /dev/null +++ b/software/apps/can_node/boards/native_sim.overlay @@ -0,0 +1,47 @@ +/ { + aliases { + vnd7050aj = &vnd7050aj; + }; + + vnd7050aj: vnd7050aj { + compatible = "st,vnd7050aj"; + status = "okay"; + + input0-gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; + input1-gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>; + select0-gpios = <&gpio0 3 GPIO_ACTIVE_HIGH>; + select1-gpios = <&gpio0 4 GPIO_ACTIVE_HIGH>; + sense-enable-gpios = <&gpio0 5 GPIO_ACTIVE_HIGH>; + fault-reset-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>; + io-channels = <&adc0 0>; + r-sense-ohms = <1500>; + k-vcc = <4000>; + }; + + modbus_uart: uart_2 { + compatible = "zephyr,native-pty-uart"; + status = "okay"; + current-speed = <19200>; + + modbus0: modbus0 { + compatible = "zephyr,modbus-serial"; + status = "okay"; + }; + }; + +}; + +&adc0 { + #address-cells = <1>; + #size-cells = <0>; + ref-internal-mv = <3300>; + ref-external1-mv = <5000>; + + channel@0 { + reg = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; +}; diff --git a/software/apps/can_node/boards/weact_stm32g431_core.overlay b/software/apps/can_node/boards/weact_stm32g431_core.overlay new file mode 100644 index 0000000..97cdf12 --- /dev/null +++ b/software/apps/can_node/boards/weact_stm32g431_core.overlay @@ -0,0 +1,48 @@ +/ { + aliases { + vnd7050aj = &vnd7050aj; + }; + + vnd7050aj: vnd7050aj { + compatible = "st,vnd7050aj"; + status = "okay"; + + input0-gpios = <&gpiob 3 GPIO_ACTIVE_HIGH>; + input1-gpios = <&gpiob 4 GPIO_ACTIVE_HIGH>; + select0-gpios = <&gpiob 0 GPIO_ACTIVE_HIGH>; + select1-gpios = <&gpiob 1 GPIO_ACTIVE_HIGH>; + sense-enable-gpios = <&gpiob 6 GPIO_ACTIVE_HIGH>; + fault-reset-gpios = <&gpiob 5 GPIO_ACTIVE_LOW>; + io-channels = <&adc1 1>; + r-sense-ohms = <1500>; + k-vcc = <4000>; + }; +}; + +&adc1 { + status = "okay"; + pinctrl-0 = <&adc1_in1_pa0>; + pinctrl-names = "default"; + st,adc-clock-source = "SYNC"; + st,adc-prescaler = <4>; + #address-cells = <1>; + #size-cells = <0>; + + channel@1 { + reg = <1>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; +}; + +&usart1 { + modbus0 { + compatible = "zephyr,modbus-serial"; + status = "okay"; + }; + status = "okay"; + pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>; // PA9=TX, PA10=RX for Modbus communication + pinctrl-names = "default"; +}; diff --git a/software/apps/can_node/cdc-acm.overlay b/software/apps/can_node/cdc-acm.overlay new file mode 100644 index 0000000..32f5b3e --- /dev/null +++ b/software/apps/can_node/cdc-acm.overlay @@ -0,0 +1,16 @@ +#include + +&zephyr_udc0 { + cdc_acm_uart0: cdc_acm_uart0 { + compatible = "zephyr,cdc-acm-uart"; + + modbus0 { + compatible = "zephyr,modbus-serial"; + status = "okay"; + }; + }; +}; + +&usart1 { + /delete-node/ modbus0; +}; \ No newline at end of file diff --git a/software/apps/can_node/dts/bindings/st,vnd7050aj.yaml b/software/apps/can_node/dts/bindings/st,vnd7050aj.yaml new file mode 100644 index 0000000..a356d9f --- /dev/null +++ b/software/apps/can_node/dts/bindings/st,vnd7050aj.yaml @@ -0,0 +1,88 @@ +# Copyright (c) 2024, Eduard Iten +# SPDX-License-Identifier: Apache-2.0 + +description: | + STMicroelectronics VND7050AJ dual-channel high-side driver. + This is a GPIO and ADC controlled device. + +compatible: "st,vnd7050aj" + +include: base.yaml + +properties: + input0-gpios: + type: phandle-array + required: true + description: GPIO to control output channel 0. + + input1-gpios: + type: phandle-array + required: true + description: GPIO to control output channel 1. + + select0-gpios: + type: phandle-array + required: true + description: GPIO for MultiSense selection bit 0. + + select1-gpios: + type: phandle-array + required: true + description: GPIO for MultiSense selection bit 1. + + sense-enable-gpios: + type: phandle-array + required: true + description: GPIO to enable the MultiSense output. + + fault-reset-gpios: + type: phandle-array + required: true + description: GPIO to reset a latched fault (active-low). + + io-channels: + type: phandle-array + required: true + description: | + ADC channel connected to the MultiSense pin. This should be an + io-channels property pointing to the ADC controller and channel number. + + r-sense-ohms: + type: int + required: true + description: | + Value of the external sense resistor connected from the MultiSense + pin to GND, specified in Ohms. This is critical for correct + conversion of the analog readings. + + k-factor: + type: int + default: 1500 + description: | + Factor between PowerMOS and SenseMOS. + + k-vcc: + type: int + default: 8000 + description: | + VCC sense ratio multiplied by 1000. Used for supply voltage calculation. + + t-sense-0: + type: int + default: 25 + description: | + Temperature sense reference temperature in degrees Celsius. + + v-sense-0: + type: int + default: 2070 + description: | + Temperature sense reference voltage in millivolts. + + k-tchip: + type: int + default: -5500 + description: | + Temperature sense gain coefficient multiplied by 1000. + Used for chip temperature calculation. + diff --git a/software/apps/can_node/overlay-cdc-acm.conf b/software/apps/can_node/overlay-cdc-acm.conf new file mode 100644 index 0000000..2b6aa2e --- /dev/null +++ b/software/apps/can_node/overlay-cdc-acm.conf @@ -0,0 +1,4 @@ +CONFIG_USB_DEVICE_STACK=y +CONFIG_USB_DEVICE_PRODUCT="Modbus slave node" +CONFIG_UART_LINE_CTRL=y +CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=n \ No newline at end of file diff --git a/software/apps/can_node/prj.conf b/software/apps/can_node/prj.conf new file mode 100644 index 0000000..174fec8 --- /dev/null +++ b/software/apps/can_node/prj.conf @@ -0,0 +1,31 @@ +# Enable Console and printk for logging +CONFIG_CONSOLE=y +CONFIG_LOG=y + +# Enable Shell +CONFIG_SHELL=y +CONFIG_REBOOT=y +CONFIG_SHELL_MODBUS=n +CONFIG_SHELL_VALVE=y +CONFIG_SHELL_SYSTEM=y + +# Enable Settings Subsystem +CONFIG_SETTINGS=y +CONFIG_SETTINGS_NVS=y +CONFIG_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_MAP=y +CONFIG_FLASH_PAGE_LAYOUT=y + +# Config modbus +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_MODBUS=y +CONFIG_MODBUS_ROLE_SERVER=y +CONFIG_MODBUS_LOG_LEVEL_DBG=y + +# enable Valve Driver +CONFIG_LIB_VALVE=y +CONFIG_LOG_VALVE_LEVEL=4 + +# Enable VND7050AJ +CONFIG_VND7050AJ=y \ No newline at end of file diff --git a/software/apps/can_node/src/main.c b/software/apps/can_node/src/main.c new file mode 100644 index 0000000..60b3f5a --- /dev/null +++ b/software/apps/can_node/src/main.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include +#include + +LOG_MODULE_REGISTER(main, LOG_LEVEL_INF); + +int main(void) +{ + int rc; + LOG_INF("Starting Irrigation System CAN Node, Version %s", APP_VERSION_EXTENDED_STRING); + + /* Initialize settings subsystem */ + rc = settings_subsys_init(); + if (rc != 0) { + LOG_ERR("Failed to initialize settings subsystem (%d)", rc); + return rc; + } + LOG_INF("Settings subsystem initialized"); + + /* Load settings from storage */ + rc = settings_load(); + if (rc == 0) { + LOG_INF("Settings loaded successfully"); + } else { + LOG_WRN("Failed to load settings (%d)", rc); + } + + /* Initialize valve system */ + rc = valve_init(); + if (rc != 0) { + LOG_ERR("Failed to initialize valve system (%d)", rc); + return rc; + } + LOG_INF("Valve system initialized"); + + return 0; +} diff --git a/software/apps/can_node/sysbuild.conf b/software/apps/can_node/sysbuild.conf new file mode 100644 index 0000000..e9174e8 --- /dev/null +++ b/software/apps/can_node/sysbuild.conf @@ -0,0 +1,5 @@ +SB_CONFIG_BOOTLOADER_MCUBOOT=y +SB_CONFIG_MCUBOOT_MODE_SINGLE_APP=y + +CONFIG_LOG=y +CONFIG_MCUBOOT_LOG_LEVEL_INF=y \ No newline at end of file diff --git a/software/include/lib/can_ids.h b/software/include/lib/can_ids.h new file mode 100644 index 0000000..e69de29