From 925830f0a4e080cbfc6fdf45bbbc1439b6ca6cab Mon Sep 17 00:00:00 2001 From: Andrew Kay Date: Mon, 29 Mar 2021 16:38:00 -0500 Subject: [PATCH] Add interface2 --- README.md | 13 +- interface1/.images/hero.jpg | Bin 0 -> 201857 bytes interface1/README.md | 26 +- interface2/.images/hero.jpg | Bin 0 -> 174857 bytes interface2/README.md | 37 + interface2/firmware/.gitignore | 2 + interface2/firmware/boards/stm32l443cc.json | 38 + interface2/firmware/generate_bitstream_inc.sh | 15 + interface2/firmware/include/coax.h | 118 + interface2/firmware/include/config.h | 26 + interface2/firmware/include/cubemx/main.h | 82 + .../firmware/include/cubemx/stm32_assert.h | 53 + .../include/cubemx/stm32l4xx_hal_conf.h | 483 ++ .../firmware/include/cubemx/stm32l4xx_it.h | 72 + interface2/firmware/include/cubemx/tim.h | 58 + .../firmware/include/cubemx/usb_device.h | 105 + .../firmware/include/cubemx/usbd_cdc_if.h | 134 + .../firmware/include/cubemx/usbd_conf.h | 173 + .../firmware/include/cubemx/usbd_desc.h | 145 + interface2/firmware/include/debug.h | 29 + interface2/firmware/include/ice40.h | 34 + interface2/firmware/include/indicators.h | 43 + interface2/firmware/include/interface.h | 60 + interface2/firmware/include/message.h | 60 + interface2/firmware/include/pins.h | 55 + interface2/firmware/include/version.h | 19 + interface2/firmware/platformio.ini | 13 + interface2/firmware/src/coax.cpp | 469 + .../firmware/src/cubemx/startup_stm32l443xx.s | 468 + .../firmware/src/cubemx/stm32l4xx_hal_msp.c | 84 + interface2/firmware/src/cubemx/stm32l4xx_it.c | 246 + .../firmware/src/cubemx/system_stm32l4xx.c | 354 + interface2/firmware/src/cubemx/tim.c | 95 + interface2/firmware/src/cubemx/usb_device.c | 102 + interface2/firmware/src/cubemx/usbd_cdc_if.c | 336 + interface2/firmware/src/cubemx/usbd_conf.c | 828 ++ interface2/firmware/src/cubemx/usbd_desc.c | 445 + interface2/firmware/src/debug.cpp | 142 + interface2/firmware/src/ice40.cpp | 113 + interface2/firmware/src/indicators.cpp | 113 + interface2/firmware/src/interface.cpp | 279 + interface2/firmware/src/main.cpp | 209 + interface2/firmware/src/message.cpp | 258 + interface2/fpga/Makefile | 13 + interface2/fpga/rtl/.gitignore | 10 + interface2/fpga/rtl/Makefile | 1 + interface2/fpga/rtl/clocks.sdc | 2 + interface2/fpga/rtl/coax_buffer.v | 94 + interface2/fpga/rtl/coax_buffered_rx.v | 85 + interface2/fpga/rtl/coax_buffered_tx.v | 151 + interface2/fpga/rtl/coax_rx.v | 415 + interface2/fpga/rtl/coax_rx_bit_timer.v | 111 + interface2/fpga/rtl/coax_syn.prj | 71 + interface2/fpga/rtl/coax_tx.v | 308 + interface2/fpga/rtl/coax_tx_bit_timer.v | 46 + interface2/fpga/rtl/coax_tx_distorter.v | 53 + interface2/fpga/rtl/control.v | 347 + interface2/fpga/rtl/dual_clock_spi_device.v | 75 + interface2/fpga/rtl/icecube2.mk | 20 + interface2/fpga/rtl/icecube2_env.sh | 15 + interface2/fpga/rtl/icecube2_flow.tcl | 6 + interface2/fpga/rtl/pins.pcf | 25 + interface2/fpga/rtl/spi_device.v | 79 + interface2/fpga/rtl/strobe_cdc.v | 42 + .../fpga/rtl/third_party/fifo_sync_ram.v | 161 + interface2/fpga/rtl/third_party/ram_sdp.v | 73 + interface2/fpga/rtl/top.v | 201 + interface2/fpga/tests/.gitignore | 2 + interface2/fpga/tests/Makefile | 27 + interface2/fpga/tests/assert.v | 14 + interface2/fpga/tests/coax_buffer_tb.v | 90 + interface2/fpga/tests/coax_buffered_rx_tb.v | 169 + interface2/fpga/tests/coax_buffered_tx_tb.v | 138 + interface2/fpga/tests/coax_rx_bit_timer_tb.v | 75 + interface2/fpga/tests/coax_rx_tb.v | 492 ++ interface2/fpga/tests/coax_tx_bit_timer_tb.v | 38 + interface2/fpga/tests/coax_tx_distorter_tb.v | 54 + interface2/fpga/tests/coax_tx_tb.v | 113 + interface2/fpga/tests/control_tb.v | 186 + interface2/fpga/tests/mock_tx.v | 86 + interface2/fpga/tests/run_test.sh | 7 + interface2/pcb/.gitignore | 26 + interface2/pcb/fabrication/pcb-B_Cu.gbr | 4590 ++++++++++ interface2/pcb/fabrication/pcb-B_Mask.gbr | 68 + interface2/pcb/fabrication/pcb-B_Paste.gbr | 15 + interface2/pcb/fabrication/pcb-B_SilkS.gbr | 628 ++ interface2/pcb/fabrication/pcb-Edge_Cuts.gbr | 26 + interface2/pcb/fabrication/pcb-F_Cu.gbr | 7606 +++++++++++++++++ interface2/pcb/fabrication/pcb-F_Mask.gbr | 5434 ++++++++++++ interface2/pcb/fabrication/pcb-F_Paste.gbr | 6170 +++++++++++++ interface2/pcb/fabrication/pcb-F_SilkS.gbr | 453 + interface2/pcb/fabrication/pcb-In1_Cu.gbr | 4017 +++++++++ interface2/pcb/fabrication/pcb-In2_Cu.gbr | 6267 ++++++++++++++ interface2/pcb/fabrication/pcb-NPTH.drl | 7 + interface2/pcb/fabrication/pcb-PTH.drl | 187 + interface2/pcb/fp-lib-table | 3 + interface2/pcb/library.dcm | 9 + interface2/pcb/library.lib | 44 + .../CDFN3225-4LD-PL-1.kicad_mod | 22 + .../pcb/library.pretty/Murata_786J.kicad_mod | 36 + .../TestPoint_Pad_2x12_D1.0mm.kicad_mod | 71 + interface2/pcb/pcb-cache.lib | 690 ++ interface2/pcb/pcb.kicad_pcb | 5420 ++++++++++++ interface2/pcb/pcb.pro | 262 + interface2/pcb/pcb.sch | 2490 ++++++ interface2/pcb/sym-lib-table | 4 + pycoax/examples/common.py | 5 +- 107 files changed, 54855 insertions(+), 24 deletions(-) create mode 100644 interface1/.images/hero.jpg create mode 100644 interface2/.images/hero.jpg create mode 100644 interface2/README.md create mode 100644 interface2/firmware/.gitignore create mode 100644 interface2/firmware/boards/stm32l443cc.json create mode 100755 interface2/firmware/generate_bitstream_inc.sh create mode 100644 interface2/firmware/include/coax.h create mode 100644 interface2/firmware/include/config.h create mode 100644 interface2/firmware/include/cubemx/main.h create mode 100644 interface2/firmware/include/cubemx/stm32_assert.h create mode 100644 interface2/firmware/include/cubemx/stm32l4xx_hal_conf.h create mode 100644 interface2/firmware/include/cubemx/stm32l4xx_it.h create mode 100644 interface2/firmware/include/cubemx/tim.h create mode 100644 interface2/firmware/include/cubemx/usb_device.h create mode 100644 interface2/firmware/include/cubemx/usbd_cdc_if.h create mode 100644 interface2/firmware/include/cubemx/usbd_conf.h create mode 100644 interface2/firmware/include/cubemx/usbd_desc.h create mode 100644 interface2/firmware/include/debug.h create mode 100644 interface2/firmware/include/ice40.h create mode 100644 interface2/firmware/include/indicators.h create mode 100644 interface2/firmware/include/interface.h create mode 100644 interface2/firmware/include/message.h create mode 100644 interface2/firmware/include/pins.h create mode 100644 interface2/firmware/include/version.h create mode 100644 interface2/firmware/platformio.ini create mode 100644 interface2/firmware/src/coax.cpp create mode 100644 interface2/firmware/src/cubemx/startup_stm32l443xx.s create mode 100644 interface2/firmware/src/cubemx/stm32l4xx_hal_msp.c create mode 100644 interface2/firmware/src/cubemx/stm32l4xx_it.c create mode 100644 interface2/firmware/src/cubemx/system_stm32l4xx.c create mode 100644 interface2/firmware/src/cubemx/tim.c create mode 100644 interface2/firmware/src/cubemx/usb_device.c create mode 100644 interface2/firmware/src/cubemx/usbd_cdc_if.c create mode 100644 interface2/firmware/src/cubemx/usbd_conf.c create mode 100644 interface2/firmware/src/cubemx/usbd_desc.c create mode 100644 interface2/firmware/src/debug.cpp create mode 100644 interface2/firmware/src/ice40.cpp create mode 100644 interface2/firmware/src/indicators.cpp create mode 100644 interface2/firmware/src/interface.cpp create mode 100644 interface2/firmware/src/main.cpp create mode 100644 interface2/firmware/src/message.cpp create mode 100644 interface2/fpga/Makefile create mode 100644 interface2/fpga/rtl/.gitignore create mode 100644 interface2/fpga/rtl/Makefile create mode 100644 interface2/fpga/rtl/clocks.sdc create mode 100644 interface2/fpga/rtl/coax_buffer.v create mode 100644 interface2/fpga/rtl/coax_buffered_rx.v create mode 100644 interface2/fpga/rtl/coax_buffered_tx.v create mode 100644 interface2/fpga/rtl/coax_rx.v create mode 100644 interface2/fpga/rtl/coax_rx_bit_timer.v create mode 100644 interface2/fpga/rtl/coax_syn.prj create mode 100644 interface2/fpga/rtl/coax_tx.v create mode 100644 interface2/fpga/rtl/coax_tx_bit_timer.v create mode 100644 interface2/fpga/rtl/coax_tx_distorter.v create mode 100644 interface2/fpga/rtl/control.v create mode 100644 interface2/fpga/rtl/dual_clock_spi_device.v create mode 100644 interface2/fpga/rtl/icecube2.mk create mode 100755 interface2/fpga/rtl/icecube2_env.sh create mode 100755 interface2/fpga/rtl/icecube2_flow.tcl create mode 100644 interface2/fpga/rtl/pins.pcf create mode 100644 interface2/fpga/rtl/spi_device.v create mode 100644 interface2/fpga/rtl/strobe_cdc.v create mode 100644 interface2/fpga/rtl/third_party/fifo_sync_ram.v create mode 100644 interface2/fpga/rtl/third_party/ram_sdp.v create mode 100644 interface2/fpga/rtl/top.v create mode 100644 interface2/fpga/tests/.gitignore create mode 100644 interface2/fpga/tests/Makefile create mode 100644 interface2/fpga/tests/assert.v create mode 100644 interface2/fpga/tests/coax_buffer_tb.v create mode 100644 interface2/fpga/tests/coax_buffered_rx_tb.v create mode 100644 interface2/fpga/tests/coax_buffered_tx_tb.v create mode 100644 interface2/fpga/tests/coax_rx_bit_timer_tb.v create mode 100644 interface2/fpga/tests/coax_rx_tb.v create mode 100644 interface2/fpga/tests/coax_tx_bit_timer_tb.v create mode 100644 interface2/fpga/tests/coax_tx_distorter_tb.v create mode 100644 interface2/fpga/tests/coax_tx_tb.v create mode 100644 interface2/fpga/tests/control_tb.v create mode 100644 interface2/fpga/tests/mock_tx.v create mode 100755 interface2/fpga/tests/run_test.sh create mode 100644 interface2/pcb/.gitignore create mode 100644 interface2/pcb/fabrication/pcb-B_Cu.gbr create mode 100644 interface2/pcb/fabrication/pcb-B_Mask.gbr create mode 100644 interface2/pcb/fabrication/pcb-B_Paste.gbr create mode 100644 interface2/pcb/fabrication/pcb-B_SilkS.gbr create mode 100644 interface2/pcb/fabrication/pcb-Edge_Cuts.gbr create mode 100644 interface2/pcb/fabrication/pcb-F_Cu.gbr create mode 100644 interface2/pcb/fabrication/pcb-F_Mask.gbr create mode 100644 interface2/pcb/fabrication/pcb-F_Paste.gbr create mode 100644 interface2/pcb/fabrication/pcb-F_SilkS.gbr create mode 100644 interface2/pcb/fabrication/pcb-In1_Cu.gbr create mode 100644 interface2/pcb/fabrication/pcb-In2_Cu.gbr create mode 100644 interface2/pcb/fabrication/pcb-NPTH.drl create mode 100644 interface2/pcb/fabrication/pcb-PTH.drl create mode 100644 interface2/pcb/fp-lib-table create mode 100644 interface2/pcb/library.dcm create mode 100644 interface2/pcb/library.lib create mode 100644 interface2/pcb/library.pretty/CDFN3225-4LD-PL-1.kicad_mod create mode 100644 interface2/pcb/library.pretty/Murata_786J.kicad_mod create mode 100644 interface2/pcb/library.pretty/TestPoint_Pad_2x12_D1.0mm.kicad_mod create mode 100644 interface2/pcb/pcb-cache.lib create mode 100644 interface2/pcb/pcb.kicad_pcb create mode 100644 interface2/pcb/pcb.pro create mode 100644 interface2/pcb/pcb.sch create mode 100644 interface2/pcb/sym-lib-table diff --git a/README.md b/README.md index dad40ff..f5b9cc3 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,18 @@ # coax -Tools for interfacing with [IBM 3270](https://en.wikipedia.org/wiki/IBM_3270) type terminals. +Tools for connecting to real [IBM 3270](https://en.wikipedia.org/wiki/IBM_3270) type terminals. -## Contents +## Documentation * [protocol](protocol/protocol.md) - Protocol documentation -* [interface1](interface1) - A serial attached Arduino interface using the National Semiconductor DP8340 and DP8341 + +## Hardware + +* [interface1](interface1) - Legacy interface using obsolete National Semiconductor DP8340 and DP8341 +* [interface2](interface2) - Modern interface using a Lattice iCE40 FPGA and STM32 microcontroller + +## Software + * [pycoax](pycoax) - Python interface library ## See Also diff --git a/interface1/.images/hero.jpg b/interface1/.images/hero.jpg new file mode 100644 index 0000000000000000000000000000000000000000..20cd8b3b7dbf096fd928c84dad501865762e5845 GIT binary patch literal 201857 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%0Dqj?&_YEbZc%ip9Q!Z2vCF&~y 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®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 + exit 1 +fi + +if [ ! $BITSTREAM -nt "src/bitstream.inc" ]; then + echo "Bitstream '$BITSTREAM' is not newer than generated include file, skipping." >&2 + exit +fi + +xxd -i $BITSTREAM | tail -n +2 | head -n -2 > src/bitstream.inc diff --git a/interface2/firmware/include/coax.h b/interface2/firmware/include/coax.h new file mode 100644 index 0000000..85d53e2 --- /dev/null +++ b/interface2/firmware/include/coax.h @@ -0,0 +1,118 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#pragma once + +#include +#include + +#define COAX_ERROR_TX_RECEIVER_ACTIVE -1 +#define COAX_ERROR_TX_UNDERFLOW -2 + +#define COAX_ERROR_RX_LOSS_OF_MID_BIT_TRANSITION -1 +#define COAX_ERROR_RX_PARITY -2 +#define COAX_ERROR_RX_INVALID_END_SEQUENCE -4 +#define COAX_ERROR_RX_OVERFLOW -8 +#define COAX_ERROR_RX_UNKNOWN -513 + +#define COAX_ERROR_NOT_INITIALIZED -1024 + +enum class CoaxParity +{ + Odd = 0, + Even = 1 +}; + +class SPICoaxTransceiver; + +class Coax +{ +public: + Coax(SPICoaxTransceiver &spiCoaxTransceiver, CoaxParity parity, + volatile uint16_t *buffer, size_t bufferSize); + + bool init(); + + void reset(); + + int transmit(const uint16_t *buffer, size_t bufferCount); + int receive(uint16_t *buffer, size_t bufferSize, uint16_t timeout); + + void handleInterrupt(); + +private: + SPICoaxTransceiver &_spiCoaxTransceiver; + CoaxParity _parity; + + bool _isInitialized; + + volatile enum { + COAX_INTERRUPT_STATE_IDLE, + COAX_INTERRUPT_STATE_DISABLED, + COAX_INTERRUPT_STATE_RECEIVING, + COAX_INTERRUPT_STATE_RECEIVED, + COAX_INTERRUPT_STATE_ERROR + } _interruptState = COAX_INTERRUPT_STATE_DISABLED; + + volatile uint16_t *_buffer; + size_t _bufferSize; + volatile size_t _bufferCount = 0; + volatile int _error = 0; +}; + +#define COAX_REGISTER_STATUS 0x1 +#define COAX_REGISTER_STATUS_RX_ERROR 0x40 +#define COAX_REGISTER_STATUS_RX_ACTIVE 0x20 +#define COAX_REGISTER_STATUS_TX_COMPLETE 0x08 +#define COAX_REGISTER_STATUS_TX_ACTIVE 0x04 + +#define COAX_REGISTER_CONTROL 0x2 +#define COAX_REGISTER_CONTROL_LOOPBACK 0x01 +#define COAX_REGISTER_CONTROL_TX_PARITY 0x08 +#define COAX_REGISTER_CONTROL_RX_PARITY 0x40 + +#define COAX_REGISTER_DEVICE_ID 0xf + +class SPICoaxTransceiver +{ +public: + SPICoaxTransceiver(); + + bool init(); + + void reset(); + + uint8_t readRegister(uint8_t index); + void writeRegister(uint8_t index, uint8_t value, uint8_t mask); + + int transmit(const uint16_t *buffer, size_t bufferCount); + int receive(uint16_t *buffer, size_t bufferSize); + + void setLoopback(bool loopback); + void setTXParity(CoaxParity parity); + void setRXParity(CoaxParity parity); + + inline bool isTXComplete() + { + return readRegister(COAX_REGISTER_STATUS) & COAX_REGISTER_STATUS_TX_COMPLETE; + } + + inline bool isRXActive() + { + return readRegister(COAX_REGISTER_STATUS) & COAX_REGISTER_STATUS_RX_ACTIVE; + }; + +private: + void spiTransfer(const uint8_t *transmitBuffer, uint8_t *receiveBuffer, size_t count); +}; diff --git a/interface2/firmware/include/config.h b/interface2/firmware/include/config.h new file mode 100644 index 0000000..dbfec0e --- /dev/null +++ b/interface2/firmware/include/config.h @@ -0,0 +1,26 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#pragma once + +// The coax buffer size is based on the maximum receive size, which as a +// controller should be limited. +#define COAX_BUFFER_SIZE 32 + +// The message buffer size is based on the maximum conceivable coax write +// data command length which in turn assumes a maximum regen and EAB buffer +// being written in a single command. +#define MAX_COAX_WRITE_SIZE (1 + (3696 * 2)) + +#define MESSAGE_BUFFER_SIZE ((MAX_COAX_WRITE_SIZE * sizeof(uint16_t)) + 32) diff --git a/interface2/firmware/include/cubemx/main.h b/interface2/firmware/include/cubemx/main.h new file mode 100644 index 0000000..23fb270 --- /dev/null +++ b/interface2/firmware/include/cubemx/main.h @@ -0,0 +1,82 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l4xx_hal.h" +#include "stm32l4xx_ll_crs.h" +#include "stm32l4xx_ll_rcc.h" +#include "stm32l4xx_ll_bus.h" +#include "stm32l4xx_ll_system.h" +#include "stm32l4xx_ll_exti.h" +#include "stm32l4xx_ll_cortex.h" +#include "stm32l4xx_ll_utils.h" +#include "stm32l4xx_ll_pwr.h" +#include "stm32l4xx_ll_dma.h" +#include "stm32l4xx_ll_spi.h" +#include "stm32l4xx_ll_gpio.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/include/cubemx/stm32_assert.h b/interface2/firmware/include/cubemx/stm32_assert.h new file mode 100644 index 0000000..03511c4 --- /dev/null +++ b/interface2/firmware/include/cubemx/stm32_assert.h @@ -0,0 +1,53 @@ +/** + ****************************************************************************** + * @file stm32_assert.h + * @brief STM32 assert file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2018 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32_ASSERT_H +#define __STM32_ASSERT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Includes ------------------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32_ASSERT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/include/cubemx/stm32l4xx_hal_conf.h b/interface2/firmware/include/cubemx/stm32l4xx_hal_conf.h new file mode 100644 index 0000000..5945f0c --- /dev/null +++ b/interface2/firmware/include/cubemx/stm32l4xx_hal_conf.h @@ -0,0 +1,483 @@ +/** + ****************************************************************************** + * @file stm32l4xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration template file. + * This file should be copied to the application folder and renamed + * to stm32l4xx_hal_conf.h. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32L4xx_HAL_CONF_H +#define STM32L4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +/*#define HAL_ADC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_CAN_MODULE_ENABLED */ +/*#define HAL_COMP_MODULE_ENABLED */ +/*#define HAL_CRC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +/*#define HAL_DCMI_MODULE_ENABLED */ +/*#define HAL_DMA2D_MODULE_ENABLED */ +/*#define HAL_DFSDM_MODULE_ENABLED */ +/*#define HAL_DSI_MODULE_ENABLED */ +/*#define HAL_FIREWALL_MODULE_ENABLED */ +/*#define HAL_GFXMMU_MODULE_ENABLED */ +/*#define HAL_HCD_MODULE_ENABLED */ +/*#define HAL_HASH_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +/*#define HAL_LTDC_MODULE_ENABLED */ +/*#define HAL_LCD_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_MMC_MODULE_ENABLED */ +/*#define HAL_NAND_MODULE_ENABLED */ +/*#define HAL_NOR_MODULE_ENABLED */ +/*#define HAL_OPAMP_MODULE_ENABLED */ +/*#define HAL_OSPI_MODULE_ENABLED */ +/*#define HAL_OSPI_MODULE_ENABLED */ +#define HAL_PCD_MODULE_ENABLED +/*#define HAL_PKA_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SAI_MODULE_ENABLED */ +/*#define HAL_SD_MODULE_ENABLED */ +/*#define HAL_SMBUS_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SPI_MODULE_ENABLED */ +/*#define HAL_SRAM_MODULE_ENABLED */ +/*#define HAL_SWPMI_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED +/*#define HAL_TSC_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +/*#define HAL_EXTI_MODULE_ENABLED */ +/*#define HAL_PSSI_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal Multiple Speed oscillator (MSI) default value. + * This value is the default MSI range value after Reset. + */ +#if !defined (MSI_VALUE) + #define MSI_VALUE ((uint32_t)4000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* MSI_VALUE */ +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined (HSI48_VALUE) + #define HSI48_VALUE ((uint32_t)48000000U) /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz. + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE 32000U /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ + +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for SAI1 peripheral + * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source + * frequency. + */ +#if !defined (EXTERNAL_SAI1_CLOCK_VALUE) + #define EXTERNAL_SAI1_CLOCK_VALUE 2097000U /*!< Value of the SAI1 External clock source in Hz*/ +#endif /* EXTERNAL_SAI1_CLOCK_VALUE */ + +/** + * @brief External clock source for SAI2 peripheral + * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source + * frequency. + */ +#if !defined (EXTERNAL_SAI2_CLOCK_VALUE) + #define EXTERNAL_SAI2_CLOCK_VALUE 48000U /*!< Value of the SAI2 External clock source in Hz*/ +#endif /* EXTERNAL_SAI2_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ + +#define VDD_VALUE 3300U /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 0U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Register callback feature configuration ############### */ +/** + * @brief Set below the peripheral configuration to "1U" to add the support + * of HAL callback registration/deregistration feature for the HAL + * driver(s). This allows user application to provide specific callback + * functions thanks to HAL_PPP_RegisterCallback() rather than overwriting + * the default weak callback functions (see each stm32l4xx_hal_ppp.h file + * for possible callback identifiers defined in HAL_PPP_CallbackIDTypeDef + * for each PPP peripheral). + */ +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U +#define USE_HAL_CAN_REGISTER_CALLBACKS 0U +#define USE_HAL_COMP_REGISTER_CALLBACKS 0U +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U +#define USE_HAL_GFXMMU_REGISTER_CALLBACKS 0U +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U +#define USE_HAL_MMC_REGISTER_CALLBACKS 0U +#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U +#define USE_HAL_OSPI_REGISTER_CALLBACKS 0U +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U +#define USE_HAL_SD_REGISTER_CALLBACKS 0U +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U +#define USE_HAL_SWPMI_REGISTER_CALLBACKS 0U +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U +#define USE_HAL_TSC_REGISTER_CALLBACKS 0U +#define USE_HAL_UART_REGISTER_CALLBACKS 0U +#define USE_HAL_USART_REGISTER_CALLBACKS 0U +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver + * Activated: CRC code is present inside driver + * Deactivated: CRC code cleaned from driver + */ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32l4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32l4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32l4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32l4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32l4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32l4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32l4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED + #include "Legacy/stm32l4xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED + #include "stm32l4xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32l4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32l4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32l4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32l4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32l4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32l4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32l4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GFXMMU_MODULE_ENABLED + #include "stm32l4xx_hal_gfxmmu.h" +#endif /* HAL_GFXMMU_MODULE_ENABLED */ + +#ifdef HAL_FIREWALL_MODULE_ENABLED + #include "stm32l4xx_hal_firewall.h" +#endif /* HAL_FIREWALL_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32l4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32l4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32l4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32l4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32l4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32l4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LCD_MODULE_ENABLED + #include "stm32l4xx_hal_lcd.h" +#endif /* HAL_LCD_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32l4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32l4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32l4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32l4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32l4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED + #include "stm32l4xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_OSPI_MODULE_ENABLED + #include "stm32l4xx_hal_ospi.h" +#endif /* HAL_OSPI_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32l4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_PKA_MODULE_ENABLED + #include "stm32l4xx_hal_pka.h" +#endif /* HAL_PKA_MODULE_ENABLED */ + +#ifdef HAL_PSSI_MODULE_ENABLED + #include "stm32l4xx_hal_pssi.h" +#endif /* HAL_PSSI_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32l4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32l4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32l4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32l4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32l4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32l4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32l4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32l4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32l4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32l4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_SWPMI_MODULE_ENABLED + #include "stm32l4xx_hal_swpmi.h" +#endif /* HAL_SWPMI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32l4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_TSC_MODULE_ENABLED + #include "stm32l4xx_hal_tsc.h" +#endif /* HAL_TSC_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32l4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32l4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32l4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t *file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32L4xx_HAL_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/include/cubemx/stm32l4xx_it.h b/interface2/firmware/include/cubemx/stm32l4xx_it.h new file mode 100644 index 0000000..e6616f0 --- /dev/null +++ b/interface2/firmware/include/cubemx/stm32l4xx_it.h @@ -0,0 +1,72 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32L4xx_IT_H +#define __STM32L4xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +void EXTI0_IRQHandler(void); +void TIM6_DAC_IRQHandler(void); +void USB_IRQHandler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L4xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/include/cubemx/tim.h b/interface2/firmware/include/cubemx/tim.h new file mode 100644 index 0000000..263d87d --- /dev/null +++ b/interface2/firmware/include/cubemx/tim.h @@ -0,0 +1,58 @@ +/** + ****************************************************************************** + * File Name : TIM.h + * Description : This file provides code for the configuration + * of the TIM instances. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2021 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __tim_H +#define __tim_H +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern TIM_HandleTypeDef htim6; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_TIM6_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ tim_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/include/cubemx/usb_device.h b/interface2/firmware/include/cubemx/usb_device.h new file mode 100644 index 0000000..7b67ca2 --- /dev/null +++ b/interface2/firmware/include/cubemx/usb_device.h @@ -0,0 +1,105 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usb_device.h + * @version : v2.0_Cube + * @brief : Header for usb_device.c file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_DEVICE__H__ +#define __USB_DEVICE__H__ + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l4xx.h" +#include "stm32l4xx_hal.h" +#include "usbd_def.h" + +/* USER CODE BEGIN INCLUDE */ + +/* USER CODE END INCLUDE */ + +/** @addtogroup USBD_OTG_DRIVER + * @{ + */ + +/** @defgroup USBD_DEVICE USBD_DEVICE + * @brief Device file for Usb otg low level driver. + * @{ + */ + +/** @defgroup USBD_DEVICE_Exported_Variables USBD_DEVICE_Exported_Variables + * @brief Public variables. + * @{ + */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* + * -- Insert your variables declaration here -- + */ +/* USER CODE BEGIN VARIABLES */ + +/* USER CODE END VARIABLES */ +/** + * @} + */ + +/** @defgroup USBD_DEVICE_Exported_FunctionsPrototype USBD_DEVICE_Exported_FunctionsPrototype + * @brief Declaration of public functions for Usb device. + * @{ + */ + +/** USB Device initialization function. */ +void MX_USB_DEVICE_Init(void); + +/* + * -- Insert functions declaration here -- + */ +/* USER CODE BEGIN FD */ + +/* USER CODE END FD */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_DEVICE__H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/include/cubemx/usbd_cdc_if.h b/interface2/firmware/include/cubemx/usbd_cdc_if.h new file mode 100644 index 0000000..cf86596 --- /dev/null +++ b/interface2/firmware/include/cubemx/usbd_cdc_if.h @@ -0,0 +1,134 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usbd_cdc_if.h + * @version : v2.0_Cube + * @brief : Header for usbd_cdc_if.c file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CDC_IF_H__ +#define __USBD_CDC_IF_H__ + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_cdc.h" + +/* USER CODE BEGIN INCLUDE */ + +/* USER CODE END INCLUDE */ + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @brief For Usb device. + * @{ + */ + +/** @defgroup USBD_CDC_IF USBD_CDC_IF + * @brief Usb VCP device module + * @{ + */ + +/** @defgroup USBD_CDC_IF_Exported_Defines USBD_CDC_IF_Exported_Defines + * @brief Defines. + * @{ + */ +/* USER CODE BEGIN EXPORTED_DEFINES */ +/* Define size for the receive and transmit buffer over CDC */ +/* It's up to user to redefine and/or remove those define */ +#define APP_RX_DATA_SIZE 1000 +#define APP_TX_DATA_SIZE 1000 + +/* USER CODE END EXPORTED_DEFINES */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Exported_Types USBD_CDC_IF_Exported_Types + * @brief Types. + * @{ + */ + +/* USER CODE BEGIN EXPORTED_TYPES */ + +/* USER CODE END EXPORTED_TYPES */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Exported_Macros USBD_CDC_IF_Exported_Macros + * @brief Aliases. + * @{ + */ + +/* USER CODE BEGIN EXPORTED_MACRO */ + +/* USER CODE END EXPORTED_MACRO */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables + * @brief Public variables. + * @{ + */ + +/** CDC Interface callback. */ +extern USBD_CDC_ItfTypeDef USBD_Interface_fops_FS; + +/* USER CODE BEGIN EXPORTED_VARIABLES */ + +/* USER CODE END EXPORTED_VARIABLES */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Exported_FunctionsPrototype USBD_CDC_IF_Exported_FunctionsPrototype + * @brief Public functions declaration. + * @{ + */ + +uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len); + +/* USER CODE BEGIN EXPORTED_FUNCTIONS */ + +/* USER CODE END EXPORTED_FUNCTIONS */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_CDC_IF_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/include/cubemx/usbd_conf.h b/interface2/firmware/include/cubemx/usbd_conf.h new file mode 100644 index 0000000..ffd6a4d --- /dev/null +++ b/interface2/firmware/include/cubemx/usbd_conf.h @@ -0,0 +1,173 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usbd_conf.h + * @version : v2.0_Cube + * @brief : Header for usbd_conf.c file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CONF__H__ +#define __USBD_CONF__H__ + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include +#include +#include +#include "main.h" +#include "stm32l4xx.h" +#include "stm32l4xx_hal.h" + +/* USER CODE BEGIN INCLUDE */ + +/* USER CODE END INCLUDE */ + +/** @addtogroup USBD_OTG_DRIVER + * @brief Driver for Usb device. + * @{ + */ + +/** @defgroup USBD_CONF USBD_CONF + * @brief Configuration file for Usb otg low level driver. + * @{ + */ + +/** @defgroup USBD_CONF_Exported_Variables USBD_CONF_Exported_Variables + * @brief Public variables. + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CONF_Exported_Defines USBD_CONF_Exported_Defines + * @brief Defines for configuration of the Usb device. + * @{ + */ + +/*---------- -----------*/ +#define USBD_MAX_NUM_INTERFACES 1U +/*---------- -----------*/ +#define USBD_MAX_NUM_CONFIGURATION 1U +/*---------- -----------*/ +#define USBD_MAX_STR_DESC_SIZ 512U +/*---------- -----------*/ +#define USBD_DEBUG_LEVEL 0U +/*---------- -----------*/ +#define USBD_LPM_ENABLED 1U +/*---------- -----------*/ +#define USBD_SELF_POWERED 1U + +/****************************************/ +/* #define for FS and HS identification */ +#define DEVICE_FS 0 + +/** + * @} + */ + +/** @defgroup USBD_CONF_Exported_Macros USBD_CONF_Exported_Macros + * @brief Aliases. + * @{ + */ + +/* Memory management macros */ + +/** Alias for memory allocation. */ +#define USBD_malloc malloc + +/** Alias for memory release. */ +#define USBD_free free + +/** Alias for memory set. */ +#define USBD_memset memset + +/** Alias for memory copy. */ +#define USBD_memcpy memcpy + +/** Alias for delay. */ +#define USBD_Delay HAL_Delay + +/* DEBUG macros */ + +#if (USBD_DEBUG_LEVEL > 0) +#define USBD_UsrLog(...) printf(__VA_ARGS__);\ + printf("\n"); +#else +#define USBD_UsrLog(...) +#endif + +#if (USBD_DEBUG_LEVEL > 1) + +#define USBD_ErrLog(...) printf("ERROR: ") ;\ + printf(__VA_ARGS__);\ + printf("\n"); +#else +#define USBD_ErrLog(...) +#endif + +#if (USBD_DEBUG_LEVEL > 2) +#define USBD_DbgLog(...) printf("DEBUG : ") ;\ + printf(__VA_ARGS__);\ + printf("\n"); +#else +#define USBD_DbgLog(...) +#endif + +/** + * @} + */ + +/** @defgroup USBD_CONF_Exported_Types USBD_CONF_Exported_Types + * @brief Types. + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CONF_Exported_FunctionsPrototype USBD_CONF_Exported_FunctionsPrototype + * @brief Declaration of public functions for Usb device. + * @{ + */ + +/* Exported functions -------------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_CONF__H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/include/cubemx/usbd_desc.h b/interface2/firmware/include/cubemx/usbd_desc.h new file mode 100644 index 0000000..4bc2299 --- /dev/null +++ b/interface2/firmware/include/cubemx/usbd_desc.h @@ -0,0 +1,145 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usbd_desc.c + * @version : v2.0_Cube + * @brief : Header for usbd_conf.c file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_DESC__C__ +#define __USBD_DESC__C__ + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" + +/* USER CODE BEGIN INCLUDE */ + +/* USER CODE END INCLUDE */ + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_DESC USBD_DESC + * @brief Usb device descriptors module. + * @{ + */ + +/** @defgroup USBD_DESC_Exported_Constants USBD_DESC_Exported_Constants + * @brief Constants. + * @{ + */ +#define DEVICE_ID1 (UID_BASE) +#define DEVICE_ID2 (UID_BASE + 0x4) +#define DEVICE_ID3 (UID_BASE + 0x8) + +#define USB_SIZ_STRING_SERIAL 0x1A + +/* USER CODE BEGIN EXPORTED_CONSTANTS */ + +/* USER CODE END EXPORTED_CONSTANTS */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_Defines USBD_DESC_Exported_Defines + * @brief Defines. + * @{ + */ + +/* USER CODE BEGIN EXPORTED_DEFINES */ + +/* USER CODE END EXPORTED_DEFINES */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_TypesDefinitions USBD_DESC_Exported_TypesDefinitions + * @brief Types. + * @{ + */ + +/* USER CODE BEGIN EXPORTED_TYPES */ + +/* USER CODE END EXPORTED_TYPES */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_Macros USBD_DESC_Exported_Macros + * @brief Aliases. + * @{ + */ + +/* USER CODE BEGIN EXPORTED_MACRO */ + +/* USER CODE END EXPORTED_MACRO */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_Variables USBD_DESC_Exported_Variables + * @brief Public variables. + * @{ + */ + +/** Descriptor for the Usb device. */ +extern USBD_DescriptorsTypeDef FS_Desc; + +/* USER CODE BEGIN EXPORTED_VARIABLES */ + +/* USER CODE END EXPORTED_VARIABLES */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_FunctionsPrototype USBD_DESC_Exported_FunctionsPrototype + * @brief Public functions declaration. + * @{ + */ + +/* USER CODE BEGIN EXPORTED_FUNCTIONS */ + +/* USER CODE END EXPORTED_FUNCTIONS */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_DESC__C__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/include/debug.h b/interface2/firmware/include/debug.h new file mode 100644 index 0000000..60695f8 --- /dev/null +++ b/interface2/firmware/include/debug.h @@ -0,0 +1,29 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#pragma once + +class Debug +{ +public: + static bool init(); + + static void banner(); + + static void setMarker(int marker); + static void resetMarker(int marker); + + static void trap(int number); + static void trap(int number, const char *format, ...); +}; diff --git a/interface2/firmware/include/ice40.h b/interface2/firmware/include/ice40.h new file mode 100644 index 0000000..7a82109 --- /dev/null +++ b/interface2/firmware/include/ice40.h @@ -0,0 +1,34 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#pragma once + +#include +#include + +class ICE40 +{ +public: + ICE40(); + + bool configure(const uint8_t *bitstream, size_t bitstreamCount); + + inline bool isConfigured() + { + return _isConfigured; + } + +private: + bool _isConfigured; +}; diff --git a/interface2/firmware/include/indicators.h b/interface2/firmware/include/indicators.h new file mode 100644 index 0000000..5bd6423 --- /dev/null +++ b/interface2/firmware/include/indicators.h @@ -0,0 +1,43 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#pragma once + +enum IndicatorsStatus { + INDICATORS_STATUS_UNKNOWN, + INDICATORS_STATUS_CONFIGURING, + INDICATORS_STATUS_RUNNING +}; + +class Indicators +{ +public: + Indicators(); + + void init(); + + void setStatus(IndicatorsStatus status); + + void tx(); + void rx(); + void error(); + + void update(); + +private: + volatile IndicatorsStatus _status; + volatile uint8_t _txState; + volatile uint8_t _rxState; + volatile uint8_t _errorState; +}; diff --git a/interface2/firmware/include/interface.h b/interface2/firmware/include/interface.h new file mode 100644 index 0000000..a7b4300 --- /dev/null +++ b/interface2/firmware/include/interface.h @@ -0,0 +1,60 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#pragma once + +#include +#include + +#include "coax.h" +#include "indicators.h" + +#define COMMAND_RESET 0x01 +#define COMMAND_TRANSMIT_RECEIVE 0x06 +#define COMMAND_INFO 0xf0 +#define COMMAND_TEST 0xf1 +#define COMMAND_DFU 0xf2 + +#define INFO_SUPPORTED_QUERIES 0x01 +#define INFO_HARDWARE_TYPE 0x02 +#define INFO_HARDWARE_REVISION 0x03 +#define INFO_HARDWARE_SERIAL 0x04 +#define INFO_FIRMWARE_VERSION 0x05 +#define INFO_MESSAGE_BUFFER_SIZE 0x06 +#define INFO_FEATURES 0x07 + +#define TEST_SUPPORTED_TESTS 0x01 + +#define ERROR_INVALID_MESSAGE 1 +#define ERROR_UNKNOWN_COMMAND 2 +#define ERROR_MESSAGE_TIMEOUT 3 + +class Interface +{ +public: + Interface(Coax &coax, Indicators &indicators); + + void handleMessage(uint8_t *buffer, size_t bufferCount); + void handleError(MessageReceiverError error); + +private: + Coax &_coax; + Indicators &_indicators; + + void handleReset(uint8_t *buffer, size_t bufferCount); + void handleTransmitReceive(uint8_t *buffer, size_t bufferCount); + void handleInfo(uint8_t *buffer, size_t bufferCount); + void handleTest(uint8_t *buffer, size_t bufferCount); + void handleDFU(uint8_t *buffer, size_t bufferCount); +}; diff --git a/interface2/firmware/include/message.h b/interface2/firmware/include/message.h new file mode 100644 index 0000000..2105bc0 --- /dev/null +++ b/interface2/firmware/include/message.h @@ -0,0 +1,60 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#pragma once + +#include +#include + +enum MessageReceiverError { + MESSAGE_RECEIVER_ERROR_DATA_OVERFLOW, + MESSAGE_RECEIVER_ERROR_MESSAGE_OVERFLOW, + MESSAGE_RECEIVER_ERROR_TIMEOUT +}; + +enum MessageReceiverState { + MESSAGE_RECEIVER_STATE_WAIT_START, + MESSAGE_RECEIVER_STATE_DATA, + MESSAGE_RECEIVER_STATE_ESCAPE, + MESSAGE_RECEIVER_STATE_AVAILABLE, + MESSAGE_RECEIVER_STATE_DATA_OVERFLOW, + MESSAGE_RECEIVER_STATE_MESSAGE_OVERFLOW +}; + +class MessageReceiver +{ +public: + MessageReceiver(volatile uint8_t *buffer, size_t bufferSize, + void (*messageCallback)(const uint8_t *, size_t), + void (*errorCallback)(MessageReceiverError)); + + void load(const uint8_t *buffer, size_t bufferCount); + bool dispatch(); + +private: + uint32_t _timeout; + volatile uint32_t _lastReceiveTime; + volatile uint8_t *_buffer; + size_t _bufferSize; + volatile size_t _bufferCount; + volatile MessageReceiverState _state; + void (*_messageCallback)(const uint8_t *, size_t); + void (*_errorCallback)(MessageReceiverError); +}; + +class MessageSender +{ +public: + static bool send(const uint8_t *buffer, size_t bufferCount); +}; diff --git a/interface2/firmware/include/pins.h b/interface2/firmware/include/pins.h new file mode 100644 index 0000000..6fc7a88 --- /dev/null +++ b/interface2/firmware/include/pins.h @@ -0,0 +1,55 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#pragma once + +#include "stm32l4xx_ll_gpio.h" + +#define COAX_RESET_Pin GPIO_PIN_3 +#define COAX_RESET_GPIO_Port GPIOA +#define COAX_IRQ_Pin GPIO_PIN_0 +#define COAX_IRQ_GPIO_Port GPIOB +#define COAX_IRQ_EXTI_IRQn EXTI0_IRQn + +#define ICE40_CS_Pin GPIO_PIN_4 +#define ICE40_CS_GPIO_Port GPIOA +#define ICE40_SCK_Pin GPIO_PIN_5 +#define ICE40_SCK_GPIO_Port GPIOA +#define ICE40_SDO_Pin GPIO_PIN_6 +#define ICE40_SDO_GPIO_Port GPIOA +#define ICE40_SDI_Pin GPIO_PIN_7 +#define ICE40_SDI_GPIO_Port GPIOA +#define ICE40_CRESET_Pin GPIO_PIN_1 +#define ICE40_CRESET_GPIO_Port GPIOB +#define ICE40_CDONE_Pin GPIO_PIN_2 +#define ICE40_CDONE_GPIO_Port GPIOB + +#define GPIO0_Pin GPIO_PIN_10 +#define GPIO0_GPIO_Port GPIOB +#define GPIO1_Pin GPIO_PIN_11 +#define GPIO1_GPIO_Port GPIOB + +#define LED_STATUS_Pin GPIO_PIN_12 +#define LED_STATUS_GPIO_Port GPIOB +#define LED_TX_Pin GPIO_PIN_13 +#define LED_TX_GPIO_Port GPIOB +#define LED_RX_Pin GPIO_PIN_14 +#define LED_RX_GPIO_Port GPIOB +#define LED_ERROR_Pin GPIO_PIN_15 +#define LED_ERROR_GPIO_Port GPIOB + +#define USB_D__Pin GPIO_PIN_11 +#define USB_D__GPIO_Port GPIOA +#define USB_D_A12_Pin GPIO_PIN_12 +#define USB_D_A12_GPIO_Port GPIOA diff --git a/interface2/firmware/include/version.h b/interface2/firmware/include/version.h new file mode 100644 index 0000000..2a24736 --- /dev/null +++ b/interface2/firmware/include/version.h @@ -0,0 +1,19 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#pragma once + +#define VERSION_MAJOR 0 +#define VERSION_MINOR 0 +#define VERSION_PATCH 1 diff --git a/interface2/firmware/platformio.ini b/interface2/firmware/platformio.ini new file mode 100644 index 0000000..4fccb12 --- /dev/null +++ b/interface2/firmware/platformio.ini @@ -0,0 +1,13 @@ +[env:default] +platform = ststm32 +framework = stm32cube +board = stm32l443cc +upload_protocol = dfu +build_flags = + !./generate_bitstream_inc.sh + -Iinclude/cubemx + -DUSE_FULL_LL_DRIVER +src_build_flags = + !echo "-DFIRMWARE_BUILD_WHAT='\""$(git describe --match ForceNone --abbrev=7 --always --dirty=+)"\"'" + !echo "-DFIRMWARE_BUILD_WHO='\""$(whoami)"\"'" + !echo "-DFIRMWARE_BUILD_WHEN='\""$(date)"\"'" diff --git a/interface2/firmware/src/coax.cpp b/interface2/firmware/src/coax.cpp new file mode 100644 index 0000000..cb8f76a --- /dev/null +++ b/interface2/firmware/src/coax.cpp @@ -0,0 +1,469 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#include + +#include "stm32l4xx_ll_spi.h" + +#include "pins.h" +#include "debug.h" + +#include "coax.h" + +Coax::Coax(SPICoaxTransceiver &spiCoaxTransceiver, CoaxParity parity, + volatile uint16_t *buffer, size_t bufferSize) : + _spiCoaxTransceiver(spiCoaxTransceiver), + _parity(parity), + _buffer(buffer), + _bufferSize(bufferSize) +{ + _isInitialized = false; +} + +bool Coax::init() +{ + _isInitialized = false; + + _interruptState = COAX_INTERRUPT_STATE_DISABLED; + + if (!_spiCoaxTransceiver.init()) { + return false; + } + + _spiCoaxTransceiver.setTXParity(_parity); + _spiCoaxTransceiver.setRXParity(_parity); + + _isInitialized = true; + + return _isInitialized; +} + +void Coax::reset() +{ + if (!_isInitialized) { + return; + } + + _interruptState = COAX_INTERRUPT_STATE_DISABLED; + + _spiCoaxTransceiver.reset(); + + _spiCoaxTransceiver.setTXParity(_parity); + _spiCoaxTransceiver.setRXParity(_parity); +} + +int Coax::transmit(const uint16_t *buffer, size_t bufferCount) +{ + if (!_isInitialized) { + return COAX_ERROR_NOT_INITIALIZED; + } + + uint8_t status = _spiCoaxTransceiver.readRegister(COAX_REGISTER_STATUS); + + if (status & COAX_REGISTER_STATUS_RX_ACTIVE) { + return COAX_ERROR_TX_RECEIVER_ACTIVE; + } + + if (status & COAX_REGISTER_STATUS_RX_ERROR) { + Debug::trap(101); + + _spiCoaxTransceiver.reset(); + } + + _interruptState = COAX_INTERRUPT_STATE_IDLE; + + return _spiCoaxTransceiver.transmit(buffer, bufferCount); +} + +int Coax::receive(uint16_t *buffer, size_t bufferSize, uint16_t timeout) +{ + if (!_isInitialized) { + return COAX_ERROR_NOT_INITIALIZED; + } + + if (timeout > 0) { + uint32_t startTime = HAL_GetTick(); + + while (_interruptState == COAX_INTERRUPT_STATE_IDLE) { + // https://www.forward.com.au/pfod/ArduinoProgramming/TimingDelaysInArduino.html#unsigned + if ((HAL_GetTick() - startTime) > timeout) { + return 0; + } + } + } + +uint32_t startTime = HAL_GetTick(); + + while (!(_interruptState == COAX_INTERRUPT_STATE_RECEIVED || _interruptState == COAX_INTERRUPT_STATE_ERROR)) { +if ((HAL_GetTick() - startTime) > 1000) { + Debug::trap(102); +} + } + + int count = 0; + + if (_interruptState == COAX_INTERRUPT_STATE_RECEIVED) { + count = _bufferCount > bufferSize ? bufferSize : _bufferCount; + + memcpy(buffer, const_cast(_buffer), count * sizeof(uint16_t)); + + // TODO: we should be able to manipulate _buffer and not change the state + // to allow multiple calls to this method to read a large message... but + // that is not necessary right now + } else if (_interruptState == COAX_INTERRUPT_STATE_ERROR) { + Debug::trap(103, "error = %d", _error); + + count = (-1) * _error; + } + + _interruptState = COAX_INTERRUPT_STATE_IDLE; + + return count; +} + +void Coax::handleInterrupt() +{ + if (!_isInitialized) { + Debug::trap(104); + return; + } + + if (_interruptState != COAX_INTERRUPT_STATE_IDLE) { + Debug::trap(105, "state = %d", _interruptState); + return; + } + + _interruptState = COAX_INTERRUPT_STATE_RECEIVING; + + int error = 0; + + uint16_t *buffer = const_cast(_buffer); + size_t bufferSize = _bufferSize; + int bufferCount = 0; + + bool isActive; + int count; + + do { + // Determine if the receiver is active before reading from the FIFO to + // avoid a race condition where the FIFO is empty, the receiver is + // active but is inactive by the time we check the status. + isActive = _spiCoaxTransceiver.isRXActive(); + + // TODO: need to somehow handle an overflow detection here... + + count = _spiCoaxTransceiver.receive(buffer, bufferSize); + + if (count < 0) { + error = (-1) * count; + break; + } + + bufferCount += count; + + buffer += count; + bufferSize -= count; + } while (isActive || count == static_cast(bufferSize)); + + if (error != 0) { + _bufferCount = 0; + _error = error; + + _interruptState = COAX_INTERRUPT_STATE_ERROR; + } else { + _bufferCount = bufferCount; + _error = 0; + + _interruptState = COAX_INTERRUPT_STATE_RECEIVED; + } +} + +#define COAX_COMMAND_READ_REGISTER 0x2 +#define COAX_COMMAND_WRITE_REGISTER 0x3 +#define COAX_COMMAND_TX 0x4 +#define COAX_COMMAND_RX 0x5 +#define COAX_COMMAND_RESET 0xff + +#define NOP asm volatile("nop\n\t") +#define ATOMIC_BLOCK_START __disable_irq() +#define ATOMIC_BLOCK_END __enable_irq() + +SPICoaxTransceiver::SPICoaxTransceiver() +{ +} + +bool SPICoaxTransceiver::init() +{ + // Configure GPIO. + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + HAL_GPIO_WritePin(GPIOA, ICE40_CS_Pin | COAX_RESET_Pin, GPIO_PIN_RESET); + + GPIO_InitTypeDef gpioInit = { 0 }; + + gpioInit.Pin = ICE40_CS_Pin | COAX_RESET_Pin; + gpioInit.Mode = GPIO_MODE_OUTPUT_PP; + gpioInit.Pull = GPIO_NOPULL; + gpioInit.Speed = GPIO_SPEED_FREQ_LOW; + + HAL_GPIO_Init(GPIOA, &gpioInit); + + gpioInit.Pin = COAX_IRQ_Pin; + gpioInit.Mode = GPIO_MODE_IT_RISING; + gpioInit.Pull = GPIO_NOPULL; + + HAL_GPIO_Init(GPIOB, &gpioInit); + + HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(EXTI0_IRQn); + + // Set initial GPIO state. + HAL_GPIO_WritePin(GPIOA, ICE40_CS_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(GPIOA, COAX_RESET_Pin, GPIO_PIN_RESET); + + // Configure SPI. + __HAL_RCC_SPI1_CLK_ENABLE(); + + gpioInit.Pin = ICE40_SCK_Pin | ICE40_SDI_Pin | ICE40_SDO_Pin; + gpioInit.Mode = GPIO_MODE_AF_PP; + gpioInit.Alternate = GPIO_AF5_SPI1; + gpioInit.Pull = GPIO_NOPULL; + gpioInit.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + + HAL_GPIO_Init(GPIOA, &gpioInit); + + LL_SPI_InitTypeDef spiInit = { 0 }; + + spiInit.TransferDirection = LL_SPI_FULL_DUPLEX; + spiInit.Mode = LL_SPI_MODE_MASTER; + spiInit.DataWidth = LL_SPI_DATAWIDTH_8BIT; + spiInit.ClockPolarity = LL_SPI_POLARITY_LOW; + spiInit.ClockPhase = LL_SPI_PHASE_1EDGE; + spiInit.NSS = LL_SPI_NSS_SOFT; + spiInit.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV8; + spiInit.BitOrder = LL_SPI_MSB_FIRST; + spiInit.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE; + spiInit.CRCPoly = 7; + + LL_SPI_Init(SPI1, &spiInit); + + LL_SPI_SetStandard(SPI1, LL_SPI_PROTOCOL_MOTOROLA); + LL_SPI_DisableNSSPulseMgt(SPI1); + LL_SPI_SetRxFIFOThreshold(SPI1, LL_SPI_RX_FIFO_TH_QUARTER); + + LL_SPI_Enable(SPI1); + + // Release hardware reset. + HAL_GPIO_WritePin(GPIOA, COAX_RESET_Pin, GPIO_PIN_SET); + + uint8_t deviceId = readRegister(COAX_REGISTER_DEVICE_ID); + + if (deviceId != 0xa5) { + return false; + } + + reset(); + + setLoopback(false); + + setTXParity(CoaxParity::Even); + setRXParity(CoaxParity::Even); + + return true; +} + +void SPICoaxTransceiver::reset() +{ + uint8_t transmitBuffer[1] = { COAX_COMMAND_RESET }; + + ATOMIC_BLOCK_START; + LL_GPIO_ResetOutputPin(ICE40_CS_GPIO_Port, ICE40_CS_Pin); + + spiTransfer(transmitBuffer, NULL, 1); + + LL_GPIO_SetOutputPin(ICE40_CS_GPIO_Port, ICE40_CS_Pin); + ATOMIC_BLOCK_END; +} + +uint8_t SPICoaxTransceiver::readRegister(uint8_t index) +{ + uint8_t transmitBuffer[2] = { (uint8_t) (COAX_COMMAND_READ_REGISTER | (index << 4)), 0x00 }; + uint8_t receiveBuffer[2]; + + ATOMIC_BLOCK_START; + LL_GPIO_ResetOutputPin(ICE40_CS_GPIO_Port, ICE40_CS_Pin); + + spiTransfer(transmitBuffer, receiveBuffer, 2); + + LL_GPIO_SetOutputPin(ICE40_CS_GPIO_Port, ICE40_CS_Pin); + ATOMIC_BLOCK_END; + + return receiveBuffer[1]; +} + +void SPICoaxTransceiver::writeRegister(uint8_t index, uint8_t value, uint8_t mask) +{ + uint8_t transmitBuffer[3] = { (uint8_t) (COAX_COMMAND_WRITE_REGISTER | (index << 4)), mask, value }; + + ATOMIC_BLOCK_START; + LL_GPIO_ResetOutputPin(ICE40_CS_GPIO_Port, ICE40_CS_Pin); + + spiTransfer(transmitBuffer, NULL, 3); + + LL_GPIO_SetOutputPin(ICE40_CS_GPIO_Port, ICE40_CS_Pin); + ATOMIC_BLOCK_END; +} + +int SPICoaxTransceiver::transmit(const uint16_t *buffer, size_t bufferCount) +{ + uint8_t transmitBuffer[2] = { COAX_COMMAND_TX }; + uint8_t receiveBuffer[2]; + + size_t count = 0; + int error = 0; + + ATOMIC_BLOCK_START; + LL_GPIO_ResetOutputPin(ICE40_CS_GPIO_Port, ICE40_CS_Pin); + + spiTransfer(transmitBuffer, NULL, 1); + + do { + transmitBuffer[0] = (buffer[count] >> 8) & 0x03; + transmitBuffer[1] = buffer[count] & 0xff; + + spiTransfer(transmitBuffer, receiveBuffer, 2); + + uint8_t value = receiveBuffer[1]; + + if (value == 0) { + count++; + } else if (value == 0x81) { + // Overflow... we'll just try again. + continue; + } else if (value == 0x82) { + error = COAX_ERROR_TX_UNDERFLOW; + break; + } + } while (count < bufferCount); + + LL_GPIO_SetOutputPin(ICE40_CS_GPIO_Port, ICE40_CS_Pin); + ATOMIC_BLOCK_END; + + if (error != 0) { + return error; + } + + while (!isTXComplete()) { + NOP; + } + + return count; +} + +int SPICoaxTransceiver::receive(uint16_t *buffer, size_t bufferSize) +{ + uint8_t transmitBuffer[2] = { COAX_COMMAND_RX }; + uint8_t receiveBuffer[2]; + + size_t count = 0; + int error = 0; + + ATOMIC_BLOCK_START; + LL_GPIO_ResetOutputPin(ICE40_CS_GPIO_Port, ICE40_CS_Pin); + + spiTransfer(transmitBuffer, NULL, 1); + + transmitBuffer[0] = 0x00; + transmitBuffer[1] = 0x00; + + do { + spiTransfer(transmitBuffer, receiveBuffer, 2); + + uint16_t value = (receiveBuffer[0] << 8) | receiveBuffer[1]; + + if (value & 0x8000) { + error = (-1) * (value & 0x03ff); + + if (error == 0) { + Debug::trap(106); + + error = COAX_ERROR_RX_UNKNOWN; + } + + break; + } else if (value & 0x4000) { + break; + } + + // TODO: can this ever happen... I don't think so now the loop has + // been rewritten. + if (count >= bufferSize) { + Debug::trap(107); + break; + } + + buffer[count] = value & 0x03ff; + + count++; + } while (count < bufferSize); + + LL_GPIO_SetOutputPin(ICE40_CS_GPIO_Port, ICE40_CS_Pin); + ATOMIC_BLOCK_END; + + if (error != 0) { + return error; + } + + return count; +} + +void SPICoaxTransceiver::setLoopback(bool loopback) +{ + writeRegister(COAX_REGISTER_CONTROL, loopback ? COAX_REGISTER_CONTROL_LOOPBACK : 0, COAX_REGISTER_CONTROL_LOOPBACK); +} + +void SPICoaxTransceiver::setTXParity(CoaxParity parity) +{ + writeRegister(COAX_REGISTER_CONTROL, parity == CoaxParity::Even ? COAX_REGISTER_CONTROL_TX_PARITY : 0, COAX_REGISTER_CONTROL_TX_PARITY); +} + +void SPICoaxTransceiver::setRXParity(CoaxParity parity) +{ + writeRegister(COAX_REGISTER_CONTROL, parity == CoaxParity::Even ? COAX_REGISTER_CONTROL_RX_PARITY : 0, COAX_REGISTER_CONTROL_RX_PARITY); +} + +void SPICoaxTransceiver::spiTransfer(const uint8_t *transmitBuffer, + uint8_t *receiveBuffer, size_t count) +{ + // TODO: flush, or confirm TX ready? + + for (size_t index = 0; index < count; index++) { + while (!(SPI1->SR & SPI_SR_TXE)) { + NOP; + } + + LL_SPI_TransmitData8(SPI1, transmitBuffer[index]); + + while (!LL_SPI_IsActiveFlag_RXNE(SPI1)) { + NOP; + } + + uint8_t value = LL_SPI_ReceiveData8(SPI1); + + if (receiveBuffer != NULL) { + receiveBuffer[index] = value; + } + } +} diff --git a/interface2/firmware/src/cubemx/startup_stm32l443xx.s b/interface2/firmware/src/cubemx/startup_stm32l443xx.s new file mode 100644 index 0000000..8437e0b --- /dev/null +++ b/interface2/firmware/src/cubemx/startup_stm32l443xx.s @@ -0,0 +1,468 @@ +/** + ****************************************************************************** + * @file startup_stm32l443xx.s + * @author MCD Application Team + * @brief STM32L443xx devices vector table for GCC toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address, + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Apache License, Version 2.0, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/Apache-2.0 + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF1E0F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr sp, =_estack /* Set stack pointer */ + +/* Call the clock system initialization function.*/ + bl SystemInit + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + +LoopForever: + b LoopForever + +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex-M4. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_PVM_IRQHandler + .word TAMP_STAMP_IRQHandler + .word RTC_WKUP_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_IRQHandler + .word CAN1_TX_IRQHandler + .word CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_TIM15_IRQHandler + .word TIM1_UP_TIM16_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word 0 + .word 0 + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTC_Alarm_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word SDMMC1_IRQHandler + .word 0 + .word SPI3_IRQHandler + .word 0 + .word 0 + .word TIM6_DAC_IRQHandler + .word TIM7_IRQHandler + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_IRQHandler + .word DMA2_Channel5_IRQHandler + .word 0 + .word 0 + .word 0 + .word COMP_IRQHandler + .word LPTIM1_IRQHandler + .word LPTIM2_IRQHandler + .word USB_IRQHandler + .word DMA2_Channel6_IRQHandler + .word DMA2_Channel7_IRQHandler + .word LPUART1_IRQHandler + .word QUADSPI_IRQHandler + .word I2C3_EV_IRQHandler + .word I2C3_ER_IRQHandler + .word SAI1_IRQHandler + .word 0 + .word SWPMI1_IRQHandler + .word TSC_IRQHandler + .word LCD_IRQHandler + .word AES_IRQHandler + .word RNG_IRQHandler + .word FPU_IRQHandler + .word CRS_IRQHandler + + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_PVM_IRQHandler + .thumb_set PVD_PVM_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM15_IRQHandler + .thumb_set TIM1_BRK_TIM15_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM16_IRQHandler + .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak SDMMC1_IRQHandler + .thumb_set SDMMC1_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_IRQHandler + .thumb_set DMA2_Channel4_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + + .weak COMP_IRQHandler + .thumb_set COMP_IRQHandler,Default_Handler + + .weak LPTIM1_IRQHandler + .thumb_set LPTIM1_IRQHandler,Default_Handler + + .weak LPTIM2_IRQHandler + .thumb_set LPTIM2_IRQHandler,Default_Handler + + .weak USB_IRQHandler + .thumb_set USB_IRQHandler,Default_Handler + + .weak DMA2_Channel6_IRQHandler + .thumb_set DMA2_Channel6_IRQHandler,Default_Handler + + .weak DMA2_Channel7_IRQHandler + .thumb_set DMA2_Channel7_IRQHandler,Default_Handler + + .weak LPUART1_IRQHandler + .thumb_set LPUART1_IRQHandler,Default_Handler + + .weak QUADSPI_IRQHandler + .thumb_set QUADSPI_IRQHandler,Default_Handler + + .weak I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak SAI1_IRQHandler + .thumb_set SAI1_IRQHandler,Default_Handler + + .weak SWPMI1_IRQHandler + .thumb_set SWPMI1_IRQHandler,Default_Handler + + .weak TSC_IRQHandler + .thumb_set TSC_IRQHandler,Default_Handler + + .weak LCD_IRQHandler + .thumb_set LCD_IRQHandler,Default_Handler + + .weak AES_IRQHandler + .thumb_set AES_IRQHandler,Default_Handler + + .weak RNG_IRQHandler + .thumb_set RNG_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + + .weak CRS_IRQHandler + .thumb_set CRS_IRQHandler,Default_Handler +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/src/cubemx/stm32l4xx_hal_msp.c b/interface2/firmware/src/cubemx/stm32l4xx_hal_msp.c new file mode 100644 index 0000000..e88b0c1 --- /dev/null +++ b/interface2/firmware/src/cubemx/stm32l4xx_hal_msp.c @@ -0,0 +1,84 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32l4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/src/cubemx/stm32l4xx_it.c b/interface2/firmware/src/cubemx/stm32l4xx_it.c new file mode 100644 index 0000000..d97dac4 --- /dev/null +++ b/interface2/firmware/src/cubemx/stm32l4xx_it.c @@ -0,0 +1,246 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32l4xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ +extern PCD_HandleTypeDef hpcd_USB_FS; +extern TIM_HandleTypeDef htim6; +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Prefetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32L4xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32l4xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles EXTI line0 interrupt. + */ +void EXTI0_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI0_IRQn 0 */ + + /* USER CODE END EXTI0_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); + /* USER CODE BEGIN EXTI0_IRQn 1 */ + + /* USER CODE END EXTI0_IRQn 1 */ +} + +/** + * @brief This function handles TIM6 global interrupt, DAC channel1 and channel2 underrun error interrupts. + */ +void TIM6_DAC_IRQHandler(void) +{ + /* USER CODE BEGIN TIM6_DAC_IRQn 0 */ + + /* USER CODE END TIM6_DAC_IRQn 0 */ + HAL_TIM_IRQHandler(&htim6); + /* USER CODE BEGIN TIM6_DAC_IRQn 1 */ + + /* USER CODE END TIM6_DAC_IRQn 1 */ +} + +/** + * @brief This function handles USB event interrupt through EXTI line 17. + */ +void USB_IRQHandler(void) +{ + /* USER CODE BEGIN USB_IRQn 0 */ + + /* USER CODE END USB_IRQn 0 */ + HAL_PCD_IRQHandler(&hpcd_USB_FS); + /* USER CODE BEGIN USB_IRQn 1 */ + + /* USER CODE END USB_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/src/cubemx/system_stm32l4xx.c b/interface2/firmware/src/cubemx/system_stm32l4xx.c new file mode 100644 index 0000000..045a81d --- /dev/null +++ b/interface2/firmware/src/cubemx/system_stm32l4xx.c @@ -0,0 +1,354 @@ +/** + ****************************************************************************** + * @file system_stm32l4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32l4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * After each device reset the MSI (4 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32l4xx.s" file, to + * configure the system clock before to branch to main program. + * + * This file configures the system clock as follows: + *============================================================================= + *----------------------------------------------------------------------------- + * System Clock source | MSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 4000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 4000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 1 + *----------------------------------------------------------------------------- + * PLL_M | 1 + *----------------------------------------------------------------------------- + * PLL_N | 8 + *----------------------------------------------------------------------------- + * PLL_P | 7 + *----------------------------------------------------------------------------- + * PLL_Q | 2 + *----------------------------------------------------------------------------- + * PLL_R | 2 + *----------------------------------------------------------------------------- + * PLLSAI1_P | NA + *----------------------------------------------------------------------------- + * PLLSAI1_Q | NA + *----------------------------------------------------------------------------- + * PLLSAI1_R | NA + *----------------------------------------------------------------------------- + * PLLSAI2_P | NA + *----------------------------------------------------------------------------- + * PLLSAI2_Q | NA + *----------------------------------------------------------------------------- + * PLLSAI2_R | NA + *----------------------------------------------------------------------------- + * Require 48MHz for USB OTG FS, | Disabled + * SDIO and RNG clock | + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Apache License, Version 2.0, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/Apache-2.0 + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32l4xx_system + * @{ + */ + +/** @addtogroup STM32L4xx_System_Private_Includes + * @{ + */ + +#include "stm32l4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (MSI_VALUE) + #define MSI_VALUE 4000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* MSI_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Variables + * @{ + */ + /* The SystemCoreClock variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 4000000U; + + const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; + const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; + const uint32_t MSIRangeTable[12] = {100000U, 200000U, 400000U, 800000U, 1000000U, 2000000U, \ + 4000000U, 8000000U, 16000000U, 24000000U, 32000000U, 48000000U}; +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ +extern uint32_t bootMagic; + +void SystemInit(void) +{ + // Enter the DFU bootloader if the magic flag is set. + if (bootMagic == 0x32703270) { + bootMagic = 0x00000000; + + uint32_t address = 0x1fff0000; + + void (*bootloader)(void) = (void (*)(void)) (*((uint32_t *) (address + 4))); + + __set_MSP(*(uint32_t *) address); + + bootloader(); + + while (1) { + } + } + + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set MSION bit */ + RCC->CR |= RCC_CR_MSION; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000U; + + /* Reset HSEON, CSSON , HSION, and PLLON bits */ + RCC->CR &= 0xEAF6FFFFU; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x00001000U; + + /* Reset HSEBYP bit */ + RCC->CR &= 0xFFFBFFFFU; + + /* Disable all interrupts */ + RCC->CIER = 0x00000000U; + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*) + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) + * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) MSI_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 4 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSI_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (***) HSE_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 8 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0U, msirange = 0U, pllvco = 0U, pllr = 2U, pllsource = 0U, pllm = 2U; + + /* Get MSI Range frequency--------------------------------------------------*/ + if((RCC->CR & RCC_CR_MSIRGSEL) == RESET) + { /* MSISRANGE from RCC_CSR applies */ + msirange = (RCC->CSR & RCC_CSR_MSISRANGE) >> 8U; + } + else + { /* MSIRANGE from RCC_CR applies */ + msirange = (RCC->CR & RCC_CR_MSIRANGE) >> 4U; + } + /*MSI frequency range in HZ*/ + msirange = MSIRangeTable[msirange]; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case 0x00: /* MSI used as system clock source */ + SystemCoreClock = msirange; + break; + + case 0x04: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + + case 0x08: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + + case 0x0C: /* PLL used as system clock source */ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4U) + 1U ; + + switch (pllsource) + { + case 0x02: /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm); + break; + + case 0x03: /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm); + break; + + default: /* MSI used as PLL clock source */ + pllvco = (msirange / pllm); + break; + } + pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8U); + pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25U) + 1U) * 2U; + SystemCoreClock = pllvco/pllr; + break; + + default: + SystemCoreClock = msirange; + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/src/cubemx/tim.c b/interface2/firmware/src/cubemx/tim.c new file mode 100644 index 0000000..f7d5d31 --- /dev/null +++ b/interface2/firmware/src/cubemx/tim.c @@ -0,0 +1,95 @@ +/** + ****************************************************************************** + * File Name : TIM.c + * Description : This file provides code for the configuration + * of the TIM instances. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2021 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "tim.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +TIM_HandleTypeDef htim6; + +/* TIM6 init function */ +void MX_TIM6_Init(void) +{ + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + htim6.Instance = TIM6; + htim6.Init.Prescaler = 8000-1; + htim6.Init.CounterMode = TIM_COUNTERMODE_UP; + htim6.Init.Period = 1000-1; + htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim6) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + +} + +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) +{ + + if(tim_baseHandle->Instance==TIM6) + { + /* USER CODE BEGIN TIM6_MspInit 0 */ + + /* USER CODE END TIM6_MspInit 0 */ + /* TIM6 clock enable */ + __HAL_RCC_TIM6_CLK_ENABLE(); + + /* TIM6 interrupt Init */ + HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); + /* USER CODE BEGIN TIM6_MspInit 1 */ + + /* USER CODE END TIM6_MspInit 1 */ + } +} + +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) +{ + + if(tim_baseHandle->Instance==TIM6) + { + /* USER CODE BEGIN TIM6_MspDeInit 0 */ + + /* USER CODE END TIM6_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM6_CLK_DISABLE(); + + /* TIM6 interrupt Deinit */ + HAL_NVIC_DisableIRQ(TIM6_DAC_IRQn); + /* USER CODE BEGIN TIM6_MspDeInit 1 */ + + /* USER CODE END TIM6_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/src/cubemx/usb_device.c b/interface2/firmware/src/cubemx/usb_device.c new file mode 100644 index 0000000..f3d0510 --- /dev/null +++ b/interface2/firmware/src/cubemx/usb_device.c @@ -0,0 +1,102 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usb_device.c + * @version : v2.0_Cube + * @brief : This file implements the USB Device + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ + +#include "usb_device.h" +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_cdc.h" +#include "usbd_cdc_if.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ + +/* USER CODE BEGIN PFP */ +/* Private function prototypes -----------------------------------------------*/ + +/* USER CODE END PFP */ + +/* USB Device Core handle declaration. */ +USBD_HandleTypeDef hUsbDeviceFS; +extern USBD_DescriptorsTypeDef FS_Desc; + +/* + * -- Insert your variables declaration here -- + */ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* + * -- Insert your external function declaration here -- + */ +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** + * Init USB device Library, add supported class and start the library + * @retval None + */ +void MX_USB_DEVICE_Init(void) +{ + /* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */ + + /* USER CODE END USB_DEVICE_Init_PreTreatment */ + + /* Init Device Library, add supported class and start the library. */ + if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK) + { + Error_Handler(); + } + if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC) != USBD_OK) + { + Error_Handler(); + } + if (USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS) != USBD_OK) + { + Error_Handler(); + } + if (USBD_Start(&hUsbDeviceFS) != USBD_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */ + + /* USER CODE END USB_DEVICE_Init_PostTreatment */ +} + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/src/cubemx/usbd_cdc_if.c b/interface2/firmware/src/cubemx/usbd_cdc_if.c new file mode 100644 index 0000000..d433e41 --- /dev/null +++ b/interface2/firmware/src/cubemx/usbd_cdc_if.c @@ -0,0 +1,336 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usbd_cdc_if.c + * @version : v2.0_Cube + * @brief : Usb device for Virtual Com Port. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_cdc_if.h" + +/* USER CODE BEGIN INCLUDE */ + +/* USER CODE END INCLUDE */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @brief Usb device library. + * @{ + */ + +/** @addtogroup USBD_CDC_IF + * @{ + */ + +/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions + * @brief Private types. + * @{ + */ + +/* USER CODE BEGIN PRIVATE_TYPES */ + +extern void handleMessageData(const uint8_t *buffer, size_t bufferCount); + +/* USER CODE END PRIVATE_TYPES */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines + * @brief Private defines. + * @{ + */ + +/* USER CODE BEGIN PRIVATE_DEFINES */ +/* USER CODE END PRIVATE_DEFINES */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros + * @brief Private macros. + * @{ + */ + +/* USER CODE BEGIN PRIVATE_MACRO */ + +/* USER CODE END PRIVATE_MACRO */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables + * @brief Private variables. + * @{ + */ +/* Create buffer for reception and transmission */ +/* It's up to user to redefine and/or remove those define */ +/** Received data over USB are stored in this buffer */ +uint8_t UserRxBufferFS[APP_RX_DATA_SIZE]; + +/** Data to send over USB CDC are stored in this buffer */ +uint8_t UserTxBufferFS[APP_TX_DATA_SIZE]; + +/* USER CODE BEGIN PRIVATE_VARIABLES */ + +/* USER CODE END PRIVATE_VARIABLES */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables + * @brief Public variables. + * @{ + */ + +extern USBD_HandleTypeDef hUsbDeviceFS; + +/* USER CODE BEGIN EXPORTED_VARIABLES */ + +/* USER CODE END EXPORTED_VARIABLES */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes + * @brief Private functions declaration. + * @{ + */ + +static int8_t CDC_Init_FS(void); +static int8_t CDC_DeInit_FS(void); +static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length); +static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len); +static int8_t CDC_TransmitCplt_FS(uint8_t *pbuf, uint32_t *Len, uint8_t epnum); + +/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */ + +/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */ + +/** + * @} + */ + +USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = +{ + CDC_Init_FS, + CDC_DeInit_FS, + CDC_Control_FS, + CDC_Receive_FS, + CDC_TransmitCplt_FS +}; + +/* Private functions ---------------------------------------------------------*/ +/** + * @brief Initializes the CDC media low layer over the FS USB IP + * @retval USBD_OK if all operations are OK else USBD_FAIL + */ +static int8_t CDC_Init_FS(void) +{ + /* USER CODE BEGIN 3 */ + /* Set Application Buffers */ + USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0); + USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS); + return (USBD_OK); + /* USER CODE END 3 */ +} + +/** + * @brief DeInitializes the CDC media low layer + * @retval USBD_OK if all operations are OK else USBD_FAIL + */ +static int8_t CDC_DeInit_FS(void) +{ + /* USER CODE BEGIN 4 */ + return (USBD_OK); + /* USER CODE END 4 */ +} + +/** + * @brief Manage the CDC class requests + * @param cmd: Command code + * @param pbuf: Buffer containing command data (request parameters) + * @param length: Number of data to be sent (in bytes) + * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL + */ +static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length) +{ + /* USER CODE BEGIN 5 */ + switch(cmd) + { + case CDC_SEND_ENCAPSULATED_COMMAND: + + break; + + case CDC_GET_ENCAPSULATED_RESPONSE: + + break; + + case CDC_SET_COMM_FEATURE: + + break; + + case CDC_GET_COMM_FEATURE: + + break; + + case CDC_CLEAR_COMM_FEATURE: + + break; + + /*******************************************************************************/ + /* Line Coding Structure */ + /*-----------------------------------------------------------------------------*/ + /* Offset | Field | Size | Value | Description */ + /* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/ + /* 4 | bCharFormat | 1 | Number | Stop bits */ + /* 0 - 1 Stop bit */ + /* 1 - 1.5 Stop bits */ + /* 2 - 2 Stop bits */ + /* 5 | bParityType | 1 | Number | Parity */ + /* 0 - None */ + /* 1 - Odd */ + /* 2 - Even */ + /* 3 - Mark */ + /* 4 - Space */ + /* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */ + /*******************************************************************************/ + case CDC_SET_LINE_CODING: + + break; + + case CDC_GET_LINE_CODING: + + break; + + case CDC_SET_CONTROL_LINE_STATE: + + break; + + case CDC_SEND_BREAK: + + break; + + default: + break; + } + + return (USBD_OK); + /* USER CODE END 5 */ +} + +/** + * @brief Data received over USB OUT endpoint are sent over CDC interface + * through this function. + * + * @note + * This function will issue a NAK packet on any OUT packet received on + * USB endpoint until exiting this function. If you exit this function + * before transfer is complete on CDC interface (ie. using DMA controller) + * it will result in receiving more data while previous ones are still + * not sent. + * + * @param Buf: Buffer of data to be received + * @param Len: Number of data received (in bytes) + * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL + */ +static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) +{ + /* USER CODE BEGIN 6 */ + handleMessageData(Buf, *Len); + + USBD_CDC_ReceivePacket(&hUsbDeviceFS); + + return (USBD_OK); + /* USER CODE END 6 */ +} + +/** + * @brief CDC_Transmit_FS + * Data to send over USB IN endpoint are sent over CDC interface + * through this function. + * @note + * + * + * @param Buf: Buffer of data to be sent + * @param Len: Number of data to be sent (in bytes) + * @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY + */ +uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) +{ + uint8_t result = USBD_OK; + /* USER CODE BEGIN 7 */ + USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData; + if (hcdc->TxState != 0){ + return USBD_BUSY; + } + memcpy(UserTxBufferFS, Buf, Len); + USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, Len); + result = USBD_CDC_TransmitPacket(&hUsbDeviceFS); + /* USER CODE END 7 */ + return result; +} + +/** + * @brief CDC_TransmitCplt_FS + * Data transmited callback + * + * @note + * This function is IN transfer complete callback used to inform user that + * the submitted Data is successfully sent over USB. + * + * @param Buf: Buffer of data to be received + * @param Len: Number of data received (in bytes) + * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL + */ +static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum) +{ + uint8_t result = USBD_OK; + /* USER CODE BEGIN 13 */ + UNUSED(Buf); + UNUSED(Len); + UNUSED(epnum); + /* USER CODE END 13 */ + return result; +} + +/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */ + +/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/src/cubemx/usbd_conf.c b/interface2/firmware/src/cubemx/usbd_conf.c new file mode 100644 index 0000000..f8d452c --- /dev/null +++ b/interface2/firmware/src/cubemx/usbd_conf.c @@ -0,0 +1,828 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : Target/usbd_conf.c + * @version : v2.0_Cube + * @brief : This file implements the board support package for the USB device library + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l4xx.h" +#include "stm32l4xx_hal.h" +#include "usbd_def.h" +#include "usbd_core.h" +#include "usbd_cdc.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ + +PCD_HandleTypeDef hpcd_USB_FS; +void Error_Handler(void); + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* Exported function prototypes ----------------------------------------------*/ +extern USBD_StatusTypeDef USBD_LL_BatteryCharging(USBD_HandleTypeDef *pdev); + +/* USER CODE BEGIN PFP */ +/* Private function prototypes -----------------------------------------------*/ + +/* USER CODE END PFP */ + +/* Private functions ---------------------------------------------------------*/ + +/* USER CODE BEGIN 1 */ +static void SystemClockConfig_Resume(void); + +/* USER CODE END 1 */ +extern void SystemClock_Config(void); + +/******************************************************************************* + LL Driver Callbacks (PCD -> USB Device Library) +*******************************************************************************/ +/* MSP Init */ + +void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle) +{ + if(pcdHandle->Instance==USB) + { + /* USER CODE BEGIN USB_MspInit 0 */ + + /* USER CODE END USB_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USB_CLK_ENABLE(); + + /* Peripheral interrupt init */ + HAL_NVIC_SetPriority(USB_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USB_IRQn); + /* USER CODE BEGIN USB_MspInit 1 */ + + /* USER CODE END USB_MspInit 1 */ + } +} + +void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle) +{ + if(pcdHandle->Instance==USB) + { + /* USER CODE BEGIN USB_MspDeInit 0 */ + + /* USER CODE END USB_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USB_CLK_DISABLE(); + + /* Peripheral interrupt Deinit*/ + HAL_NVIC_DisableIRQ(USB_IRQn); + + /* USER CODE BEGIN USB_MspDeInit 1 */ + + /* USER CODE END USB_MspDeInit 1 */ + } +} + +/** + * @brief Setup stage callback + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_SetupStage((USBD_HandleTypeDef*)hpcd->pData, (uint8_t *)hpcd->Setup); +} + +/** + * @brief Data Out stage callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint number + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#else +void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); +} + +/** + * @brief Data In stage callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint number + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#else +void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); +} + +/** + * @brief SOF callback. + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_SOFCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_SOF((USBD_HandleTypeDef*)hpcd->pData); +} + +/** + * @brief Reset callback. + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ResetCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_SpeedTypeDef speed = USBD_SPEED_FULL; + + if ( hpcd->Init.speed != PCD_SPEED_FULL) + { + Error_Handler(); + } + /* Set Speed. */ + USBD_LL_SetSpeed((USBD_HandleTypeDef*)hpcd->pData, speed); + + /* Reset Device. */ + USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData); +} + +/** + * @brief Suspend callback. + * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + /* Inform USB library that core enters in suspend Mode. */ + USBD_LL_Suspend((USBD_HandleTypeDef*)hpcd->pData); + /* Enter in STOP mode. */ + /* USER CODE BEGIN 2 */ + if (hpcd->Init.low_power_enable) + { + /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */ + SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); + } + /* USER CODE END 2 */ +} + +/** + * @brief Resume callback. + * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + + /* USER CODE BEGIN 3 */ + if (hpcd->Init.low_power_enable) + { + /* Reset SLEEPDEEP bit of Cortex System Control Register. */ + SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); + SystemClockConfig_Resume(); + } + /* USER CODE END 3 */ + USBD_LL_Resume((USBD_HandleTypeDef*)hpcd->pData); +} + +/** + * @brief ISOOUTIncomplete callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint number + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#else +void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_IsoOUTIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum); +} + +/** + * @brief ISOINIncomplete callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint number + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#else +void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_IsoINIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum); +} + +/** + * @brief Connect callback. + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_DevConnected((USBD_HandleTypeDef*)hpcd->pData); +} + +/** + * @brief Disconnect callback. + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData); +} + +/******************************************************************************* + LL Driver Interface (USB Device Library --> PCD) +*******************************************************************************/ + +/** + * @brief Initializes the low level portion of the device driver. + * @param pdev: Device handle + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) +{ + /* Init USB Ip. */ + /* Enable USB power on Pwrctrl CR2 register. */ + HAL_PWREx_EnableVddUSB(); + /* Link the driver to the stack. */ + hpcd_USB_FS.pData = pdev; + pdev->pData = &hpcd_USB_FS; + + hpcd_USB_FS.Instance = USB; + hpcd_USB_FS.Init.dev_endpoints = 8; + hpcd_USB_FS.Init.speed = PCD_SPEED_FULL; + hpcd_USB_FS.Init.phy_itface = PCD_PHY_EMBEDDED; + hpcd_USB_FS.Init.Sof_enable = DISABLE; + hpcd_USB_FS.Init.low_power_enable = DISABLE; + hpcd_USB_FS.Init.lpm_enable = DISABLE; + hpcd_USB_FS.Init.battery_charging_enable = DISABLE; + if (HAL_PCD_Init(&hpcd_USB_FS) != HAL_OK) + { + Error_Handler( ); + } + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + /* Register USB PCD CallBacks */ + HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_SOF_CB_ID, PCD_SOFCallback); + HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_SETUPSTAGE_CB_ID, PCD_SetupStageCallback); + HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_RESET_CB_ID, PCD_ResetCallback); + HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_SUSPEND_CB_ID, PCD_SuspendCallback); + HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_RESUME_CB_ID, PCD_ResumeCallback); + HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_CONNECT_CB_ID, PCD_ConnectCallback); + HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_DISCONNECT_CB_ID, PCD_DisconnectCallback); + + HAL_PCD_RegisterDataOutStageCallback(&hpcd_USB_FS, PCD_DataOutStageCallback); + HAL_PCD_RegisterDataInStageCallback(&hpcd_USB_FS, PCD_DataInStageCallback); + HAL_PCD_RegisterIsoOutIncpltCallback(&hpcd_USB_FS, PCD_ISOOUTIncompleteCallback); + HAL_PCD_RegisterIsoInIncpltCallback(&hpcd_USB_FS, PCD_ISOINIncompleteCallback); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + /* USER CODE BEGIN EndPoint_Configuration */ + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); + /* USER CODE END EndPoint_Configuration */ + /* USER CODE BEGIN EndPoint_Configuration_CDC */ + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0xC0); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x01 , PCD_SNG_BUF, 0x110); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x82 , PCD_SNG_BUF, 0x100); + /* USER CODE END EndPoint_Configuration_CDC */ + return USBD_OK; +} + +/** + * @brief De-Initializes the low level portion of the device driver. + * @param pdev: Device handle + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_DeInit(pdev->pData); + + switch (hal_status) { + case HAL_OK : + usb_status = USBD_OK; + break; + case HAL_ERROR : + usb_status = USBD_FAIL; + break; + case HAL_BUSY : + usb_status = USBD_BUSY; + break; + case HAL_TIMEOUT : + usb_status = USBD_FAIL; + break; + default : + usb_status = USBD_FAIL; + break; + } + return usb_status; +} + +/** + * @brief Starts the low level portion of the device driver. + * @param pdev: Device handle + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_Start(pdev->pData); + + switch (hal_status) { + case HAL_OK : + usb_status = USBD_OK; + break; + case HAL_ERROR : + usb_status = USBD_FAIL; + break; + case HAL_BUSY : + usb_status = USBD_BUSY; + break; + case HAL_TIMEOUT : + usb_status = USBD_FAIL; + break; + default : + usb_status = USBD_FAIL; + break; + } + return usb_status; +} + +/** + * @brief Stops the low level portion of the device driver. + * @param pdev: Device handle + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_Stop(pdev->pData); + + switch (hal_status) { + case HAL_OK : + usb_status = USBD_OK; + break; + case HAL_ERROR : + usb_status = USBD_FAIL; + break; + case HAL_BUSY : + usb_status = USBD_BUSY; + break; + case HAL_TIMEOUT : + usb_status = USBD_FAIL; + break; + default : + usb_status = USBD_FAIL; + break; + } + return usb_status; +} + +/** + * @brief Opens an endpoint of the low level driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @param ep_type: Endpoint type + * @param ep_mps: Endpoint max packet size + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type); + + switch (hal_status) { + case HAL_OK : + usb_status = USBD_OK; + break; + case HAL_ERROR : + usb_status = USBD_FAIL; + break; + case HAL_BUSY : + usb_status = USBD_BUSY; + break; + case HAL_TIMEOUT : + usb_status = USBD_FAIL; + break; + default : + usb_status = USBD_FAIL; + break; + } + return usb_status; +} + +/** + * @brief Closes an endpoint of the low level driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_EP_Close(pdev->pData, ep_addr); + + switch (hal_status) { + case HAL_OK : + usb_status = USBD_OK; + break; + case HAL_ERROR : + usb_status = USBD_FAIL; + break; + case HAL_BUSY : + usb_status = USBD_BUSY; + break; + case HAL_TIMEOUT : + usb_status = USBD_FAIL; + break; + default : + usb_status = USBD_FAIL; + break; + } + return usb_status; +} + +/** + * @brief Flushes an endpoint of the Low Level Driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_EP_Flush(pdev->pData, ep_addr); + + switch (hal_status) { + case HAL_OK : + usb_status = USBD_OK; + break; + case HAL_ERROR : + usb_status = USBD_FAIL; + break; + case HAL_BUSY : + usb_status = USBD_BUSY; + break; + case HAL_TIMEOUT : + usb_status = USBD_FAIL; + break; + default : + usb_status = USBD_FAIL; + break; + } + return usb_status; +} + +/** + * @brief Sets a Stall condition on an endpoint of the Low Level Driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_EP_SetStall(pdev->pData, ep_addr); + + switch (hal_status) { + case HAL_OK : + usb_status = USBD_OK; + break; + case HAL_ERROR : + usb_status = USBD_FAIL; + break; + case HAL_BUSY : + usb_status = USBD_BUSY; + break; + case HAL_TIMEOUT : + usb_status = USBD_FAIL; + break; + default : + usb_status = USBD_FAIL; + break; + } + return usb_status; +} + +/** + * @brief Clears a Stall condition on an endpoint of the Low Level Driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_EP_ClrStall(pdev->pData, ep_addr); + + switch (hal_status) { + case HAL_OK : + usb_status = USBD_OK; + break; + case HAL_ERROR : + usb_status = USBD_FAIL; + break; + case HAL_BUSY : + usb_status = USBD_BUSY; + break; + case HAL_TIMEOUT : + usb_status = USBD_FAIL; + break; + default : + usb_status = USBD_FAIL; + break; + } + return usb_status; +} + +/** + * @brief Returns Stall condition. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @retval Stall (1: Yes, 0: No) + */ +uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef*) pdev->pData; + + if((ep_addr & 0x80) == 0x80) + { + return hpcd->IN_ep[ep_addr & 0x7F].is_stall; + } + else + { + return hpcd->OUT_ep[ep_addr & 0x7F].is_stall; + } +} + +/** + * @brief Assigns a USB address to the device. + * @param pdev: Device handle + * @param dev_addr: Device address + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_SetAddress(pdev->pData, dev_addr); + + switch (hal_status) { + case HAL_OK : + usb_status = USBD_OK; + break; + case HAL_ERROR : + usb_status = USBD_FAIL; + break; + case HAL_BUSY : + usb_status = USBD_BUSY; + break; + case HAL_TIMEOUT : + usb_status = USBD_FAIL; + break; + default : + usb_status = USBD_FAIL; + break; + } + return usb_status; +} + +/** + * @brief Transmits data over an endpoint. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @param pbuf: Pointer to data to be sent + * @param size: Data size + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size); + + switch (hal_status) { + case HAL_OK : + usb_status = USBD_OK; + break; + case HAL_ERROR : + usb_status = USBD_FAIL; + break; + case HAL_BUSY : + usb_status = USBD_BUSY; + break; + case HAL_TIMEOUT : + usb_status = USBD_FAIL; + break; + default : + usb_status = USBD_FAIL; + break; + } + return usb_status; +} + +/** + * @brief Prepares an endpoint for reception. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @param pbuf: Pointer to data to be received + * @param size: Data size + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size); + + switch (hal_status) { + case HAL_OK : + usb_status = USBD_OK; + break; + case HAL_ERROR : + usb_status = USBD_FAIL; + break; + case HAL_BUSY : + usb_status = USBD_BUSY; + break; + case HAL_TIMEOUT : + usb_status = USBD_FAIL; + break; + default : + usb_status = USBD_FAIL; + break; + } + return usb_status; +} + +/** + * @brief Returns the last transfered packet size. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @retval Recived Data Size + */ +uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + return HAL_PCD_EP_GetRxCount((PCD_HandleTypeDef*) pdev->pData, ep_addr); +} + +/** + * @brief Send LPM message to user layer + * @param hpcd: PCD handle + * @param msg: LPM message + * @retval None + */ +void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg) +{ + switch (msg) + { + case PCD_LPM_L0_ACTIVE: + if (hpcd->Init.low_power_enable) + { + SystemClockConfig_Resume(); + + /* Reset SLEEPDEEP bit of Cortex System Control Register. */ + SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); + } + USBD_LL_Resume(hpcd->pData); + break; + + case PCD_LPM_L1_ACTIVE: + USBD_LL_Suspend(hpcd->pData); + + /* Enter in STOP mode. */ + if (hpcd->Init.low_power_enable) + { + /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */ + SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); + } + break; + } +} + +/** + * @brief Delays routine for the USB Device Library. + * @param Delay: Delay in ms + * @retval None + */ +void USBD_LL_Delay(uint32_t Delay) +{ + HAL_Delay(Delay); +} + +/** + * @brief Static single allocation. + * @param size: Size of allocated memory + * @retval None + */ +void *USBD_static_malloc(uint32_t size) +{ + static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef)/4)+1];/* On 32-bit boundary */ + return mem; +} + +/** + * @brief Dummy memory free + * @param p: Pointer to allocated memory address + * @retval None + */ +void USBD_static_free(void *p) +{ + +} + +/* USER CODE BEGIN 5 */ +/** + * @brief Configures system clock after wake-up from USB resume callBack: + * enable HSI, PLL and select PLL as system clock source. + * @retval None + */ +static void SystemClockConfig_Resume(void) +{ + SystemClock_Config(); +} +/* USER CODE END 5 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/src/cubemx/usbd_desc.c b/interface2/firmware/src/cubemx/usbd_desc.c new file mode 100644 index 0000000..5108e47 --- /dev/null +++ b/interface2/firmware/src/cubemx/usbd_desc.c @@ -0,0 +1,445 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : App/usbd_desc.c + * @version : v2.0_Cube + * @brief : This file implements the USB device descriptors. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_conf.h" + +/* USER CODE BEGIN INCLUDE */ + +/* USER CODE END INCLUDE */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @addtogroup USBD_DESC + * @{ + */ + +/** @defgroup USBD_DESC_Private_TypesDefinitions USBD_DESC_Private_TypesDefinitions + * @brief Private types. + * @{ + */ + +/* USER CODE BEGIN PRIVATE_TYPES */ + +/* USER CODE END PRIVATE_TYPES */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Private_Defines USBD_DESC_Private_Defines + * @brief Private defines. + * @{ + */ + +#define USBD_VID 1155 +#define USBD_LANGID_STRING 1033 +#define USBD_MANUFACTURER_STRING "STMicroelectronics" +#define USBD_PID_FS 22336 +#define USBD_PRODUCT_STRING_FS "STM32 Virtual ComPort" +#define USBD_CONFIGURATION_STRING_FS "CDC Config" +#define USBD_INTERFACE_STRING_FS "CDC Interface" + +#define USB_SIZ_BOS_DESC 0x0C + +/* USER CODE BEGIN PRIVATE_DEFINES */ + +/* USER CODE END PRIVATE_DEFINES */ + +/** + * @} + */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** @defgroup USBD_DESC_Private_Macros USBD_DESC_Private_Macros + * @brief Private macros. + * @{ + */ + +/* USER CODE BEGIN PRIVATE_MACRO */ + +/* USER CODE END PRIVATE_MACRO */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes + * @brief Private functions declaration. + * @{ + */ + +static void Get_SerialNum(void); +static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len); + +/** + * @} + */ + +/** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes + * @brief Private functions declaration for FS. + * @{ + */ + +uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +#if (USBD_LPM_ENABLED == 1) +uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +#endif /* (USBD_LPM_ENABLED == 1) */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables + * @brief Private variables. + * @{ + */ + +USBD_DescriptorsTypeDef FS_Desc = +{ + USBD_FS_DeviceDescriptor +, USBD_FS_LangIDStrDescriptor +, USBD_FS_ManufacturerStrDescriptor +, USBD_FS_ProductStrDescriptor +, USBD_FS_SerialStrDescriptor +, USBD_FS_ConfigStrDescriptor +, USBD_FS_InterfaceStrDescriptor +#if (USBD_LPM_ENABLED == 1) +, USBD_FS_USR_BOSDescriptor +#endif /* (USBD_LPM_ENABLED == 1) */ +}; + +#if defined ( __ICCARM__ ) /* IAR Compiler */ + #pragma data_alignment=4 +#endif /* defined ( __ICCARM__ ) */ +/** USB standard device descriptor. */ +__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = +{ + 0x12, /*bLength */ + USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ +#if (USBD_LPM_ENABLED == 1) + 0x01, /*bcdUSB */ /* changed to USB version 2.01 + in order to support LPM L1 suspend + resume test of USBCV3.0*/ +#else + 0x00, /*bcdUSB */ +#endif /* (USBD_LPM_ENABLED == 1) */ + 0x02, + 0x02, /*bDeviceClass*/ + 0x02, /*bDeviceSubClass*/ + 0x00, /*bDeviceProtocol*/ + USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ + LOBYTE(USBD_VID), /*idVendor*/ + HIBYTE(USBD_VID), /*idVendor*/ + LOBYTE(USBD_PID_FS), /*idProduct*/ + HIBYTE(USBD_PID_FS), /*idProduct*/ + 0x00, /*bcdDevice rel. 2.00*/ + 0x02, + USBD_IDX_MFC_STR, /*Index of manufacturer string*/ + USBD_IDX_PRODUCT_STR, /*Index of product string*/ + USBD_IDX_SERIAL_STR, /*Index of serial number string*/ + USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/ +}; + +/* USB_DeviceDescriptor */ +/** BOS descriptor. */ +#if (USBD_LPM_ENABLED == 1) +#if defined ( __ICCARM__ ) /* IAR Compiler */ + #pragma data_alignment=4 +#endif /* defined ( __ICCARM__ ) */ +__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END = +{ + 0x5, + USB_DESC_TYPE_BOS, + 0xC, + 0x0, + 0x1, /* 1 device capability*/ + /* device capability*/ + 0x7, + USB_DEVICE_CAPABITY_TYPE, + 0x2, + 0x2, /* LPM capability bit set*/ + 0x0, + 0x0, + 0x0 +}; +#endif /* (USBD_LPM_ENABLED == 1) */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables + * @brief Private variables. + * @{ + */ + +#if defined ( __ICCARM__ ) /* IAR Compiler */ + #pragma data_alignment=4 +#endif /* defined ( __ICCARM__ ) */ + +/** USB lang indentifier descriptor. */ +__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END = +{ + USB_LEN_LANGID_STR_DESC, + USB_DESC_TYPE_STRING, + LOBYTE(USBD_LANGID_STRING), + HIBYTE(USBD_LANGID_STRING) +}; + +#if defined ( __ICCARM__ ) /* IAR Compiler */ + #pragma data_alignment=4 +#endif /* defined ( __ICCARM__ ) */ +/* Internal string descriptor. */ +__ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END; + +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 +#endif +__ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] __ALIGN_END = { + USB_SIZ_STRING_SERIAL, + USB_DESC_TYPE_STRING, +}; + +/** + * @} + */ + +/** @defgroup USBD_DESC_Private_Functions USBD_DESC_Private_Functions + * @brief Private functions. + * @{ + */ + +/** + * @brief Return the device descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(USBD_FS_DeviceDesc); + return USBD_FS_DeviceDesc; +} + +/** + * @brief Return the LangID string descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(USBD_LangIDDesc); + return USBD_LangIDDesc; +} + +/** + * @brief Return the product string descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + if(speed == 0) + { + USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); + } + else + { + USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); + } + return USBD_StrDesc; +} + +/** + * @brief Return the manufacturer string descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** + * @brief Return the serial number string descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = USB_SIZ_STRING_SERIAL; + + /* Update the serial number string descriptor with the data from the unique + * ID */ + Get_SerialNum(); + /* USER CODE BEGIN USBD_FS_SerialStrDescriptor */ + + /* USER CODE END USBD_FS_SerialStrDescriptor */ + return (uint8_t *) USBD_StringSerial; +} + +/** + * @brief Return the configuration string descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + if(speed == USBD_SPEED_HIGH) + { + USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); + } + else + { + USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); + } + return USBD_StrDesc; +} + +/** + * @brief Return the interface string descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + if(speed == 0) + { + USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); + } + else + { + USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); + } + return USBD_StrDesc; +} + +#if (USBD_LPM_ENABLED == 1) +/** + * @brief Return the BOS descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(USBD_FS_BOSDesc); + return (uint8_t*)USBD_FS_BOSDesc; +} +#endif /* (USBD_LPM_ENABLED == 1) */ + +/** + * @brief Create the serial number string descriptor + * @param None + * @retval None + */ +static void Get_SerialNum(void) +{ + uint32_t deviceserial0, deviceserial1, deviceserial2; + + deviceserial0 = *(uint32_t *) DEVICE_ID1; + deviceserial1 = *(uint32_t *) DEVICE_ID2; + deviceserial2 = *(uint32_t *) DEVICE_ID3; + + deviceserial0 += deviceserial2; + + if (deviceserial0 != 0) + { + IntToUnicode(deviceserial0, &USBD_StringSerial[2], 8); + IntToUnicode(deviceserial1, &USBD_StringSerial[18], 4); + } +} + +/** + * @brief Convert Hex 32Bits value into char + * @param value: value to convert + * @param pbuf: pointer to the buffer + * @param len: buffer length + * @retval None + */ +static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len) +{ + uint8_t idx = 0; + + for (idx = 0; idx < len; idx++) + { + if (((value >> 28)) < 0xA) + { + pbuf[2 * idx] = (value >> 28) + '0'; + } + else + { + pbuf[2 * idx] = (value >> 28) + 'A' - 10; + } + + value = value << 4; + + pbuf[2 * idx + 1] = 0; + } +} +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/interface2/firmware/src/debug.cpp b/interface2/firmware/src/debug.cpp new file mode 100644 index 0000000..5d3114d --- /dev/null +++ b/interface2/firmware/src/debug.cpp @@ -0,0 +1,142 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#include +#include + +#include "stm32l4xx_hal.h" + +#include "pins.h" + +#include "debug.h" + +UART_HandleTypeDef huart1; + +bool Debug::init() +{ + // Configure UART. + huart1.Instance = USART1; + + huart1.Init.BaudRate = 115200; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + + huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + + if (HAL_UART_Init(&huart1) != HAL_OK) { + return false; + } + + // Configure GPIO. + __HAL_RCC_GPIOB_CLK_ENABLE(); + + HAL_GPIO_WritePin(GPIOB, GPIO0_Pin | GPIO1_Pin, GPIO_PIN_RESET); + + GPIO_InitTypeDef gpioInit = { 0 }; + + gpioInit.Pin = GPIO0_Pin | GPIO1_Pin; + gpioInit.Mode = GPIO_MODE_OUTPUT_PP; + gpioInit.Pull = GPIO_NOPULL; + gpioInit.Speed = GPIO_SPEED_FREQ_LOW; + + HAL_GPIO_Init(GPIOB, &gpioInit); + + // Set initial GPIO state. + HAL_GPIO_WritePin(GPIOB, GPIO0_Pin | GPIO1_Pin, GPIO_PIN_RESET); + + return true; +} + +void Debug::banner() +{ + printf("\r\n"); + printf("****** Coax\r\n"); + printf(" **** Build " FIRMWARE_BUILD_WHAT " by " FIRMWARE_BUILD_WHO " on " FIRMWARE_BUILD_WHEN "\r\n"); + printf(" **\r\n"); +} + +void Debug::setMarker(int marker) +{ + if (marker == 0) { + HAL_GPIO_WritePin(GPIOB, GPIO0_Pin, GPIO_PIN_SET); + } else if (marker == 1) { + HAL_GPIO_WritePin(GPIOB, GPIO1_Pin, GPIO_PIN_SET); + } +} + +void Debug::resetMarker(int marker) +{ + if (marker == 0) { + HAL_GPIO_WritePin(GPIOB, GPIO0_Pin, GPIO_PIN_RESET); + } else if (marker == 1) { + HAL_GPIO_WritePin(GPIOB, GPIO1_Pin, GPIO_PIN_RESET); + } +} + +void Debug::trap(int number) +{ + printf("%lu TRAP[%d]\r\n", HAL_GetTick(), number); +} + +void Debug::trap(int number, const char *format, ...) +{ + printf("%lu TRAP[%d] ", HAL_GetTick(), number); + + va_list args; + + va_start(args, format); + vprintf(format, args); + va_end(args); + + printf("\r\n"); +} + +extern "C" void HAL_UART_MspInit(UART_HandleTypeDef *uartHandle) +{ + GPIO_InitTypeDef gpioInit = { 0 }; + + if (uartHandle->Instance == USART1) { + __HAL_RCC_USART1_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + gpioInit.Pin = GPIO_PIN_9 | GPIO_PIN_10; + gpioInit.Mode = GPIO_MODE_AF_PP; + gpioInit.Pull = GPIO_NOPULL; + gpioInit.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + gpioInit.Alternate = GPIO_AF7_USART1; + + HAL_GPIO_Init(GPIOA, &gpioInit); + } +} + +extern "C" void HAL_UART_MspDeInit(UART_HandleTypeDef *uartHandle) +{ + if (uartHandle->Instance == USART1) { + __HAL_RCC_USART1_CLK_DISABLE(); + + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9 | GPIO_PIN_10); + } +} + +extern "C" int _write(int file, char *ptr, int len) +{ + HAL_UART_Transmit(&huart1, reinterpret_cast(ptr), len, 100); + + return len; +} diff --git a/interface2/firmware/src/ice40.cpp b/interface2/firmware/src/ice40.cpp new file mode 100644 index 0000000..8bc0f5c --- /dev/null +++ b/interface2/firmware/src/ice40.cpp @@ -0,0 +1,113 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#include "pins.h" + +#include "ice40.h" + +ICE40::ICE40() +{ + _isConfigured = false; +} + +inline void clock() +{ + LL_GPIO_ResetOutputPin(ICE40_SCK_GPIO_Port, ICE40_SCK_Pin); + + for (int index = 0; index < 4; index++) { + asm volatile("nop\n\t"); + } + + LL_GPIO_SetOutputPin(ICE40_SCK_GPIO_Port, ICE40_SCK_Pin); +} + +bool ICE40::configure(const uint8_t *bitstream, size_t bitstreamCount) +{ + _isConfigured = false; + + // Configure GPIO. + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + HAL_GPIO_WritePin(GPIOA, ICE40_CS_Pin | ICE40_SCK_Pin | ICE40_SDI_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOB, ICE40_CRESET_Pin, GPIO_PIN_RESET); + + GPIO_InitTypeDef gpioInit = { 0 }; + + gpioInit.Pin = ICE40_CS_Pin | ICE40_SCK_Pin | ICE40_SDI_Pin; + gpioInit.Mode = GPIO_MODE_OUTPUT_PP; + gpioInit.Pull = GPIO_NOPULL; + gpioInit.Speed = GPIO_SPEED_FREQ_LOW; + + HAL_GPIO_Init(GPIOA, &gpioInit); + + gpioInit.Pin = ICE40_CRESET_Pin; + gpioInit.Mode = GPIO_MODE_OUTPUT_PP; + gpioInit.Pull = GPIO_NOPULL; + gpioInit.Speed = GPIO_SPEED_FREQ_LOW; + + HAL_GPIO_Init(GPIOB, &gpioInit); + + gpioInit.Pin = ICE40_CDONE_Pin; + gpioInit.Mode = GPIO_MODE_INPUT; + gpioInit.Pull = GPIO_NOPULL; + + HAL_GPIO_Init(GPIOB, &gpioInit); + + // Set initial GPIO state. + HAL_GPIO_WritePin(ICE40_CS_GPIO_Port, ICE40_CS_Pin | ICE40_SCK_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(ICE40_CRESET_GPIO_Port, ICE40_CRESET_Pin, GPIO_PIN_SET); + + // Assert CS and reset. + HAL_GPIO_WritePin(ICE40_CS_GPIO_Port, ICE40_CS_Pin, GPIO_PIN_RESET); + + HAL_GPIO_WritePin(ICE40_CRESET_GPIO_Port, ICE40_CRESET_Pin, GPIO_PIN_RESET); + + HAL_Delay(1); + + HAL_GPIO_WritePin(ICE40_CRESET_GPIO_Port, ICE40_CRESET_Pin, GPIO_PIN_SET); + + HAL_Delay(1); + + // Send the bitstream. + for (size_t index = 0; index < bitstreamCount; index++) { + uint8_t byte = bitstream[index]; + + for (int bitIndex = 7; bitIndex >= 0; bitIndex--) { + if ((byte >> bitIndex) & 0x01) { + LL_GPIO_SetOutputPin(ICE40_SDI_GPIO_Port, ICE40_SDI_Pin); + } else { + LL_GPIO_ResetOutputPin(ICE40_SDI_GPIO_Port, ICE40_SDI_Pin); + } + + clock(); + } + } + + // Check done. + bool done = LL_GPIO_IsInputPinSet(ICE40_CDONE_GPIO_Port, ICE40_CDONE_Pin); + + if (done) { + for (int index = 0; index < 49; index++) { + clock(); + } + } + + // Deassert CS. + HAL_GPIO_WritePin(ICE40_CS_GPIO_Port, ICE40_CS_Pin, GPIO_PIN_SET); + + _isConfigured = done; + + return _isConfigured; +} diff --git a/interface2/firmware/src/indicators.cpp b/interface2/firmware/src/indicators.cpp new file mode 100644 index 0000000..5dec337 --- /dev/null +++ b/interface2/firmware/src/indicators.cpp @@ -0,0 +1,113 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#include "pins.h" + +#include "indicators.h" + +#define LED_GPIO_Port GPIOB + +Indicators::Indicators() +{ + _status = INDICATORS_STATUS_UNKNOWN; + + _txState = 0; + _rxState = 0; + _errorState = 0; +} + +void Indicators::init() +{ + // Configure GPIO. + __HAL_RCC_GPIOB_CLK_ENABLE(); + + HAL_GPIO_WritePin(LED_GPIO_Port, LED_STATUS_Pin | LED_TX_Pin | LED_RX_Pin | LED_ERROR_Pin, GPIO_PIN_RESET); + + GPIO_InitTypeDef gpioInit = { 0 }; + + gpioInit.Pin = LED_STATUS_Pin | LED_TX_Pin | LED_RX_Pin | LED_ERROR_Pin; + gpioInit.Mode = GPIO_MODE_OUTPUT_PP; + gpioInit.Pull = GPIO_NOPULL; + gpioInit.Speed = GPIO_SPEED_FREQ_LOW; + + HAL_GPIO_Init(LED_GPIO_Port, &gpioInit); + + // Set initial GPIO state. + HAL_GPIO_WritePin(LED_GPIO_Port, LED_STATUS_Pin | LED_TX_Pin | LED_RX_Pin | LED_ERROR_Pin, GPIO_PIN_SET); +} + +void Indicators::setStatus(IndicatorsStatus status) +{ + _status = status; + + if (_status == INDICATORS_STATUS_CONFIGURING) { + HAL_GPIO_WritePin(LED_GPIO_Port, LED_STATUS_Pin, GPIO_PIN_SET); + + HAL_GPIO_WritePin(LED_GPIO_Port, LED_TX_Pin | LED_RX_Pin | LED_ERROR_Pin, GPIO_PIN_RESET); + } else if (_status == INDICATORS_STATUS_RUNNING) { + HAL_GPIO_WritePin(LED_GPIO_Port, LED_STATUS_Pin, GPIO_PIN_SET); + } +} + +void Indicators::tx() +{ + if (_txState == 0) { + _txState = 2; + } +} + +void Indicators::rx() +{ + if (_rxState == 0) { + _rxState = 2; + } +} + +void Indicators::error() +{ + if (_errorState == 0) { + _errorState = 2; + } +} + +void Indicators::update() +{ + if (_status == INDICATORS_STATUS_CONFIGURING) { + HAL_GPIO_TogglePin(LED_GPIO_Port, LED_STATUS_Pin); + } + + if (_txState > 0) { + HAL_GPIO_WritePin(LED_GPIO_Port, LED_TX_Pin, _txState == 2 ? GPIO_PIN_SET : GPIO_PIN_RESET); + + _txState--; + } else { + HAL_GPIO_WritePin(LED_GPIO_Port, LED_TX_Pin, GPIO_PIN_RESET); + } + + if (_rxState > 0) { + HAL_GPIO_WritePin(LED_GPIO_Port, LED_RX_Pin, _rxState == 2 ? GPIO_PIN_SET : GPIO_PIN_RESET); + + _rxState--; + } else { + HAL_GPIO_WritePin(LED_GPIO_Port, LED_RX_Pin, GPIO_PIN_RESET); + } + + if (_errorState > 0) { + HAL_GPIO_WritePin(LED_GPIO_Port, LED_ERROR_Pin, _errorState == 2 ? GPIO_PIN_SET : GPIO_PIN_RESET); + + _errorState--; + } else { + HAL_GPIO_WritePin(LED_GPIO_Port, LED_ERROR_Pin, GPIO_PIN_RESET); + } +} diff --git a/interface2/firmware/src/interface.cpp b/interface2/firmware/src/interface.cpp new file mode 100644 index 0000000..5184b1d --- /dev/null +++ b/interface2/firmware/src/interface.cpp @@ -0,0 +1,279 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#include +#include + +#include + +#include "stm32l4xx_hal.h" + +#include "config.h" +#include "coax.h" +#include "indicators.h" +#include "message.h" +#include "debug.h" +#include "version.h" + +#include "interface.h" + +void sendErrorMessage(uint8_t code, const char *description) +{ + uint8_t message[2 + 62 + 1] = { 0x02, code }; + size_t count = 2; + + if (description != NULL) { + strncpy(reinterpret_cast(message + 2), description, 62); + + count += strlen(description); + } + + MessageSender::send(message, count); +} + +Interface::Interface(Coax &coax, Indicators &indicators) : + _coax(coax), + _indicators(indicators) +{ +} + +void Interface::handleMessage(uint8_t *buffer, size_t bufferCount) +{ + if (bufferCount < 4) { + sendErrorMessage(ERROR_INVALID_MESSAGE, "HANDLE_MESSAGE_BUFFER_COUNT_4"); + return; + } + + size_t count = (buffer[0] << 8) | buffer[1]; + + if (bufferCount - 4 != count) { + sendErrorMessage(ERROR_INVALID_MESSAGE, "HANDLE_MESSAGE_BUFFER_COUNT_MISMATCH"); + return; + } + + if (count < 1) { + sendErrorMessage(ERROR_INVALID_MESSAGE, "HANDLE_COMMAND_BUFFER_COUNT_1"); + return; + } + + uint8_t command = buffer[2]; + + if (command == COMMAND_RESET) { + handleReset(buffer + 3, count - 1); + } else if (command == COMMAND_TRANSMIT_RECEIVE) { + Debug::setMarker(0); + handleTransmitReceive(buffer + 3, count - 1); + Debug::resetMarker(0); + } else if (command == COMMAND_INFO) { + handleInfo(buffer + 3, count - 1); + } else if (command == COMMAND_TEST) { + handleTest(buffer + 3, count - 1); + } else if (command == COMMAND_DFU) { + handleDFU(buffer + 3, count - 1); + } else { + sendErrorMessage(ERROR_UNKNOWN_COMMAND, NULL); + } +} + +void Interface::handleError(MessageReceiverError error) +{ + if (error == MESSAGE_RECEIVER_ERROR_TIMEOUT) { + sendErrorMessage(ERROR_MESSAGE_TIMEOUT, NULL); + } else { + Debug::trap(401, "error = %d", error); + } +} + +void Interface::handleReset(uint8_t *buffer, size_t bufferCount) +{ + _coax.reset(); + + uint8_t response[] = { 0x01, 0x32, 0x70 }; + + MessageSender::send(response, 3); +} + +void Interface::handleTransmitReceive(uint8_t *buffer, size_t bufferCount) +{ + if (bufferCount < 6) { + sendErrorMessage(ERROR_INVALID_MESSAGE, "HANDLE_TXRX_BUFFER_COUNT_6"); + return; + } + + uint16_t *transmitBuffer = reinterpret_cast(buffer + 2); + uint16_t transmitBufferCount = (bufferCount - 6) / 2; + + uint16_t transmitRepeatCount = ((buffer[0] << 8) | buffer[1]) & 0x7fff; + uint16_t transmitRepeatOffset = buffer[0] >> 7; + + uint16_t receiveBufferSize = (buffer[bufferCount - 4] << 8) | buffer[bufferCount - 3]; + uint16_t receiveTimeout = (buffer[bufferCount - 2] << 8) | buffer[bufferCount - 1]; + + if (transmitBufferCount < 1) { + sendErrorMessage(ERROR_INVALID_MESSAGE, "HANDLE_TXRX_TX_BUFFER_COUNT_1"); + return; + } + + // Expand the provided data if applicable. + if (transmitRepeatCount > 1) { + uint8_t *source = reinterpret_cast(transmitBuffer) + (transmitRepeatOffset * 2); + uint8_t *destination = reinterpret_cast(transmitBuffer) + (transmitBufferCount * 2); + + uint16_t sourceCount = transmitBufferCount - transmitRepeatOffset; + + size_t length = sourceCount * 2; + + for (int index = 1; index < transmitRepeatCount; index++) { + memcpy(destination, source, length); + + transmitBufferCount += sourceCount; + + destination += length; + } + } + + int transmitCount = _coax.transmit(transmitBuffer, transmitBufferCount); + + if (transmitCount < 0) { + Debug::trap(402, "error = %d", transmitCount); + + _indicators.error(); + + // Convert the error to legacy interface error for compatability. + if (transmitCount == COAX_ERROR_TX_RECEIVER_ACTIVE) { + sendErrorMessage(101, NULL); + } else { + sendErrorMessage(105, NULL); + } + + return; + } + + _indicators.tx(); + + uint16_t *receiveBuffer = reinterpret_cast(buffer + 2); + + int receiveCount = _coax.receive(receiveBuffer, receiveBufferSize, receiveTimeout); + + if (receiveCount < 0) { + Debug::trap(403, "error = %d", receiveCount); + + _indicators.error(); + + // Convert the error to legacy interface error for compatability. + if (receiveCount == COAX_ERROR_RX_LOSS_OF_MID_BIT_TRANSITION) { + sendErrorMessage(104, "Loss of mid bit transition"); + } else if (receiveCount == COAX_ERROR_RX_PARITY) { + sendErrorMessage(104, "Parity error"); + } else if (receiveCount == COAX_ERROR_RX_INVALID_END_SEQUENCE) { + sendErrorMessage(104, "Invalid end sequence"); + } else { + sendErrorMessage(104, NULL); + } + + return; + } + + // Convert timeout to legacy interface error for compatability. + if (receiveCount == 0) { + sendErrorMessage(102, NULL); + return; + } + + _indicators.rx(); + + // Send the response message. + buffer[1] = 0x01; + + MessageSender::send(buffer + 1, 1 + (receiveCount * 2)); +} + +void Interface::handleInfo(uint8_t *buffer, size_t bufferCount) +{ + if (bufferCount < 1) { + sendErrorMessage(ERROR_INVALID_MESSAGE, "HANDLE_INFO_BUFFER_COUNT_1"); + return; + } + + uint8_t query = buffer[0]; + + if (query == INFO_SUPPORTED_QUERIES) { + buffer[0] = 0x01; + buffer[1] = INFO_SUPPORTED_QUERIES; + buffer[2] = INFO_HARDWARE_TYPE; + buffer[3] = INFO_FIRMWARE_VERSION; + buffer[4] = INFO_MESSAGE_BUFFER_SIZE; + + MessageSender::send(buffer, 5); + } else if (query == INFO_HARDWARE_TYPE) { + buffer[0] = 0x01; + + int length = snprintf(reinterpret_cast(buffer + 1), 64, "interface2"); + + MessageSender::send(buffer, length + 1); + } else if (query == INFO_FIRMWARE_VERSION) { + buffer[0] = 0x01; + + int length = snprintf(reinterpret_cast(buffer + 1), 64, + "%d.%d.%d (build %s)", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, + FIRMWARE_BUILD_WHAT); + + MessageSender::send(buffer, length + 1); + } else if (query == INFO_MESSAGE_BUFFER_SIZE) { + buffer[0] = 0x01; + + uint32_t size = __htonl(MESSAGE_BUFFER_SIZE); + + memcpy(buffer + 1, &size, sizeof(uint32_t)); + + MessageSender::send(buffer, 5); + } else { + sendErrorMessage(ERROR_INVALID_MESSAGE, "HANDLE_INFO_UNKNOWN_QUERY"); + return; + } +} + +void Interface::handleTest(uint8_t *buffer, size_t bufferCount) +{ + if (bufferCount < 1) { + sendErrorMessage(ERROR_INVALID_MESSAGE, "HANDLE_TEST_BUFFER_COUNT_1"); + return; + } + + uint8_t test = buffer[0]; + + if (test == TEST_SUPPORTED_TESTS) { + buffer[0] = 0x01; + buffer[1] = TEST_SUPPORTED_TESTS; + + MessageSender::send(buffer, 2); + } else { + sendErrorMessage(ERROR_INVALID_MESSAGE, "HANDLE_TEST_UNKNOWN_TEST"); + return; + } +} + +extern void resetToBootloader(); + +void Interface::handleDFU(uint8_t *buffer, size_t bufferCount) +{ + buffer[0] = 0x01; + + MessageSender::send(buffer, 1); + + // Wait before resetting to allow the response to be sent. + HAL_Delay(1000); + + resetToBootloader(); +} diff --git a/interface2/firmware/src/main.cpp b/interface2/firmware/src/main.cpp new file mode 100644 index 0000000..4bcb21d --- /dev/null +++ b/interface2/firmware/src/main.cpp @@ -0,0 +1,209 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#include +#include +#include + +#include "tim.h" +#include "usb_device.h" + +#include "pins.h" +#include "config.h" +#include "indicators.h" +#include "ice40.h" +#include "coax.h" +#include "message.h" +#include "interface.h" +#include "debug.h" + +void handleMessage(const uint8_t *, size_t); +void handleMessageReceiverError(MessageReceiverError); + +extern "C" void SystemClock_Config(); + +Indicators indicators; + +const uint8_t ice40Bitstream[] = { +#include "bitstream.inc" +}; + +ICE40 ice40; + +SPICoaxTransceiver spiCoaxTransceiver; + +volatile uint16_t coaxBuffer[COAX_BUFFER_SIZE]; + +Coax coax(spiCoaxTransceiver, CoaxParity::Even, coaxBuffer, COAX_BUFFER_SIZE); + +volatile uint8_t messageBuffer[MESSAGE_BUFFER_SIZE]; + +MessageReceiver messageReceiver(messageBuffer, MESSAGE_BUFFER_SIZE, handleMessage, + handleMessageReceiverError); + +Interface interface(coax, indicators); + +int main(void) +{ + HAL_Init(); + + SystemClock_Config(); + + // Initialize the debug UART and GPIO devices. + Debug::init(); + + Debug::banner(); + + // Initialize the USB CDC device. + printf("\r\nInitializing USB CDC device..."); + + MX_USB_DEVICE_Init(); + + printf(" done.\r\n"); + + // Initialize the indicators. + MX_TIM6_Init(); + + indicators.init(); + + HAL_Delay(500); + + HAL_TIM_Base_Start_IT(&htim6); + + indicators.setStatus(INDICATORS_STATUS_CONFIGURING); + + // Configure the iCE40 FPGA. + printf("Configuring iCE40 FPGA..."); + + while (!ice40.configure(ice40Bitstream, sizeof(ice40Bitstream))) { + indicators.error(); + + HAL_Delay(1000); + } + + printf(" done.\r\n"); + + // Initialize the coax module. + printf("Initializing coax module..."); + + while (!coax.init()) { + indicators.error(); + + HAL_Delay(1000); + } + + printf(" done.\r\n"); + + HAL_Delay(500); + + indicators.setStatus(INDICATORS_STATUS_RUNNING); + + printf("\r\nREADY.\r\n"); + + while (true) { + messageReceiver.dispatch(); + } +} + +extern "C" void handleMessageData(const uint8_t *buffer, size_t bufferCount) +{ + messageReceiver.load(buffer, bufferCount); +} + +void handleMessage(const uint8_t *buffer, size_t bufferCount) +{ + interface.handleMessage(const_cast(buffer), bufferCount); +} + +void handleMessageReceiverError(MessageReceiverError error) +{ + interface.handleError(error); +} + +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + if (htim->Instance == htim6.Instance) { + indicators.update(); + } +} + +void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) +{ + if (GPIO_Pin == COAX_IRQ_Pin) { + coax.handleInterrupt(); + } +} + +void SystemClock_Config(void) +{ + LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); + + while (LL_FLASH_GetLatency() != LL_FLASH_LATENCY_4) { + } + + LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1); + + LL_RCC_MSI_Enable(); + + while (LL_RCC_MSI_IsReady() != 1) { + } + + LL_RCC_MSI_EnableRangeSelection(); + LL_RCC_MSI_SetRange(LL_RCC_MSIRANGE_6); + LL_RCC_MSI_SetCalibTrimming(0); + + LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_MSI, LL_RCC_PLLM_DIV_1, 40, LL_RCC_PLLR_DIV_2); + LL_RCC_PLL_EnableDomain_SYS(); + LL_RCC_PLL_Enable(); + + while (LL_RCC_PLL_IsReady() != 1) { + } + + LL_RCC_PLLSAI1_ConfigDomain_48M(LL_RCC_PLLSOURCE_MSI, LL_RCC_PLLM_DIV_1, 24, LL_RCC_PLLSAI1Q_DIV_2); + LL_RCC_PLLSAI1_EnableDomain_48M(); + LL_RCC_PLLSAI1_Enable(); + + while (LL_RCC_PLLSAI1_IsReady() != 1) { + } + + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); + + while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) { + } + + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); + LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); + LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); + LL_SetSystemCoreClock(80000000); + + if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) { + Error_Handler(); + } + + LL_RCC_SetUSARTClockSource(LL_RCC_USART1_CLKSOURCE_PCLK2); + LL_RCC_SetUSBClockSource(LL_RCC_USB_CLKSOURCE_PLLSAI1); +} + +void Error_Handler(void) +{ +} + +uint32_t bootMagic = 0x00000000; + +void resetToBootloader() +{ + bootMagic = 0x32703270; + + NVIC_SystemReset(); +} diff --git a/interface2/firmware/src/message.cpp b/interface2/firmware/src/message.cpp new file mode 100644 index 0000000..83c9c1a --- /dev/null +++ b/interface2/firmware/src/message.cpp @@ -0,0 +1,258 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#include "stm32l4xx_hal.h" + +#include "usbd_cdc_if.h" + +#include "debug.h" + +#include "message.h" + +#define MESSAGE_END 0xc0 +#define MESSAGE_ESCAPE 0xdb +#define MESSAGE_ESCAPE_END 0xdc +#define MESSAGE_ESCAPE_ESCAPE 0xdd + +MessageReceiver::MessageReceiver(volatile uint8_t *buffer, size_t bufferSize, + void (*messageCallback)(const uint8_t *, size_t), + void (*errorCallback)(MessageReceiverError)) : + _buffer(buffer), + _bufferSize(bufferSize), + _messageCallback(messageCallback), + _errorCallback(errorCallback) +{ + _timeout = 1000; + _lastReceiveTime = -1; + + _bufferCount = 0; + _state = MESSAGE_RECEIVER_STATE_WAIT_START; +} + +void MessageReceiver::load(const uint8_t *buffer, size_t bufferCount) +{ + _lastReceiveTime = HAL_GetTick(); + + for (size_t index = 0; index < bufferCount; index++) { + uint8_t byte = buffer[index]; + + if (_state == MESSAGE_RECEIVER_STATE_WAIT_START) { + if (byte == MESSAGE_END) { + _bufferCount = 0; + _state = MESSAGE_RECEIVER_STATE_DATA; + } + } else if (_state == MESSAGE_RECEIVER_STATE_DATA) { + if (byte == MESSAGE_END) { + if (_bufferCount > 0) { + _state = MESSAGE_RECEIVER_STATE_AVAILABLE; + } else { + _state = MESSAGE_RECEIVER_STATE_WAIT_START; + } + } else if (byte == MESSAGE_ESCAPE) { + _state = MESSAGE_RECEIVER_STATE_ESCAPE; + } else { + if (_bufferCount < _bufferSize) { + _buffer[_bufferCount++] = byte; + } else { + _state = MESSAGE_RECEIVER_STATE_DATA_OVERFLOW; + } + } + } else if (_state == MESSAGE_RECEIVER_STATE_ESCAPE) { + if (byte == MESSAGE_ESCAPE_END) { + if (_bufferCount < _bufferSize) { + _buffer[_bufferCount++] = MESSAGE_END; + _state = MESSAGE_RECEIVER_STATE_DATA; + } else { + _state = MESSAGE_RECEIVER_STATE_DATA_OVERFLOW; + } + } else if (byte == MESSAGE_ESCAPE_ESCAPE) { + if (_bufferCount < _bufferSize) { + _buffer[_bufferCount++] = MESSAGE_ESCAPE; + _state = MESSAGE_RECEIVER_STATE_DATA; + } else { + _state = MESSAGE_RECEIVER_STATE_DATA_OVERFLOW; + } + } else { + _state = MESSAGE_RECEIVER_STATE_WAIT_START; + } + } else if (_state == MESSAGE_RECEIVER_STATE_AVAILABLE) { + _state = MESSAGE_RECEIVER_STATE_MESSAGE_OVERFLOW; + } + } +} + +bool MessageReceiver::dispatch() +{ + if (_state == MESSAGE_RECEIVER_STATE_AVAILABLE || _state == MESSAGE_RECEIVER_STATE_MESSAGE_OVERFLOW) { + // In the case of a message overflow the message is still valid. + _messageCallback(const_cast(_buffer), _bufferCount); + + // A message overflow could occur during the above callback. + if (_state == MESSAGE_RECEIVER_STATE_MESSAGE_OVERFLOW) { + _errorCallback(MESSAGE_RECEIVER_ERROR_MESSAGE_OVERFLOW); + } + } else if (_state == MESSAGE_RECEIVER_STATE_DATA_OVERFLOW) { + _errorCallback(MESSAGE_RECEIVER_ERROR_DATA_OVERFLOW); + } else { + if (_state != MESSAGE_RECEIVER_STATE_WAIT_START) { + uint32_t lastReceiveTime = _lastReceiveTime; + uint32_t time = HAL_GetTick(); + + if (time - lastReceiveTime > _timeout) { + Debug::trap(201, "state = %d, lastReceiveTime = %d, time = %d", _state, lastReceiveTime, time); + + _state = MESSAGE_RECEIVER_STATE_WAIT_START; + + _errorCallback(MESSAGE_RECEIVER_ERROR_TIMEOUT); + } + } + + return false; + } + + _state = MESSAGE_RECEIVER_STATE_WAIT_START; + + return true; +} + +extern USBD_HandleTypeDef hUsbDeviceFS; + +HAL_StatusTypeDef transmit(const uint8_t *buffer, size_t bufferCount, uint32_t timeout) +{ + if (hUsbDeviceFS.dev_state != USBD_STATE_CONFIGURED) { + return HAL_ERROR; + } + + USBD_CDC_HandleTypeDef *cdc = reinterpret_cast(hUsbDeviceFS.pClassData); + + uint32_t startTime = HAL_GetTick(); + + while (cdc->TxState != 0) { + if (timeout != HAL_MAX_DELAY) { + if (HAL_GetTick() - startTime > timeout || timeout == 0) { + return HAL_TIMEOUT; + } + } + } + + HAL_StatusTypeDef status = (HAL_StatusTypeDef) CDC_Transmit_FS(const_cast(buffer), bufferCount); + + if (status != HAL_OK) { + return status; + } + + startTime = HAL_GetTick(); + + while (cdc->TxState != 0) { + if (timeout != HAL_MAX_DELAY) { + if (HAL_GetTick() - startTime > timeout || timeout == 0) { + return HAL_TIMEOUT; + } + } + } + + return HAL_OK; +} + +inline size_t encode(uint8_t *buffer, size_t size, uint8_t byte) +{ + if (byte == MESSAGE_END || byte == MESSAGE_ESCAPE) { + if (size < 2) { + return 0; + } + + buffer[0] = MESSAGE_ESCAPE; + + if (byte == MESSAGE_END) + buffer[1] = MESSAGE_ESCAPE_END; + else if (byte == MESSAGE_ESCAPE) + buffer[1] = MESSAGE_ESCAPE_ESCAPE; + + return 2; + } + + if (size < 1) { + return 0; + } + + buffer[0] = byte; + + return 1; +} + +#define PACKET_SIZE 64 + +// In order to simplify the breaking up of a message into multiple packets we reserve +// space at the end of every packet for the footer and end symbol. If the packet +// contained a real checksum in the footer then this would be at worst case 5 to +// allow for the encoding. +#define RESERVED 3 + +bool MessageSender::send(const uint8_t *buffer, size_t bufferCount) +{ + uint8_t packet[PACKET_SIZE]; + + size_t packetCount = 0; + size_t remainingPacketSize = PACKET_SIZE - RESERVED; + + // Start the message and encode the header, we assume that there is space for the header. + packet[packetCount++] = MESSAGE_END; + + remainingPacketSize--; + + size_t count = encode(&packet[packetCount], remainingPacketSize, (u_int8_t) (bufferCount >> 8)); + + packetCount += count; + remainingPacketSize -= count; + + count = encode(&packet[packetCount], remainingPacketSize, (u_int8_t) bufferCount); + + packetCount += count; + remainingPacketSize -= count; + + // Encode the data, once the packet size has been reached transmit the packet. + size_t index = 0; + + while (index < bufferCount) { + count = encode(&packet[packetCount], remainingPacketSize, buffer[index]); + + if (count > 0) { + index++; + } + + packetCount += count; + remainingPacketSize -= count; + + // Transmit the packet and begin a new packet. + if (count == 0 || remainingPacketSize == 0) { + if (transmit(packet, packetCount, 1000) != HAL_OK) { + return false; + } + + packetCount = 0; + remainingPacketSize = PACKET_SIZE - RESERVED; + } + } + + // Add the footer (space has been reserved), end the message and transmit the packet. + packet[packetCount++] = 0; + packet[packetCount++] = 0; + packet[packetCount++] = MESSAGE_END; + + if (!transmit(packet, packetCount, 1000)) { + return false; + } + + return true; +} diff --git a/interface2/fpga/Makefile b/interface2/fpga/Makefile new file mode 100644 index 0000000..55caf30 --- /dev/null +++ b/interface2/fpga/Makefile @@ -0,0 +1,13 @@ +SUBDIRS = tests rtl + +all: $(SUBDIRS) + +$(SUBDIRS): + $(MAKE) -C $@ + +clean: + for dir in $(SUBDIRS); do \ + $(MAKE) -C $$dir clean; \ + done + +.PHONY: all $(SUBDIRS) clean diff --git a/interface2/fpga/rtl/.gitignore b/interface2/fpga/rtl/.gitignore new file mode 100644 index 0000000..620a1b8 --- /dev/null +++ b/interface2/fpga/rtl/.gitignore @@ -0,0 +1,10 @@ +*.json +*.asc +*.bin + +# iCEcube2 +.mac_address +coax_Implmnt +synlog.tcl +*.log +*.log.bak diff --git a/interface2/fpga/rtl/Makefile b/interface2/fpga/rtl/Makefile new file mode 100644 index 0000000..1d9fa1f --- /dev/null +++ b/interface2/fpga/rtl/Makefile @@ -0,0 +1 @@ +include icecube2.mk diff --git a/interface2/fpga/rtl/clocks.sdc b/interface2/fpga/rtl/clocks.sdc new file mode 100644 index 0000000..06c654b --- /dev/null +++ b/interface2/fpga/rtl/clocks.sdc @@ -0,0 +1,2 @@ +create_clock -period 25.00 -name {clk} [get_ports {clk}] +create_clock -period 100.00 -name {spi_sck} [get_ports {spi_sck}] diff --git a/interface2/fpga/rtl/coax_buffer.v b/interface2/fpga/rtl/coax_buffer.v new file mode 100644 index 0000000..8feb4aa --- /dev/null +++ b/interface2/fpga/rtl/coax_buffer.v @@ -0,0 +1,94 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +`default_nettype none + +module coax_buffer ( + input clk, + input reset, + input [9:0] write_data, + input write_strobe, + output [9:0] read_data, + input read_strobe, + output empty, + output full, + output reg almost_empty, + output reg almost_full +); + parameter DEPTH = 256; + parameter ALMOST_EMPTY_THRESHOLD = 64; + parameter ALMOST_FULL_THRESHOLD = 192; + + fifo_sync_ram #( + .DEPTH(DEPTH), + .WIDTH(10) + ) fifo ( + .wr_data(write_data), + .wr_ena(write_strobe), + .wr_full(full), + .rd_data(read_data), + .rd_ena(read_strobe), + .rd_empty(empty), + .clk(clk), + .rst(reset) + ); + + reg write_strobe_only; + reg read_strobe_only; + reg not_empty; + reg not_full; + + always @(posedge clk) + begin + write_strobe_only <= (write_strobe && !read_strobe); + read_strobe_only <= (read_strobe && !write_strobe); + + not_empty <= !empty; + not_full <= !full; + end + + reg increment_level; + reg decrement_level; + + always @(posedge clk) + begin + increment_level <= (write_strobe_only && not_full); + decrement_level <= (read_strobe_only && not_empty); + + if (reset) + begin + increment_level <= 0; + decrement_level <= 0; + end + end + + reg [$clog2(DEPTH):0] level; + + always @(posedge clk) + begin + if (increment_level) + level <= level + 1; + else if (decrement_level) + level <= level - 1; + + if (reset) + level <= 0; + end + + always @(posedge clk) + begin + almost_empty <= (level <= ALMOST_EMPTY_THRESHOLD); + almost_full <= (level >= ALMOST_FULL_THRESHOLD); + end +endmodule diff --git a/interface2/fpga/rtl/coax_buffered_rx.v b/interface2/fpga/rtl/coax_buffered_rx.v new file mode 100644 index 0000000..00caac5 --- /dev/null +++ b/interface2/fpga/rtl/coax_buffered_rx.v @@ -0,0 +1,85 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +`default_nettype none + +module coax_buffered_rx ( + input clk, + input reset, + input rx, + output active, + output error, + output [9:0] data, + input read_strobe, + output empty, + output full, + input parity +); + parameter CLOCKS_PER_BIT = 8; + parameter DEPTH = 256; + + localparam ERROR_OVERFLOW = 10'b0000001000; + + wire coax_rx_error; + wire [9:0] coax_rx_data; + wire coax_rx_strobe; + + coax_rx #( + .CLOCKS_PER_BIT(CLOCKS_PER_BIT) + ) coax_rx ( + .clk(clk), + .reset(reset), + .rx(rx), + .active(active), + .error(coax_rx_error), + .data(coax_rx_data), + .strobe(coax_rx_strobe), + .parity(parity) + ); + + wire [9:0] coax_buffer_data; + + coax_buffer #( + .DEPTH(DEPTH) + ) coax_buffer ( + .clk(clk), + .reset(reset), + .write_data(coax_rx_data), + .write_strobe(coax_rx_strobe), + .read_data(coax_buffer_data), + .read_strobe(read_strobe && !error), + .empty(empty), + .full(full) + ); + + wire overflow; + + assign overflow = ((active && !previous_active && !empty) || (coax_rx_strobe && full)); + + reg overflowed = 0; + reg previous_active; + + always @(posedge clk) + begin + if (reset) + overflowed <= 0; + else if (overflow) + overflowed <= 1; + + previous_active <= active; + end + + assign error = overflow || overflowed || coax_rx_error; + assign data = (overflow || overflowed) ? ERROR_OVERFLOW : (coax_rx_error ? coax_rx_data : (empty ? 10'b0 : coax_buffer_data)); +endmodule diff --git a/interface2/fpga/rtl/coax_buffered_tx.v b/interface2/fpga/rtl/coax_buffered_tx.v new file mode 100644 index 0000000..aa6ad1f --- /dev/null +++ b/interface2/fpga/rtl/coax_buffered_tx.v @@ -0,0 +1,151 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +`default_nettype none + +module coax_buffered_tx ( + input clk, + input reset, + output active, + output tx, + input [9:0] data, + input load_strobe, + input start_strobe, + output empty, + output full, + output reg ready, + input parity +); + parameter CLOCKS_PER_BIT = 8; + parameter DEPTH = 256; + parameter START_DEPTH = DEPTH * 0.75; + + localparam STATE_IDLE = 0; + localparam STATE_TRANSMITTING_1 = 1; + localparam STATE_TRANSMITTING_2 = 2; + localparam STATE_TRANSMITTING_3 = 3; + + reg [1:0] state = STATE_IDLE; + reg [1:0] next_state; + + reg next_ready; + + wire [9:0] coax_tx_data; + reg coax_tx_strobe = 0; + reg next_coax_tx_strobe; + wire coax_tx_ready; + + coax_tx #( + .CLOCKS_PER_BIT(CLOCKS_PER_BIT) + ) coax_tx ( + .clk(clk), + .reset(reset), + .active(active), + .tx(tx), + .data(coax_tx_data), + .strobe(coax_tx_strobe), + .ready(coax_tx_ready), + .parity(parity) + ); + + reg coax_buffer_read_strobe = 0; + reg next_coax_buffer_read_strobe; + wire coax_buffer_almost_full; + + coax_buffer #( + .DEPTH(DEPTH), + .ALMOST_FULL_THRESHOLD(START_DEPTH) + ) coax_buffer ( + .clk(clk), + .reset(reset), + .write_data(data), + .write_strobe(load_strobe), + .read_data(coax_tx_data), + .read_strobe(coax_buffer_read_strobe), + .empty(empty), + .almost_full(coax_buffer_almost_full), + .full(full) + ); + + always @(*) + begin + next_state = state; + + next_coax_tx_strobe = 0; + next_coax_buffer_read_strobe = 0; + + next_ready = 1; + + case (state) + STATE_IDLE: + begin + // NOTE: Redundant check of almost full AND not empty is in + // order to protect against bugs with the almost full logic. + if ((start_strobe || coax_buffer_almost_full) && !empty) + next_state = STATE_TRANSMITTING_1; + end + + STATE_TRANSMITTING_1: + begin + if (coax_tx_ready) + begin + if (!empty) + begin + next_coax_tx_strobe = 1; + next_state = STATE_TRANSMITTING_2; + end + else + begin + next_ready = 0; + next_state = STATE_TRANSMITTING_3; + end + end + end + + STATE_TRANSMITTING_2: + begin + next_coax_buffer_read_strobe = 1; + next_state = STATE_TRANSMITTING_1; + end + + STATE_TRANSMITTING_3: + begin + next_ready = 0; + + if (!active) + next_state = STATE_IDLE; + end + endcase + end + + always @(posedge clk) + begin + state <= next_state; + + coax_tx_strobe <= next_coax_tx_strobe; + coax_buffer_read_strobe <= next_coax_buffer_read_strobe; + + ready <= next_ready; + + if (reset) + begin + state <= STATE_IDLE; + + coax_tx_strobe <= 0; + coax_buffer_read_strobe <= 0; + + ready <= 1; + end + end +endmodule diff --git a/interface2/fpga/rtl/coax_rx.v b/interface2/fpga/rtl/coax_rx.v new file mode 100644 index 0000000..1071a73 --- /dev/null +++ b/interface2/fpga/rtl/coax_rx.v @@ -0,0 +1,415 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +`default_nettype none + +module coax_rx ( + input clk, + input reset, + input rx, + output reg active, + output reg error, + output reg [9:0] data, + output reg strobe = 0, + input parity +); + parameter CLOCKS_PER_BIT = 8; + + localparam ERROR_LOSS_OF_MID_BIT_TRANSITION = 10'b0000000001; + localparam ERROR_PARITY = 10'b0000000010; + localparam ERROR_INVALID_END_SEQUENCE = 10'b0000000100; + + localparam STATE_IDLE = 0; + localparam STATE_START_SEQUENCE_1 = 1; + localparam STATE_START_SEQUENCE_2 = 2; + localparam STATE_START_SEQUENCE_3 = 3; + localparam STATE_START_SEQUENCE_4 = 4; + localparam STATE_START_SEQUENCE_5 = 5; + localparam STATE_START_SEQUENCE_6 = 6; + localparam STATE_START_SEQUENCE_7 = 7; + localparam STATE_START_SEQUENCE_8 = 8; + localparam STATE_START_SEQUENCE_9 = 9; + localparam STATE_SYNC_BIT = 10; + localparam STATE_DATA_BIT = 11; + localparam STATE_PARITY_BIT = 12; + localparam STATE_END_SEQUENCE_1 = 13; + localparam STATE_END_SEQUENCE_2 = 14; + localparam STATE_ERROR = 15; + + reg [3:0] state = STATE_IDLE; + reg [3:0] next_state; + reg [7:0] state_counter; + reg [7:0] next_state_counter; + + reg previous_rx; + + reg bit_timer_reset = 0; + reg next_bit_timer_reset; + + reg [9:0] next_data; + reg next_strobe; + + reg [9:0] input_data; + reg [9:0] next_input_data; + reg input_data_parity; + + reg [3:0] bit_counter = 0; + reg [3:0] next_bit_counter; + + reg next_active; + reg next_error; + + wire sample; + wire synchronized; + + coax_rx_bit_timer #( + .CLOCKS_PER_BIT(CLOCKS_PER_BIT) + ) bit_timer ( + .clk(clk), + .rx(rx), + .reset(bit_timer_reset), + .sample(sample), + .synchronized(synchronized) + ); + + always @(*) + begin + next_state = state; + next_state_counter = state_counter + 1; + + next_bit_timer_reset = 0; + + next_data = data; + next_strobe = 0; + + next_input_data = input_data; + next_bit_counter = bit_counter; + + next_active = 0; + next_error = 0; + + case (state) + STATE_IDLE: + begin + next_bit_timer_reset = 1; + + if (!rx && previous_rx) + begin + next_state = STATE_START_SEQUENCE_1; + next_state_counter = 0; + end + end + + STATE_START_SEQUENCE_1: + begin + if (sample) + begin + if (synchronized && rx) + next_state = STATE_START_SEQUENCE_2; + else + next_state = STATE_IDLE; + + next_state_counter = 0; + end + else if (state_counter >= (CLOCKS_PER_BIT * 2)) + begin + next_state = STATE_IDLE; + next_state_counter = 0; + end + end + + STATE_START_SEQUENCE_2: + begin + if (sample) + begin + if (synchronized && rx) + next_state = STATE_START_SEQUENCE_3; + else + next_state = STATE_IDLE; + + next_state_counter = 0; + end + end + + STATE_START_SEQUENCE_3: + begin + if (sample) + begin + if (synchronized && rx) + next_state = STATE_START_SEQUENCE_4; + else + next_state = STATE_IDLE; + + next_state_counter = 0; + end + end + + STATE_START_SEQUENCE_4: + begin + if (sample) + begin + if (synchronized && rx) + next_state = STATE_START_SEQUENCE_5; + else + next_state = STATE_IDLE; + + next_state_counter = 0; + end + end + + STATE_START_SEQUENCE_5: + begin + if (sample) + begin + if (synchronized && rx) + next_state = STATE_START_SEQUENCE_6; + else + next_state = STATE_IDLE; + + next_state_counter = 0; + end + end + + STATE_START_SEQUENCE_6: + begin + if (!rx) + begin + next_state = STATE_START_SEQUENCE_7; + next_state_counter = 0; + end + else if (state_counter >= CLOCKS_PER_BIT) + begin + next_state = STATE_IDLE; + next_state_counter = 0; + end + end + + STATE_START_SEQUENCE_7: + begin + if (rx) + begin + next_state = STATE_START_SEQUENCE_8; + next_state_counter = 0; + end + else if (state_counter >= (CLOCKS_PER_BIT * 2)) + begin + next_state = STATE_IDLE; + next_state_counter = 0; + end + end + + STATE_START_SEQUENCE_8: + begin + if (!rx) + begin + next_bit_timer_reset = 1; + next_state = STATE_START_SEQUENCE_9; + next_state_counter = 0; + end + else if (state_counter >= (CLOCKS_PER_BIT * 2)) + begin + next_state = STATE_IDLE; + next_state_counter = 0; + end + end + + STATE_START_SEQUENCE_9: + begin + // This is really the first STATE_SYNC_BIT but we treat it + // differently and consider it part of the start + // sequence. + + if (sample && synchronized) + begin + if (rx) + begin + next_bit_counter = 0; + next_state = STATE_DATA_BIT; + end + else + begin + next_state = STATE_IDLE; + end + + next_state_counter = 0; + end + else if (state_counter >= CLOCKS_PER_BIT) + begin + next_state = STATE_IDLE; + next_state_counter = 0; + end + end + + STATE_SYNC_BIT: + begin + next_active = 1; + + if (sample) + begin + if (synchronized) + begin + if (rx) + begin + next_bit_counter = 0; + next_state = STATE_DATA_BIT; + end + else + begin + next_state = STATE_END_SEQUENCE_1; + end + + next_state_counter = 0; + end + else + begin + next_data = ERROR_LOSS_OF_MID_BIT_TRANSITION; + next_state = STATE_ERROR; + next_state_counter = 0; + end + end + end + + STATE_DATA_BIT: + begin + next_active = 1; + + if (sample) + begin + if (synchronized) + begin + next_input_data = { input_data[8:0], rx }; + + if (bit_counter < 9) + begin + next_bit_counter = bit_counter + 1; + end + else + begin + next_state = STATE_PARITY_BIT; + end + + next_state_counter = 0; + end + else + begin + next_data = ERROR_LOSS_OF_MID_BIT_TRANSITION; + next_state = STATE_ERROR; + next_state_counter = 0; + end + end + end + + STATE_PARITY_BIT: + begin + next_active = 1; + + if (sample) + begin + if (synchronized) + begin + if (rx == input_data_parity) + begin + next_strobe = 1; + next_data = input_data; + next_state = STATE_SYNC_BIT; + end + else + begin + next_data = ERROR_PARITY; + next_state = STATE_ERROR; + end + + next_state_counter = 0; + end + else + begin + next_data = ERROR_LOSS_OF_MID_BIT_TRANSITION; + next_state = STATE_ERROR; + next_state_counter = 0; + end + end + end + + STATE_END_SEQUENCE_1: + begin + if (rx) + begin + next_state = STATE_END_SEQUENCE_2; + next_state_counter = 0; + end + else if (state_counter >= CLOCKS_PER_BIT) + begin + next_data = ERROR_INVALID_END_SEQUENCE; + next_state = STATE_ERROR; + next_state_counter = 0; + end + end + + STATE_END_SEQUENCE_2: + begin + // TODO: should this go to ERROR on timeout? + if (!rx) + begin + next_state = STATE_IDLE; + next_state_counter = 0; + end + else if (state_counter >= (CLOCKS_PER_BIT * 2)) + begin + next_state = STATE_IDLE; + next_state_counter = 0; + end + end + + STATE_ERROR: + begin + next_error = 1; + end + endcase + end + + always @(posedge clk) + begin + state <= next_state; + state_counter <= next_state_counter; + + bit_timer_reset <= next_bit_timer_reset; + + data <= next_data; + strobe <= next_strobe; + + input_data <= next_input_data; + + // Parity includes the sync bit. + input_data_parity <= (parity == 1 ? ^{ 1'b1, input_data } : ~^{ 1'b1, input_data }); + + bit_counter <= next_bit_counter; + + active <= next_active; + error <= next_error; + + if (reset) + begin + bit_timer_reset <= 1; + + state <= STATE_IDLE; + + strobe <= 0; + + active <= 0; + error <= 0; + end + + previous_rx <= rx; + end +endmodule diff --git a/interface2/fpga/rtl/coax_rx_bit_timer.v b/interface2/fpga/rtl/coax_rx_bit_timer.v new file mode 100644 index 0000000..2f83e7e --- /dev/null +++ b/interface2/fpga/rtl/coax_rx_bit_timer.v @@ -0,0 +1,111 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +`default_nettype none + +module coax_rx_bit_timer ( + input clk, + input rx, + input reset, + output reg sample, + output reg synchronized +); + parameter CLOCKS_PER_BIT = 8; + + localparam IDLE = 0; + localparam SYNCHRONIZED = 1; + localparam UNSYNCHRONIZED = 2; + + reg [1:0] state = IDLE; + reg [1:0] next_state; + + reg previous_rx; + + reg [$clog2(CLOCKS_PER_BIT*2):0] transition_counter = 0; + reg [$clog2(CLOCKS_PER_BIT*2):0] next_transition_counter; + reg [$clog2(CLOCKS_PER_BIT):0] bit_counter = 0; + reg [$clog2(CLOCKS_PER_BIT):0] next_bit_counter; + + always @(*) + begin + next_state = state; + + sample = 0; + synchronized = 0; + + next_transition_counter = transition_counter; + next_bit_counter = bit_counter; + + case (state) + IDLE: + begin + if (rx != previous_rx) + begin + next_transition_counter = 0; + next_bit_counter = CLOCKS_PER_BIT / 2; + + next_state = SYNCHRONIZED; + end + end + + SYNCHRONIZED: + begin + if (transition_counter < (CLOCKS_PER_BIT + (CLOCKS_PER_BIT / 4))) + next_transition_counter = transition_counter + 1; + else + next_state = UNSYNCHRONIZED; + + synchronized = 1; + + if (bit_counter < CLOCKS_PER_BIT) + next_bit_counter = bit_counter + 1; + else + next_bit_counter = 0; + + if (rx != previous_rx && transition_counter > (CLOCKS_PER_BIT / 2)) + begin + next_transition_counter = 0; + next_bit_counter = CLOCKS_PER_BIT / 2; + end + + if (bit_counter == ((CLOCKS_PER_BIT / 4) * 3)) + sample = 1; + end + + UNSYNCHRONIZED: + begin + if (bit_counter < CLOCKS_PER_BIT) + next_bit_counter = bit_counter + 1; + else + next_bit_counter = 0; + + if (bit_counter == ((CLOCKS_PER_BIT / 4) * 3)) + sample = 1; + end + endcase + end + + always @(posedge clk) + begin + state <= next_state; + + transition_counter <= next_transition_counter; + bit_counter <= next_bit_counter; + + if (reset) + state <= IDLE; + + previous_rx <= rx; + end +endmodule diff --git a/interface2/fpga/rtl/coax_syn.prj b/interface2/fpga/rtl/coax_syn.prj new file mode 100644 index 0000000..38f3c7c --- /dev/null +++ b/interface2/fpga/rtl/coax_syn.prj @@ -0,0 +1,71 @@ +#-- Synopsys, Inc. +#-- Project file /home/andrew/lattice_coax/coax/coax_syn.prj +#project files + +add_file -verilog -lib work "coax_buffered_rx.v" +add_file -verilog -lib work "coax_rx.v" +add_file -verilog -lib work "coax_rx_bit_timer.v" +add_file -verilog -lib work "coax_tx.v" +add_file -verilog -lib work "coax_tx_bit_timer.v" +add_file -verilog -lib work "coax_tx_distorter.v" +add_file -verilog -lib work "control.v" +add_file -verilog -lib work "spi_device.v" +add_file -verilog -lib work "coax_buffered_tx.v" +add_file -verilog -lib work "coax_buffer.v" +add_file -verilog -lib work "third_party/fifo_sync_ram.v" +add_file -verilog -lib work "third_party/ram_sdp.v" +add_file -verilog -lib work "strobe_cdc.v" +add_file -verilog -lib work "top.v" +add_file -verilog -lib work "dual_clock_spi_device.v" +add_file -constraint -lib work "clocks.sdc" +#implementation: "coax_Implmnt" +impl -add coax_Implmnt -type fpga + +#implementation attributes +set_option -vlog_std v2001 +set_option -project_relative_includes 1 + +#device options +set_option -technology SBTiCE40UP +set_option -part iCE40UP5K +set_option -package SG48 +set_option -speed_grade +set_option -part_companion "" + +#compilation/mapping options + +# mapper_options +set_option -frequency auto +set_option -write_verilog 0 +set_option -write_vhdl 0 + +# Silicon Blue iCE40UP +set_option -maxfan 10000 +set_option -disable_io_insertion 0 +set_option -pipe 1 +set_option -retiming 0 +set_option -update_models_cp 0 +set_option -fixgatedclocks 2 +set_option -fixgeneratedclocks 0 + +# NFilter +set_option -popfeed 0 +set_option -constprop 0 +set_option -createhierarchy 0 + +# sequential_optimization_options +set_option -symbolic_fsm_compiler 1 + +# Compiler Options +set_option -compiler_compatible 0 +set_option -resource_sharing 1 + +#automatic place and route (vendor) options +set_option -write_apr_constraint 1 + +#set result format/file last +project -result_format "edif" +project -result_file ./coax_Implmnt/coax.edf +project -log_file "./coax_Implmnt/coax.srr" +impl -active coax_Implmnt +project -run synthesis -clean diff --git a/interface2/fpga/rtl/coax_tx.v b/interface2/fpga/rtl/coax_tx.v new file mode 100644 index 0000000..838a6b1 --- /dev/null +++ b/interface2/fpga/rtl/coax_tx.v @@ -0,0 +1,308 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +`default_nettype none + +module coax_tx ( + input clk, + input reset, + output reg active, + output reg tx, + input [9:0] data, + input strobe, + output ready, + input parity +); + parameter CLOCKS_PER_BIT = 8; + + localparam IDLE = 0; + localparam START_SEQUENCE_1 = 1; + localparam START_SEQUENCE_2 = 2; + localparam START_SEQUENCE_3 = 3; + localparam START_SEQUENCE_4 = 4; + localparam START_SEQUENCE_5 = 5; + localparam START_SEQUENCE_6 = 6; + localparam START_SEQUENCE_7 = 7; + localparam START_SEQUENCE_8 = 8; + localparam START_SEQUENCE_9 = 9; + localparam SYNC_BIT = 10; + localparam DATA_BIT = 11; + localparam PARITY_BIT = 12; + localparam END_SEQUENCE_1 = 13; + localparam END_SEQUENCE_2 = 14; + localparam END_SEQUENCE_3 = 15; + + reg [3:0] state = IDLE; + reg [3:0] next_state; + + reg next_tx; + + reg end_sequence; + reg next_end_sequence; + + reg [9:0] output_data; + reg [9:0] next_output_data; + reg output_data_full = 0; + reg next_output_data_full; + reg parity_bit; + reg next_parity_bit; + reg output_parity_bit; + reg next_output_parity_bit; + + reg [3:0] bit_counter = 0; + reg [3:0] next_bit_counter; + + reg bit_timer_reset = 0; + reg next_bit_timer_reset; + + wire first_half; + wire second_half; + wire last_clock; + + coax_tx_bit_timer #( + .CLOCKS_PER_BIT(CLOCKS_PER_BIT) + ) bit_timer ( + .clk(clk), + .reset(bit_timer_reset), + .first_half(first_half), + .second_half(second_half), + .last_clock(last_clock) + ); + + always @(*) + begin + next_state = state; + + next_tx = 0; + + next_end_sequence = 0; + + next_output_data = output_data; + next_output_data_full = output_data_full; + next_parity_bit = parity_bit; + next_output_parity_bit = output_parity_bit; + + if (strobe && ready) + begin + next_output_data = data; + next_output_data_full = 1; + + // Parity includes the sync bit. + next_parity_bit = (parity == 1 ? ^{ 1'b1, data } : ~^{ 1'b1, data }); + end + + next_bit_counter = bit_counter; + + next_bit_timer_reset = 0; + + case (state) + IDLE: + begin + next_bit_timer_reset = 1; + + if (output_data_full) + begin + next_state = START_SEQUENCE_1; + end + end + + START_SEQUENCE_1: + begin + next_tx = 1; + + // TODO... off by 1 + if (second_half) + begin + next_bit_timer_reset = 1; + next_state = START_SEQUENCE_2; + end + end + + START_SEQUENCE_2: + begin + next_tx = first_half ? 0 : 1; + + if (last_clock) + next_state = START_SEQUENCE_3; + end + + START_SEQUENCE_3: + begin + next_tx = first_half ? 0 : 1; + + if (last_clock) + next_state = START_SEQUENCE_4; + end + + START_SEQUENCE_4: + begin + next_tx = first_half ? 0 : 1; + + if (last_clock) + next_state = START_SEQUENCE_5; + end + + START_SEQUENCE_5: + begin + next_tx = first_half ? 0 : 1; + + if (last_clock) + next_state = START_SEQUENCE_6; + end + + START_SEQUENCE_6: + begin + next_tx = first_half ? 0 : 1; + + if (last_clock) + next_state = START_SEQUENCE_7; + end + + START_SEQUENCE_7: + begin + next_tx = 0; + + if (last_clock) + next_state = START_SEQUENCE_8; + end + + START_SEQUENCE_8: + begin + next_tx = first_half ? 0 : 1; + + if (last_clock) + next_state = START_SEQUENCE_9; + end + + START_SEQUENCE_9: + begin + next_tx = 1; + + if (last_clock) + next_state = SYNC_BIT; + end + + SYNC_BIT: + begin + next_tx = first_half ? 0 : 1; + + next_bit_counter = 9; + + if (last_clock) + next_state = DATA_BIT; + end + + DATA_BIT: + begin + next_tx = first_half ? ~output_data[9] : output_data[9]; + + if (last_clock) + begin + next_output_data = { output_data[8:0], output_data[9] }; + next_bit_counter = bit_counter - 1; + + if (bit_counter == 0) + begin + next_output_data_full = 0; + next_output_parity_bit = parity_bit; + + next_state = PARITY_BIT; + end + end + end + + PARITY_BIT: + begin + next_tx = first_half ? ~output_parity_bit : output_parity_bit; + + if (last_clock) + begin + if (output_data_full) + begin + next_state = SYNC_BIT; + end + else + begin + next_end_sequence = 1; + next_state = END_SEQUENCE_1; + end + end + end + + END_SEQUENCE_1: + begin + next_tx = first_half ? 1 : 0; + next_end_sequence = 1; + + if (last_clock) + next_state = END_SEQUENCE_2; + end + + END_SEQUENCE_2: + begin + next_tx = 1; + next_end_sequence = 1; + + if (last_clock) + next_state = END_SEQUENCE_3; + end + + END_SEQUENCE_3: + begin + next_tx = 1; + next_end_sequence = 1; + + if (last_clock) + begin + next_tx = 0; + next_end_sequence = 0; + next_state = IDLE; + end + end + endcase + end + + always @(posedge clk) + begin + state <= next_state; + + active <= (state != IDLE); // TODO: this causes active to remain high one additional clock cycle + tx <= next_tx; + + end_sequence <= next_end_sequence; + + output_data <= next_output_data; + output_data_full <= next_output_data_full; + parity_bit <= next_parity_bit; + output_parity_bit <= next_output_parity_bit; + + bit_counter <= next_bit_counter; + + bit_timer_reset <= next_bit_timer_reset; + + if (reset) + begin + state <= IDLE; + + active <= 0; + tx <= 0; + + end_sequence <= 0; + + output_data_full <= 0; + end + end + + assign ready = (!output_data_full && !end_sequence); +endmodule diff --git a/interface2/fpga/rtl/coax_tx_bit_timer.v b/interface2/fpga/rtl/coax_tx_bit_timer.v new file mode 100644 index 0000000..21fcc18 --- /dev/null +++ b/interface2/fpga/rtl/coax_tx_bit_timer.v @@ -0,0 +1,46 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +`default_nettype none + +module coax_tx_bit_timer ( + input clk, + input reset, + output first_half, + output second_half, + output last_clock +); + parameter CLOCKS_PER_BIT = 8; + + reg [$clog2(CLOCKS_PER_BIT):0] counter = 0; + reg [$clog2(CLOCKS_PER_BIT):0] next_counter; + + always @(*) + begin + next_counter = last_clock ? 0 : counter + 1; + end + + always @(posedge clk) + begin + counter <= next_counter; + + if (reset) + counter <= 0; + end + + assign first_half = (counter < CLOCKS_PER_BIT / 2); + assign second_half = ~first_half; + + assign last_clock = (counter == CLOCKS_PER_BIT - 1); +endmodule diff --git a/interface2/fpga/rtl/coax_tx_distorter.v b/interface2/fpga/rtl/coax_tx_distorter.v new file mode 100644 index 0000000..c64804c --- /dev/null +++ b/interface2/fpga/rtl/coax_tx_distorter.v @@ -0,0 +1,53 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +`default_nettype none + +module coax_tx_distorter ( + input clk, + input active_input, + input tx_input, + output reg active_output, + output reg tx_output, + output reg tx_delay, + output reg tx_n +); + parameter CLOCKS_PER_BIT = 8; + + localparam DELAY_CLOCKS = CLOCKS_PER_BIT / 4; + + reg [DELAY_CLOCKS-1:0] tx_d = { (DELAY_CLOCKS){1'b1} }; + + always @(posedge clk) + begin + if (active_input) + begin + tx_d <= { tx_d[DELAY_CLOCKS-2:0], tx_input }; + + active_output <= 1; + tx_output <= tx_input; + tx_delay <= tx_d[DELAY_CLOCKS-1]; + tx_n <= ~tx_input; + end + else + begin + tx_d <= { (DELAY_CLOCKS){1'b1} }; + + active_output <= 0; + tx_output <= 0; + tx_delay <= 0; + tx_n <= 0; + end + end +endmodule diff --git a/interface2/fpga/rtl/control.v b/interface2/fpga/rtl/control.v new file mode 100644 index 0000000..b397eea --- /dev/null +++ b/interface2/fpga/rtl/control.v @@ -0,0 +1,347 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +`default_nettype none + +module control ( + input clk, + input reset, + + // SPI + input spi_cs_n, + input [7:0] spi_rx_data, + input spi_rx_strobe, + output reg [7:0] spi_tx_data, + output reg spi_tx_strobe, + + output loopback, + + // TX + output reg tx_reset, + input tx_active, + output reg [9:0] tx_data, + output reg tx_load_strobe, + output reg tx_start_strobe, + input tx_empty, + input tx_full, + input tx_ready, + output tx_parity, + + // RX + output reg rx_reset, + input rx_active, + input rx_error, + input [9:0] rx_data, + output reg rx_read_strobe, + input rx_empty, + output rx_parity +); + parameter DEFAULT_CONTROL_REGISTER = 8'b01001000; + + localparam STATE_IDLE = 0; + localparam STATE_READ_REGISTER_1 = 1; + localparam STATE_READ_REGISTER_2 = 2; + localparam STATE_WRITE_REGISTER_1 = 3; + localparam STATE_WRITE_REGISTER_2 = 4; + localparam STATE_TX_1 = 5; + localparam STATE_TX_2 = 6; + localparam STATE_TX_3 = 7; + localparam STATE_RX_1 = 8; + localparam STATE_RX_2 = 9; + localparam STATE_RX_3 = 10; + localparam STATE_RX_4 = 11; + localparam STATE_RESET = 12; + + reg [7:0] state = STATE_IDLE; + reg [7:0] next_state; + + reg [7:0] control_register = DEFAULT_CONTROL_REGISTER; + reg [7:0] next_control_register; + reg [7:0] register_mask; + reg [7:0] next_register_mask; + + reg [7:0] command; + reg [7:0] next_command; + + reg [7:0] next_spi_tx_data; + reg next_spi_tx_strobe; + + reg next_tx_reset; + reg previous_tx_active; + reg [9:0] next_tx_data; + reg tx_data_valid = 0; + reg next_tx_data_valid; + reg next_tx_load_strobe; + reg next_tx_start_strobe; + reg tx_complete = 0; + reg next_tx_complete; + + reg next_rx_reset; + reg next_rx_read_strobe; + reg [15:0] rx_buffer; + reg [15:0] next_rx_buffer; + + reg [1:0] spi_cs_n_d; + + always @(posedge clk) + begin + spi_cs_n_d <= { spi_cs_n_d[0], spi_cs_n }; + end + + always @(*) + begin + next_state = state; + + next_control_register = control_register; + next_register_mask = register_mask; + + next_command = command; + + next_spi_tx_data = spi_tx_data; + next_spi_tx_strobe = 0; + + next_tx_reset = 0; + next_tx_data = tx_data; + next_tx_data_valid = tx_data_valid; + next_tx_load_strobe = 0; + next_tx_start_strobe = 0; + next_tx_complete = tx_complete; + + next_rx_reset = 0; + next_rx_read_strobe = 0; + next_rx_buffer = rx_buffer; + + case (state) + STATE_IDLE: + begin + if (spi_rx_strobe) + begin + next_command = spi_rx_data; + + case (spi_rx_data[3:0]) + 4'h2: next_state = STATE_READ_REGISTER_1; + 4'h3: next_state = STATE_WRITE_REGISTER_1; + 4'h4: next_state = STATE_TX_1; + 4'h5: next_state = STATE_RX_1; + 4'hf: next_state = STATE_RESET; + endcase + end + end + + STATE_READ_REGISTER_1: + begin + next_spi_tx_data = 0; + + case (command[7:4]) + 4'h1: next_spi_tx_data = { 1'b0, rx_error, rx_active, 1'b0, tx_complete, tx_active, 2'b0 }; + 4'h2: next_spi_tx_data = control_register; + 4'hf: next_spi_tx_data = 8'ha5; + endcase + + next_spi_tx_strobe = 1; + + next_state = STATE_READ_REGISTER_2; + end + + STATE_READ_REGISTER_2: + begin + if (spi_rx_strobe) + next_state = STATE_READ_REGISTER_1; + end + + STATE_WRITE_REGISTER_1: + begin + if (spi_rx_strobe) + begin + next_register_mask = spi_rx_data; + + next_state = STATE_WRITE_REGISTER_2; + end + end + + STATE_WRITE_REGISTER_2: + begin + if (spi_rx_strobe) + begin + case (command[7:4]) + 4'h2: next_control_register = (control_register & ~register_mask) | (spi_rx_data & register_mask); + endcase + + next_state = STATE_IDLE; + end + end + + STATE_TX_1: + begin + next_tx_complete = 0; + next_state = STATE_TX_2; + end + + STATE_TX_2: + begin + if (spi_rx_strobe) + begin + next_tx_data_valid = 0; + + if (tx_full) + begin + next_spi_tx_data = 8'b10000001; // Overflow + next_spi_tx_strobe = 1; + end + else if (!tx_ready) + begin + next_spi_tx_data = 8'b10000010; // Underflow + next_spi_tx_strobe = 1; + end + else + begin + next_tx_data = { spi_rx_data[1:0], 8'b00000000 }; + next_tx_data_valid = 1; + + next_spi_tx_data = 8'h00; + next_spi_tx_strobe = 1; + end + + next_state = STATE_TX_3; + end + end + + STATE_TX_3: + begin + if (spi_rx_strobe) + begin + next_tx_data = { tx_data[9:8], spi_rx_data }; + next_tx_load_strobe = tx_data_valid; + + next_state = STATE_TX_2; + end + end + + STATE_RX_1: + begin + next_rx_buffer = { rx_error, rx_empty, 4'b0000, rx_data }; + + next_state = STATE_RX_2; + end + + STATE_RX_2: + begin + next_spi_tx_data = rx_buffer[15:8]; + next_spi_tx_strobe = 1; + + next_state = STATE_RX_3; + end + + STATE_RX_3: + begin + if (spi_rx_strobe) + begin + next_spi_tx_data = rx_buffer[7:0]; + next_spi_tx_strobe = 1; + + // Reset on error and only dequeue if not empty. + if (rx_buffer[15]) + next_rx_reset = 1; // TODO: should this be more explicit? + else if (!rx_buffer[14]) + next_rx_read_strobe = 1; + + next_state = STATE_RX_4; + end + end + + STATE_RX_4: + begin + if (spi_rx_strobe) + next_state = STATE_RX_1; + end + + STATE_RESET: + begin + // TODO: should this also reset the control register flags + // like loopback? + + next_tx_reset = 1; + next_tx_complete = 0; + + next_rx_reset = 1; + + next_state = STATE_IDLE; + end + endcase + + if (spi_cs_n_d[1]) + begin + if (!tx_empty && !tx_active) + next_tx_start_strobe = 1; // TODO: this can last for multiple clock cycles, but that is okay... + + next_state = STATE_IDLE; + end + + if (!tx_active && previous_tx_active) + next_tx_complete = 1; + end + + always @(posedge clk) + begin + state <= next_state; + + control_register <= next_control_register; + register_mask <= next_register_mask; + + command <= next_command; + + spi_tx_data <= next_spi_tx_data; + spi_tx_strobe <= next_spi_tx_strobe; + + tx_reset <= next_tx_reset; + tx_data <= next_tx_data; + tx_data_valid <= next_tx_data_valid; + tx_load_strobe <= next_tx_load_strobe; + tx_start_strobe <= next_tx_start_strobe; + tx_complete <= next_tx_complete; + + rx_reset <= next_rx_reset; + rx_read_strobe <= next_rx_read_strobe; + rx_buffer <= next_rx_buffer; + + if (reset) + begin + state <= STATE_IDLE; + + control_register <= DEFAULT_CONTROL_REGISTER; + + command <= 0; + + spi_tx_data <= 0; + spi_tx_strobe <= 0; + + tx_reset <= 0; + tx_data <= 0; + tx_load_strobe <= 0; + tx_start_strobe <= 0; + tx_complete <= 0; + + rx_reset <= 0; + rx_read_strobe <= 0; + rx_buffer <= 0; + end + + previous_tx_active <= tx_active; + end + + assign loopback = control_register[0]; + + assign tx_parity = control_register[3]; + assign rx_parity = control_register[6]; +endmodule diff --git a/interface2/fpga/rtl/dual_clock_spi_device.v b/interface2/fpga/rtl/dual_clock_spi_device.v new file mode 100644 index 0000000..d0afe7b --- /dev/null +++ b/interface2/fpga/rtl/dual_clock_spi_device.v @@ -0,0 +1,75 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +`default_nettype none + +module dual_clock_spi_device ( + input clk_slow, + input clk_fast, + input spi_sck, + input spi_cs_n, + input spi_sdi, + output spi_sdo, + output reg [7:0] rx_data, + output reg rx_strobe, + input [7:0] tx_data, + input tx_strobe +); + wire [7:0] rx_data_fast; + wire rx_strobe_fast; + reg [7:0] tx_data_fast; + wire tx_strobe_fast; + + spi_device spi ( + .clk(clk_fast), + .spi_sck(spi_sck), + .spi_cs_n(spi_cs_n), + .spi_sdi(spi_sdi), + .spi_sdo(spi_sdo), + .rx_data(rx_data_fast), + .rx_strobe(rx_strobe_fast), + .tx_data(tx_data_fast), + .tx_strobe(tx_strobe_fast) + ); + + wire rx_strobe_slow; + + strobe_cdc rx_strobe_cdc ( + .clk_in(clk_fast), + .strobe_in(rx_strobe_fast), + .clk_out(clk_slow), + .strobe_out(rx_strobe_slow) + ); + + strobe_cdc tx_strobe_cdc ( + .clk_in(clk_slow), + .strobe_in(tx_strobe), + .clk_out(clk_fast), + .strobe_out(tx_strobe_fast) + ); + + always @(posedge clk_slow) + begin + if (tx_strobe) + tx_data_fast <= tx_data; + + rx_strobe <= 0; + + if (rx_strobe_slow) + begin + rx_data <= rx_data_fast; + rx_strobe <= 1; + end + end +endmodule diff --git a/interface2/fpga/rtl/icecube2.mk b/interface2/fpga/rtl/icecube2.mk new file mode 100644 index 0000000..5698292 --- /dev/null +++ b/interface2/fpga/rtl/icecube2.mk @@ -0,0 +1,20 @@ +# See https://github.com/halfmanhalftaco/fpga-docker/tree/master/Lattice_iCEcube2 +ICECUBE2_WRAPPER = docker run -it --rm --volume $(RTL):/data --workdir /data --mac-address=$(shell cat .mac_address) icecube2:latest ./icecube2_env.sh + +RTL = $(dir $(realpath $(firstword $(MAKEFILE_LIST)))) +IMPLMNT = coax_Implmnt + +all: top.bin + +$(IMPLMNT)/coax.edf: coax_syn.prj *.v third_party/*.v clocks.sdc + $(ICECUBE2_WRAPPER) synpwrap -prj coax_syn.prj + +top.bin: $(IMPLMNT)/coax.edf pins.pcf + rm -f top.bin + $(ICECUBE2_WRAPPER) ./icecube2_flow.tcl + cp $(IMPLMNT)/sbt/outputs/bitmap/top_bitmap.bin top.bin + +clean: + rm -rf $(IMPLMNT) synlog.tcl *.bin *.log *.log.bak + +.PHONY: all clean diff --git a/interface2/fpga/rtl/icecube2_env.sh b/interface2/fpga/rtl/icecube2_env.sh new file mode 100755 index 0000000..c246f3c --- /dev/null +++ b/interface2/fpga/rtl/icecube2_env.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +export ICECUBE_DIR="/opt/icecube2" +export SBT_DIR="$ICECUBE_DIR/sbt_backend" + +export FOUNDRY="$ICECUBE_DIR/LSE" +export SYNPLIFY_PATH="$ICECUBE_DIR/synpbase" +export LM_LICENSE_FILE="$ICECUBE_DIR/license.dat" + +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH${LD_LIBRARY_PATH:+:}$SBT_DIR/bin/linux/opt:$SBT_DIR/bin/linux/opt/synpwrap:$SBT_DIR/lib/linux/opt:$FOUNDRY/bin/lin64" + +# Give precedence to iCEcube2 tools. +export PATH="$SBT_DIR/bin/linux/opt:$SBT_DIR/bin/linux/opt/synpwrap${PATH:+:}$PATH" + +$* diff --git a/interface2/fpga/rtl/icecube2_flow.tcl b/interface2/fpga/rtl/icecube2_flow.tcl new file mode 100755 index 0000000..f83f760 --- /dev/null +++ b/interface2/fpga/rtl/icecube2_flow.tcl @@ -0,0 +1,6 @@ +#!/usr/bin/tclsh8.5 + +# Place and route, bitmap generation and timing +source [file join $::env(SBT_DIR) "tcl/sbt_backend_synpl.tcl"] + +run_sbt_backend_auto iCE40UP5K-SG48 top [pwd] coax_Implmnt ":edifparser -y pins.pcf" coax diff --git a/interface2/fpga/rtl/pins.pcf b/interface2/fpga/rtl/pins.pcf new file mode 100644 index 0000000..2ba4825 --- /dev/null +++ b/interface2/fpga/rtl/pins.pcf @@ -0,0 +1,25 @@ +set_io clk 37 + +set_io reset_n 20 + +# SPI +set_io spi_sck 15 + +set_io spi_cs_n 16 +set_io spi_sdi 17 +set_io spi_sdo 14 + +# TX +set_io tx_active 35 +set_io tx_n 36 +set_io tx_delay 34 + +# RX +set_io rx 26 + +set_io irq 13 + +set_io gpio0 46 +set_io gpio1 47 +set_io gpio2 48 +set_io gpio3 6 diff --git a/interface2/fpga/rtl/spi_device.v b/interface2/fpga/rtl/spi_device.v new file mode 100644 index 0000000..193efe1 --- /dev/null +++ b/interface2/fpga/rtl/spi_device.v @@ -0,0 +1,79 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +`default_nettype none + +module spi_device ( + input clk, + input spi_sck, + input spi_cs_n, + input spi_sdi, + output spi_sdo, + output reg [7:0] rx_data, + output reg rx_strobe, + input [7:0] tx_data, + input tx_strobe +); + reg [1:0] cs_n_d; + reg [2:0] sck_d; + reg [2:0] sdi_d; + + always @(posedge clk) + begin + cs_n_d <= { cs_n_d[0], spi_cs_n }; + + sck_d <= { sck_d[1:0], spi_sck }; + sdi_d <= { sdi_d[1:0], spi_sdi }; + end + + reg [3:0] counter; + reg [7:0] input_data; + reg [7:0] output_data; + + always @(posedge clk) + begin + rx_strobe <= 0; + + if (tx_strobe) + output_data <= tx_data; + + if (cs_n_d[1]) + begin + counter <= 0; + end + else + begin + if (!sck_d[2] && sck_d[1]) + begin + input_data <= { input_data[6:0], sdi_d[2] }; + counter <= counter + 1; + end + + if (sck_d[2] && !sck_d[1]) + begin + output_data <= { output_data[6:0], 1'b0 }; + + if (counter == 8) + begin + rx_data <= input_data; + rx_strobe <= 1; + + counter <= 0; + end + end + end + end + + assign spi_sdo = output_data[7]; +endmodule diff --git a/interface2/fpga/rtl/strobe_cdc.v b/interface2/fpga/rtl/strobe_cdc.v new file mode 100644 index 0000000..c38ca95 --- /dev/null +++ b/interface2/fpga/rtl/strobe_cdc.v @@ -0,0 +1,42 @@ +// Copyright (c) 2020, Andrew Kay +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +`default_nettype none + +module strobe_cdc ( + input clk_in, + input strobe_in, + input clk_out, + output reg strobe_out +); + reg toggle_in; + + always @(posedge clk_in) + begin + if (strobe_in) + toggle_in <= ~toggle_in; + end + + reg [2:0] toggle_out; + + always @(posedge clk_out) + begin + toggle_out <= { toggle_out[1:0], toggle_in }; + + strobe_out <= 0; + + if (toggle_out[2] != toggle_out[1]) + strobe_out <= 1; + end +endmodule diff --git a/interface2/fpga/rtl/third_party/fifo_sync_ram.v b/interface2/fpga/rtl/third_party/fifo_sync_ram.v new file mode 100644 index 0000000..1da442b --- /dev/null +++ b/interface2/fpga/rtl/third_party/fifo_sync_ram.v @@ -0,0 +1,161 @@ +// https://raw.githubusercontent.com/smunaut/ice40-playground/68ac87f6c458712a41d5b8e305d222849233ff00/cores/misc/rtl/fifo_sync_ram.v + +/* + * fifo_sync_ram.v + * + * vim: ts=4 sw=4 + * + * Copyright (C) 2019 Sylvain Munaut + * All rights reserved. + * + * BSD 3-clause, see LICENSE.bsd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +`default_nettype none + +module fifo_sync_ram #( + parameter integer DEPTH = 256, + parameter integer WIDTH = 16 +)( + input wire [WIDTH-1:0] wr_data, + input wire wr_ena, + output wire wr_full, + + output wire [WIDTH-1:0] rd_data, + input wire rd_ena, + output wire rd_empty, + + input wire clk, + input wire rst +); + + localparam AWIDTH = $clog2(DEPTH); + + + // Signals + // ------- + + // RAM + reg [AWIDTH-1:0] ram_wr_addr; + wire [ WIDTH-1:0] ram_wr_data; + wire ram_wr_ena; + + reg [AWIDTH-1:0] ram_rd_addr; + wire [ WIDTH-1:0] ram_rd_data; + wire ram_rd_ena; + + // Fill-level + reg [AWIDTH:0] level; + (* keep="true" *) wire lvl_dec; + (* keep="true" *) wire lvl_mov; + wire lvl_empty; + + // Full + wire full_nxt; + reg full; + + // Read logic + reg rd_valid; + + + // Fill level counter + // ------------------ + // (counts the number of used words - 1) + + always @(posedge clk or posedge rst) + if (rst) + level <= {(AWIDTH+1){1'b1}}; + else + level <= level + { {AWIDTH{lvl_dec}}, lvl_mov }; + + assign lvl_dec = ram_rd_ena & ~ram_wr_ena; + assign lvl_mov = ram_rd_ena ^ ram_wr_ena; + assign lvl_empty = level[AWIDTH]; + + + // Full flag generation + // -------------------- + + assign full_nxt = level == { 1'b0, {(AWIDTH-2){1'b1}}, 2'b01 }; + + always @(posedge clk or posedge rst) + if (rst) + full <= 1'b0; + else + full <= (full | (wr_ena & ~rd_ena & full_nxt)) & ~(rd_ena & ~wr_ena); + + assign wr_full = full; + + + // Write + // ----- + + always @(posedge clk or posedge rst) + if (rst) + ram_wr_addr <= 0; + else if (ram_wr_ena) + ram_wr_addr <= ram_wr_addr + 1; + + assign ram_wr_data = wr_data; + assign ram_wr_ena = wr_ena; + + + // Read + // ---- + + always @(posedge clk or posedge rst) + if (rst) + ram_rd_addr <= 0; + else if (ram_rd_ena) + ram_rd_addr <= ram_rd_addr + 1; + + assign ram_rd_ena = (rd_ena | ~rd_valid) & ~lvl_empty; + + always @(posedge clk or posedge rst) + if (rst) + rd_valid <= 1'b0; + else if (rd_ena | ~rd_valid) + rd_valid <= ~lvl_empty; + + assign rd_data = ram_rd_data; + assign rd_empty = ~rd_valid; + + + // RAM + // --- + + ram_sdp #( + .AWIDTH(AWIDTH), + .DWIDTH(WIDTH) + ) ram_I ( + .wr_addr(ram_wr_addr), + .wr_data(ram_wr_data), + .wr_ena(ram_wr_ena), + .rd_addr(ram_rd_addr), + .rd_data(ram_rd_data), + .rd_ena(ram_rd_ena), + .clk(clk) + ); +endmodule // fifo_sync_ram diff --git a/interface2/fpga/rtl/third_party/ram_sdp.v b/interface2/fpga/rtl/third_party/ram_sdp.v new file mode 100644 index 0000000..43a845d --- /dev/null +++ b/interface2/fpga/rtl/third_party/ram_sdp.v @@ -0,0 +1,73 @@ +// https://raw.githubusercontent.com/smunaut/ice40-playground/68ac87f6c458712a41d5b8e305d222849233ff00/cores/misc/rtl/ram_sdp.v + +/* + * ram_sdp.v + * + * vim: ts=4 sw=4 + * + * Copyright (C) 2019 Sylvain Munaut + * All rights reserved. + * + * BSD 3-clause, see LICENSE.bsd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +`default_nettype none + +module ram_sdp #( + parameter integer AWIDTH = 9, + parameter integer DWIDTH = 8 +)( + input wire [AWIDTH-1:0] wr_addr, + input wire [DWIDTH-1:0] wr_data, + input wire wr_ena, + + input wire [AWIDTH-1:0] rd_addr, + output reg [DWIDTH-1:0] rd_data, + input wire rd_ena, + + input wire clk +); + // Signals + reg [DWIDTH-1:0] ram [(1<