From 6399813d71e4810690260fff4da4700a9e4762bb Mon Sep 17 00:00:00 2001 From: Henrik Brix Andersen Date: Sat, 2 Nov 2024 20:32:03 +0000 Subject: [PATCH] boards: fysetc: add FYSETC UCAN USB to CAN 2.0B adapter board Add support for the open-source FYSETC UCAN USB to CAN 2.0B board. Signed-off-by: Henrik Brix Andersen --- boards/fysetc/index.rst | 10 ++++ boards/fysetc/ucan/Kconfig.ucan | 5 ++ boards/fysetc/ucan/board.cmake | 8 +++ boards/fysetc/ucan/board.yml | 6 ++ boards/fysetc/ucan/doc/index.rst | 71 ++++++++++++++++++++++ boards/fysetc/ucan/doc/ucan.webp | Bin 0 -> 38116 bytes boards/fysetc/ucan/ucan.dts | 96 ++++++++++++++++++++++++++++++ boards/fysetc/ucan/ucan.yaml | 15 +++++ boards/fysetc/ucan/ucan_defconfig | 1 + 9 files changed, 212 insertions(+) create mode 100644 boards/fysetc/index.rst create mode 100644 boards/fysetc/ucan/Kconfig.ucan create mode 100644 boards/fysetc/ucan/board.cmake create mode 100644 boards/fysetc/ucan/board.yml create mode 100644 boards/fysetc/ucan/doc/index.rst create mode 100644 boards/fysetc/ucan/doc/ucan.webp create mode 100644 boards/fysetc/ucan/ucan.dts create mode 100644 boards/fysetc/ucan/ucan.yaml create mode 100644 boards/fysetc/ucan/ucan_defconfig diff --git a/boards/fysetc/index.rst b/boards/fysetc/index.rst new file mode 100644 index 00000000000000..546023ba7b001d --- /dev/null +++ b/boards/fysetc/index.rst @@ -0,0 +1,10 @@ +.. _boards-fysetc: + +FYSETC +###### + +.. toctree:: + :maxdepth: 1 + :glob: + + **/* diff --git a/boards/fysetc/ucan/Kconfig.ucan b/boards/fysetc/ucan/Kconfig.ucan new file mode 100644 index 00000000000000..c88f895ea01b31 --- /dev/null +++ b/boards/fysetc/ucan/Kconfig.ucan @@ -0,0 +1,5 @@ +# Copyright (c) 2024 Henrik Brix Andersen +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_UCAN + select SOC_STM32F072XB diff --git a/boards/fysetc/ucan/board.cmake b/boards/fysetc/ucan/board.cmake new file mode 100644 index 00000000000000..c383530f74c8a1 --- /dev/null +++ b/boards/fysetc/ucan/board.cmake @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Henrik Brix Andersen +# SPDX-License-Identifier: Apache-2.0 + +board_runner_args(dfu-util "--pid=0483:df11" "--alt=0" "--dfuse") +board_runner_args(jlink "--device=STM32F072CB") + +include(${ZEPHYR_BASE}/boards/common/dfu-util.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) diff --git a/boards/fysetc/ucan/board.yml b/boards/fysetc/ucan/board.yml new file mode 100644 index 00000000000000..3e9b1d3b09289b --- /dev/null +++ b/boards/fysetc/ucan/board.yml @@ -0,0 +1,6 @@ +board: + name: ucan + full_name: UCAN + vendor: fysetc + socs: + - name: stm32f072xb diff --git a/boards/fysetc/ucan/doc/index.rst b/boards/fysetc/ucan/doc/index.rst new file mode 100644 index 00000000000000..f9b4b53809f848 --- /dev/null +++ b/boards/fysetc/ucan/doc/index.rst @@ -0,0 +1,71 @@ +.. zephyr:board:: ucan + +Overview +******** + +The FYSETC UCAN is an open-source USB to CAN 2.0B adapter board. More information can be found on +the `UCAN website`_ and in the `UCAN wiki`_. + +Hardware +******** + +The UCAN board is equipped with a STM32F072CB microcontroller and features an USB-C connector, a +terminal block for connecting to the CAN bus, and two user LEDs. Schematics and component placement +drawings are available in the `UCAN GitHub repository`_. + +Supported Features +================== + +The ``ucan`` board configuration supports the following hardware features: + ++-----------+------------+-------------------------------------+ +| Interface | Controller | Driver/Component | ++===========+============+=====================================+ +| NVIC | on-chip | nested vector interrupt controller | ++-----------+------------+-------------------------------------+ +| PINMUX | on-chip | pinmux | ++-----------+------------+-------------------------------------+ +| FLASH | on-chip | flash memory | ++-----------+------------+-------------------------------------+ +| GPIO | on-chip | gpio | ++-----------+------------+-------------------------------------+ +| USB | on-chip | USB | ++-----------+------------+-------------------------------------+ +| CAN1 | on-chip | CAN controller | ++-----------+------------+-------------------------------------+ + +The default configuration can be found in the defconfig file: +:zephyr_file:`boards/fysetc/ucan/ucan_defconfig`. + +Other hardware features are not currently supported by the port. + +System Clock +============ + +The STM32F072CB PLL is driven by an external crystal oscillator (HSE) running at 8 MHz and +configured to provide a system clock of 48 MHz. + +Programming and Debugging +************************* + +Build and flash applications as usual (see :ref:`build_an_application` and +:ref:`application_run` for more details). + +If flashing via USB DFU, short pins ``B0`` and ``3V3`` when applying power to the UCAN board in +order to enter the built-in DFU mode. + +Here is an example for the :zephyr:code-sample:`blinky` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: ucan + :goals: flash + +.. _UCAN website: + https://www.fysetc.com/products/fysetc-ucan-board + +.. _UCAN wiki: + https://wiki.fysetc.com/UCAN/ + +.. _UCAN GitHub repository: + https://github.com/FYSETC/UCAN/ diff --git a/boards/fysetc/ucan/doc/ucan.webp b/boards/fysetc/ucan/doc/ucan.webp new file mode 100644 index 0000000000000000000000000000000000000000..427747f429695acc5db885263535ee255e95d407 GIT binary patch literal 38116 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 S<2#S}M{x^JA^b1=NB%$C9%Z!v literal 0 HcmV?d00001 diff --git a/boards/fysetc/ucan/ucan.dts b/boards/fysetc/ucan/ucan.dts new file mode 100644 index 00000000000000..a0f47da9256e8c --- /dev/null +++ b/boards/fysetc/ucan/ucan.dts @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2024 Henrik Brix Andersen + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +#include +#include + +/ { + model = "FYSETC UCAN board"; + compatible = "fysetc,ucan"; + + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,code-partition = &slot0_partition; + zephyr,canbus = &can1; + }; + + aliases { + led0 = &led_rx; + led1 = &led_tx; + }; + + leds { + compatible = "gpio-leds"; + led_rx: led_rx { + gpios = <&gpioa 0 GPIO_ACTIVE_HIGH>; + label = "LED RX"; + }; + led_tx: led_tx { + gpios = <&gpioa 1 GPIO_ACTIVE_HIGH>; + label = "LED TX"; + }; + }; + + transceiver0: can-phy0 { + compatible = "can-transceiver-gpio"; + enable-gpios = <&gpioc 13 GPIO_ACTIVE_LOW>; + max-bitrate = <1000000>; + #phy-cells = <0>; + }; +}; + +&clk_hse { + status = "okay"; + clock-frequency = ; +}; + +&pll { + prediv = <1>; + mul = <6>; + clocks = <&clk_hse>; + status = "okay"; +}; + +&rcc { + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <1>; +}; + +zephyr_udc0: &usb { + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; + status = "okay"; +}; + +&can1 { + pinctrl-0 = <&can_rx_pb8 &can_tx_pb9>; + pinctrl-names = "default"; + phys = <&transceiver0>; + status = "okay"; +}; + +&flash0 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 DT_SIZE_K(48)>; + read-only; + }; + slot0_partition: partition@c000 { + label = "image-0"; + reg = <0x0000c000 DT_SIZE_K(80)>; + }; + }; +}; diff --git a/boards/fysetc/ucan/ucan.yaml b/boards/fysetc/ucan/ucan.yaml new file mode 100644 index 00000000000000..cd65a21e1fd41e --- /dev/null +++ b/boards/fysetc/ucan/ucan.yaml @@ -0,0 +1,15 @@ +identifier: ucan +name: FYSETC UCAN +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb +ram: 16 +flash: 128 +supported: + - can + - gpio + - usb_device + - usbd +vendor: fysetc diff --git a/boards/fysetc/ucan/ucan_defconfig b/boards/fysetc/ucan/ucan_defconfig new file mode 100644 index 00000000000000..91c3c15b37d1ee --- /dev/null +++ b/boards/fysetc/ucan/ucan_defconfig @@ -0,0 +1 @@ +CONFIG_GPIO=y