From fddebc267d73abc930e9465fe451a0a3f635aebe Mon Sep 17 00:00:00 2001 From: Rodrigo Sim Date: Sun, 4 Aug 2024 16:14:55 -0300 Subject: [PATCH] arm/stm32f401rc-rs485: Add support to RFID MFRC522 Signed-off-by: Rodrigo Sim rcsim10@gmail.com --- .../boards/stm32f401rc-rs485/index.rst | 27 ++++++ .../stm32f401rc-rs485/mfrc522_image.jpg | Bin 0 -> 53856 bytes .../arm/stm32/common/include/stm32_mfrc522.h | 79 ++++++++++++++++ boards/arm/stm32/common/src/CMakeLists.txt | 4 + boards/arm/stm32/common/src/Make.defs | 4 + boards/arm/stm32/common/src/stm32_mfrc522.c | 84 ++++++++++++++++++ .../configs/mfrc522/defconfig | 66 ++++++++++++++ .../stm32/stm32f401rc-rs485/include/board.h | 4 + .../stm32f401rc-rs485/src/stm32_bringup.c | 12 +++ .../stm32/stm32f401rc-rs485/src/stm32_spi.c | 11 +++ 10 files changed, 291 insertions(+) create mode 100644 Documentation/platforms/arm/stm32f4/boards/stm32f401rc-rs485/mfrc522_image.jpg create mode 100644 boards/arm/stm32/common/include/stm32_mfrc522.h create mode 100644 boards/arm/stm32/common/src/stm32_mfrc522.c create mode 100644 boards/arm/stm32/stm32f401rc-rs485/configs/mfrc522/defconfig diff --git a/Documentation/platforms/arm/stm32f4/boards/stm32f401rc-rs485/index.rst b/Documentation/platforms/arm/stm32f4/boards/stm32f401rc-rs485/index.rst index c550958f03..339f5064e7 100644 --- a/Documentation/platforms/arm/stm32f4/boards/stm32f401rc-rs485/index.rst +++ b/Documentation/platforms/arm/stm32f4/boards/stm32f401rc-rs485/index.rst @@ -664,3 +664,30 @@ you can configure this using menuconfig:: Number of 8x8 LEDs matrices in the horizontal (width) Number of 8x8 LEDs matrices in the vertical (height) + +mfrc522 +------- + +Configures the NuttShell (nsh) over USB Serial (check usbserial configuration) and enables RFID driver with +MFRC522:: + + nsh> rfid_readuid + Trying to READ: Card is not present! + Trying to READ: Card is not present! + Trying to READ: RFID CARD UID = 0x3DB3F169 + + +======= ==== +MFRC522 PINS +======= ==== +SCK PA5 +MISO PA6 +MOSI PA7 +CS PC5 +======= ==== + +The board used is based on MFRC522 NXP IC that supports contactless communication +at 13.56 MHz and ISO/IEC 14443 A/MIFARE and NTAG. + +.. figure:: mfrc522_image.jpg + :align: center diff --git a/Documentation/platforms/arm/stm32f4/boards/stm32f401rc-rs485/mfrc522_image.jpg b/Documentation/platforms/arm/stm32f4/boards/stm32f401rc-rs485/mfrc522_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6381a4c3f8a512e9fd6596f5035ddc6283f99074 GIT binary patch literal 53856 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 literal 0 HcmV?d00001 diff --git a/boards/arm/stm32/common/include/stm32_mfrc522.h b/boards/arm/stm32/common/include/stm32_mfrc522.h new file mode 100644 index 0000000000..75f7266d5f --- /dev/null +++ b/boards/arm/stm32/common/include/stm32_mfrc522.h @@ -0,0 +1,79 @@ +/**************************************************************************** + * boards/arm/stm32/common/include/stm32_mfrc522.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_STM32_COMMON_INCLUDE_STM32_MFRC522_H +#define __BOARDS_ARM_STM32_COMMON_INCLUDE_STM32_MFRC522_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifdef __cplusplus +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Inline Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: stm32_mfrc522initialize + * + * Description: + * Initialize and register the MFRC522 RFID driver. + * + * Input Parameters: + * devpath - The full path to the driver to register. E.g., "/dev/rfid0" + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +int stm32_mfrc522initialize(const char *devpath); + +#undef EXTERN +#ifdef __cplusplus +} +#endif + +#endif /* __BOARDS_ARM_STM32_COMMON_INCLUDE_STM32_MFRC522_H */ diff --git a/boards/arm/stm32/common/src/CMakeLists.txt b/boards/arm/stm32/common/src/CMakeLists.txt index cfd9465b74..4c6c4df796 100644 --- a/boards/arm/stm32/common/src/CMakeLists.txt +++ b/boards/arm/stm32/common/src/CMakeLists.txt @@ -120,6 +120,10 @@ if(CONFIG_LCD_MAX7219) list(APPEND SRCS stm32_max7219_matrix.c) endif() +if(CONFIG_CL_MFRC522) + list(APPEND SRCS stm32_mfrc522.c) +endif() + if(CONFIG_LIS3DSH) list(APPEND SRCS stm32_lis3dsh.c) endif() diff --git a/boards/arm/stm32/common/src/Make.defs b/boards/arm/stm32/common/src/Make.defs index 324c1e66c2..ddb698c13b 100644 --- a/boards/arm/stm32/common/src/Make.defs +++ b/boards/arm/stm32/common/src/Make.defs @@ -128,6 +128,10 @@ ifeq ($(CONFIG_LCD_MAX7219),y) CSRCS += stm32_max7219_matrix.c endif +ifeq ($(CONFIG_CL_MFRC522),y) + CSRCS += stm32_mfrc522.c +endif + ifeq ($(CONFIG_LIS3DSH),y) CSRCS += stm32_lis3dsh.c endif diff --git a/boards/arm/stm32/common/src/stm32_mfrc522.c b/boards/arm/stm32/common/src/stm32_mfrc522.c new file mode 100644 index 0000000000..4fda6901f6 --- /dev/null +++ b/boards/arm/stm32/common/src/stm32_mfrc522.c @@ -0,0 +1,84 @@ +/**************************************************************************** + * boards/arm/stm32/common/src/stm32_mfrc522.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include +#include + +#include "stm32.h" +#include "stm32_spi.h" + +#if defined(CONFIG_SPI) && defined(CONFIG_STM32_SPI1) && defined(CONFIG_CL_MFRC522) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define MFRC522_SPI_PORTNO 1 /* On SPI1 */ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: stm32_mfrc522initialize + * + * Description: + * Initialize and register the MFRC522 RFID driver. + * + * Input Parameters: + * devpath - The full path to the driver to register. E.g., "/dev/rfid0" + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +int stm32_mfrc522initialize(const char *devpath) +{ + struct spi_dev_s *spi; + int ret; + spi = stm32_spibus_initialize(MFRC522_SPI_PORTNO); + if (!spi) + { + return -ENODEV; + } + + /* Then register the MFRC522 */ + + ret = mfrc522_register(devpath, spi); + if (ret < 0) + { + snerr("ERROR: Error registering MFRC522\n"); + } + + return ret; +} + +#endif /* CONFIG_SPI && CONFIG_MFRC522 */ diff --git a/boards/arm/stm32/stm32f401rc-rs485/configs/mfrc522/defconfig b/boards/arm/stm32/stm32f401rc-rs485/configs/mfrc522/defconfig new file mode 100644 index 0000000000..2f0acaf0e4 --- /dev/null +++ b/boards/arm/stm32/stm32f401rc-rs485/configs/mfrc522/defconfig @@ -0,0 +1,66 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_ARCH_FPU is not set +# CONFIG_NSH_ARGCAT is not set +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +# CONFIG_NSH_DISABLE_IFCONFIG is not set +# CONFIG_NSH_DISABLE_PS is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="stm32f401rc-rs485" +CONFIG_ARCH_BOARD_COMMON=y +CONFIG_ARCH_BOARD_STM32F401RC_RS485=y +CONFIG_ARCH_BUTTONS=y +CONFIG_ARCH_CHIP="stm32" +CONFIG_ARCH_CHIP_STM32=y +CONFIG_ARCH_CHIP_STM32F401RC=y +CONFIG_ARCH_INTERRUPTSTACK=2048 +CONFIG_ARCH_IRQBUTTONS=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARDCTL_USBDEVCTRL=y +CONFIG_BOARD_LOOPSPERMSEC=8499 +CONFIG_BUILTIN=y +CONFIG_CDCACM=y +CONFIG_CDCACM_CONSOLE=y +CONFIG_CL_MFRC522=y +CONFIG_DRIVERS_CONTACTLESS=y +CONFIG_EXAMPLES_BUTTONS=y +CONFIG_EXAMPLES_BUTTONS_NAME0="SW3" +CONFIG_EXAMPLES_BUTTONS_NAME1="SW4" +CONFIG_EXAMPLES_BUTTONS_NAME2="SW5" +CONFIG_EXAMPLES_BUTTONS_NAMES=y +CONFIG_EXAMPLES_BUTTONS_QTD=3 +CONFIG_EXAMPLES_RFID_READUID=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INPUT=y +CONFIG_INPUT_BUTTONS=y +CONFIG_INPUT_BUTTONS_LOWER=y +CONFIG_INTELHEX_BINARY=y +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_LINELEN=64 +CONFIG_NSH_READLINE=y +CONFIG_PREALLOC_TIMERS=4 +CONFIG_RAM_SIZE=98304 +CONFIG_RAM_START=0x20000000 +CONFIG_RAW_BINARY=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_WAITPID=y +CONFIG_START_DAY=5 +CONFIG_START_MONTH=5 +CONFIG_START_YEAR=2014 +CONFIG_STM32_JTAG_SW_ENABLE=y +CONFIG_STM32_OTGFS=y +CONFIG_STM32_PWR=y +CONFIG_STM32_SPI1=y +CONFIG_STM32_USART6=y +CONFIG_SYSTEM_NSH=y +CONFIG_TASK_NAME_SIZE=0 +CONFIG_USBDEV=y diff --git a/boards/arm/stm32/stm32f401rc-rs485/include/board.h b/boards/arm/stm32/stm32f401rc-rs485/include/board.h index 706c266a14..1deaf475cd 100644 --- a/boards/arm/stm32/stm32f401rc-rs485/include/board.h +++ b/boards/arm/stm32/stm32f401rc-rs485/include/board.h @@ -340,6 +340,10 @@ extern "C" #define STM32_LCD_CS (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\ GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN4) +/* MFRC522 */ + +#define GPIO_RFID_CS (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\ + GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN5) /* LEDs * * The STM32F401RC-RS485 boards provide 4 blue user LEDs. LD1, LD2, LD3 diff --git a/boards/arm/stm32/stm32f401rc-rs485/src/stm32_bringup.c b/boards/arm/stm32/stm32f401rc-rs485/src/stm32_bringup.c index d1d0833799..cd8f236be0 100644 --- a/boards/arm/stm32/stm32f401rc-rs485/src/stm32_bringup.c +++ b/boards/arm/stm32/stm32f401rc-rs485/src/stm32_bringup.c @@ -67,6 +67,10 @@ #include "stm32_max7219_matrix.h" #endif +#ifdef CONFIG_CL_MFRC522 +#include "stm32_mfrc522.h" +#endif + #ifdef CONFIG_STEPPER_DRV8825 #include "stm32_drv8266.h" #endif @@ -286,5 +290,13 @@ int stm32_bringup(void) } #endif +#ifdef CONFIG_CL_MFRC522 + ret = stm32_mfrc522initialize("/dev/rfid0"); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: stm32_mfrc522initialize() failed: %d\n", ret); + } +#endif + return ret; } diff --git a/boards/arm/stm32/stm32f401rc-rs485/src/stm32_spi.c b/boards/arm/stm32/stm32f401rc-rs485/src/stm32_spi.c index 987e225145..fd7bfeb72b 100644 --- a/boards/arm/stm32/stm32f401rc-rs485/src/stm32_spi.c +++ b/boards/arm/stm32/stm32f401rc-rs485/src/stm32_spi.c @@ -62,6 +62,10 @@ void weak_function stm32_spidev_initialize(void) #ifdef CONFIG_LCD_MAX7219 stm32_configgpio(STM32_LCD_CS); /* MAX7219 chip select */ #endif + +#ifdef CONFIG_CL_MFRC522 + stm32_configgpio(GPIO_RFID_CS); /* MFRC522 chip select */ +#endif } /**************************************************************************** @@ -110,6 +114,13 @@ void stm32_spi1select(struct spi_dev_s *dev, stm32_gpiowrite(STM32_LCD_CS, !selected); } #endif + + #if defined(CONFIG_CL_MFRC522) + if (devid == SPIDEV_CONTACTLESS(0)) + { + stm32_gpiowrite(GPIO_RFID_CS, !selected); + } + #endif } uint8_t stm32_spi1status(struct spi_dev_s *dev, uint32_t devid)