From 36eb783fc7b28cea1f00a7876af253eb49c7f57a Mon Sep 17 00:00:00 2001 From: xupenghu_huaweipc Date: Fri, 10 Apr 2020 09:36:53 +0800 Subject: [PATCH 01/27] add bsp/stm32/stm32l010-st-nucleo --- bsp/stm32/README.md | 2 + bsp/stm32/stm32l010-st-nucleo/.config | 364 +++ bsp/stm32/stm32l010-st-nucleo/.gitignore | 42 + bsp/stm32/stm32l010-st-nucleo/Kconfig | 21 + bsp/stm32/stm32l010-st-nucleo/README.md | 120 + bsp/stm32/stm32l010-st-nucleo/SConscript | 15 + bsp/stm32/stm32l010-st-nucleo/SConstruct | 60 + .../applications/SConscript | 11 + .../stm32l010-st-nucleo/applications/main.c | 33 + .../board/CubeMX_Config/.mxproject | 14 + .../board/CubeMX_Config/CubeMX_Config.ioc | 114 + .../board/CubeMX_Config/Inc/main.h | 71 + .../CubeMX_Config/Inc/stm32l0xx_hal_conf.h | 302 ++ .../board/CubeMX_Config/Inc/stm32l0xx_it.h | 65 + .../board/CubeMX_Config/Src/main.c | 238 ++ .../CubeMX_Config/Src/stm32l0xx_hal_msp.c | 149 + .../board/CubeMX_Config/Src/stm32l0xx_it.c | 145 + .../CubeMX_Config/Src/system_stm32l0xx.c | 279 ++ bsp/stm32/stm32l010-st-nucleo/board/Kconfig | 48 + .../stm32l010-st-nucleo/board/SConscript | 34 + bsp/stm32/stm32l010-st-nucleo/board/board.c | 69 + bsp/stm32/stm32l010-st-nucleo/board/board.h | 50 + .../board/linker_scripts/link.icf | 29 + .../board/linker_scripts/link.lds | 157 + .../board/linker_scripts/link.sct | 16 + .../stm32l010-st-nucleo/figures/board.jpg | Bin 0 -> 161179 bytes bsp/stm32/stm32l010-st-nucleo/project.ewd | 2834 +++++++++++++++++ bsp/stm32/stm32l010-st-nucleo/project.ewp | 2259 +++++++++++++ bsp/stm32/stm32l010-st-nucleo/project.eww | 10 + bsp/stm32/stm32l010-st-nucleo/project.uvoptx | 932 ++++++ bsp/stm32/stm32l010-st-nucleo/project.uvprojx | 717 +++++ bsp/stm32/stm32l010-st-nucleo/rtconfig.h | 170 + bsp/stm32/stm32l010-st-nucleo/rtconfig.py | 143 + bsp/stm32/stm32l010-st-nucleo/template.ewp | 2031 ++++++++++++ bsp/stm32/stm32l010-st-nucleo/template.eww | 10 + bsp/stm32/stm32l010-st-nucleo/template.uvoptx | 192 ++ .../stm32l010-st-nucleo/template.uvprojx | 395 +++ 37 files changed, 12141 insertions(+) create mode 100644 bsp/stm32/stm32l010-st-nucleo/.config create mode 100644 bsp/stm32/stm32l010-st-nucleo/.gitignore create mode 100644 bsp/stm32/stm32l010-st-nucleo/Kconfig create mode 100644 bsp/stm32/stm32l010-st-nucleo/README.md create mode 100644 bsp/stm32/stm32l010-st-nucleo/SConscript create mode 100644 bsp/stm32/stm32l010-st-nucleo/SConstruct create mode 100644 bsp/stm32/stm32l010-st-nucleo/applications/SConscript create mode 100644 bsp/stm32/stm32l010-st-nucleo/applications/main.c create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_hal_conf.h create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_it.h create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_hal_msp.c create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_it.c create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/system_stm32l0xx.c create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/Kconfig create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/SConscript create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/board.c create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/board.h create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32l010-st-nucleo/figures/board.jpg create mode 100644 bsp/stm32/stm32l010-st-nucleo/project.ewd create mode 100644 bsp/stm32/stm32l010-st-nucleo/project.ewp create mode 100644 bsp/stm32/stm32l010-st-nucleo/project.eww create mode 100644 bsp/stm32/stm32l010-st-nucleo/project.uvoptx create mode 100644 bsp/stm32/stm32l010-st-nucleo/project.uvprojx create mode 100644 bsp/stm32/stm32l010-st-nucleo/rtconfig.h create mode 100644 bsp/stm32/stm32l010-st-nucleo/rtconfig.py create mode 100644 bsp/stm32/stm32l010-st-nucleo/template.ewp create mode 100644 bsp/stm32/stm32l010-st-nucleo/template.eww create mode 100644 bsp/stm32/stm32l010-st-nucleo/template.uvoptx create mode 100644 bsp/stm32/stm32l010-st-nucleo/template.uvprojx diff --git a/bsp/stm32/README.md b/bsp/stm32/README.md index a414e4a4c0..942e040b18 100644 --- a/bsp/stm32/README.md +++ b/bsp/stm32/README.md @@ -1,3 +1,4 @@ + # STM32 BSP 说明 STM32 系列 BSP 目前支持情况如下表所示: @@ -43,6 +44,7 @@ STM32 系列 BSP 目前支持情况如下表所示: | [stm32h743-st-nucleo](stm32h743-st-nucleo) | ST 官方 STM32H743-nucleo 开发板 | | [stm32h747-st-discovery](stm32h747-st-discovery) | ST 官方 STM32H747I-discovery 开发板 | | **L0 系列** | | +| [stm32l010-st-nucleo](stm32l010-st-nucleo) | ST 官方 STM32L010-nucleo 开发板 | | [stm32l053-st-nucleo](stm32l053-st-nucleo) | ST 官方 STM32L053-nucleo 开发板 | | **L4 系列** | | | [stm32l4r9-st-eval](stm32l4r9-st-eval) | ST 官方 STM32L4R9I-EVAL 开发板 | diff --git a/bsp/stm32/stm32l010-st-nucleo/.config b/bsp/stm32/stm32l010-st-nucleo/.config new file mode 100644 index 0000000000..1b8152d27b --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/.config @@ -0,0 +1,364 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set +CONFIG_RT_DEBUG=y +CONFIG_RT_DEBUG_COLOR=y +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +# CONFIG_RT_USING_MEMHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMTRACE is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=256 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart2" +CONFIG_RT_VER_NUM=0x40003 +CONFIG_ARCH_ARM=y +# CONFIG_RT_USING_CPU_FFS is not set +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M0=y +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 + +# +# C++ features +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Command shell +# +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=1024 +CONFIG_FINSH_CMD_SIZE=80 +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_USING_MSH_DEFAULT=y +CONFIG_FINSH_USING_MSH_ONLY=y +CONFIG_FINSH_ARG_MAX=10 + +# +# Device virtual file system +# +# CONFIG_RT_USING_DFS is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_PIPE_BUFSZ=512 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +# CONFIG_RT_USING_LIBC is not set +# CONFIG_RT_USING_PTHREADS is not set +CONFIG_RT_LIBC_USING_TIME=y + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LIBMODBUS is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_WIZNET is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOTKIT is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_QSDK is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_libsodium is not set +# CONFIG_PKG_USING_TINYCRYPT is not set + +# +# language packages +# +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set + +# +# multimedia packages +# +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ADBD is not set + +# +# system packages +# +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_CMSIS is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_THREAD_POOL is not set + +# +# peripheral libraries and drivers +# +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_AT24CXX is not set + +# +# miscellaneous packages +# +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_NNOM is not set +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32L0=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32L010RB=y + +# +# Onboard Peripheral Drivers +# +# CONFIG_BSP_USING_USB_TO_USART is not set + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART2=y +# CONFIG_BSP_UART2_RX_USING_DMA is not set +# CONFIG_BSP_USING_UDID is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32l010-st-nucleo/.gitignore b/bsp/stm32/stm32l010-st-nucleo/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/.gitignore @@ -0,0 +1,42 @@ +*.pyc +*.map +*.dblite +*.elf +*.bin +*.hex +*.axf +*.exe +*.pdb +*.idb +*.ilk +*.old +build +Debug +documentation/html +packages/ +*~ +*.o +*.obj +*.out +*.bak +*.dep +*.lib +*.i +*.d +.DS_Stor* +.config 3 +.config 4 +.config 5 +Midea-X1 +*.uimg +GPATH +GRTAGS +GTAGS +.vscode +JLinkLog.txt +JLinkSettings.ini +DebugConfig/ +RTE/ +settings/ +*.uvguix* +cconfig.h diff --git a/bsp/stm32/stm32l010-st-nucleo/Kconfig b/bsp/stm32/stm32l010-st-nucleo/Kconfig new file mode 100644 index 0000000000..79b160b856 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/Kconfig @@ -0,0 +1,21 @@ +mainmenu "RT-Thread Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "../libraries/Kconfig" +source "board/Kconfig" diff --git a/bsp/stm32/stm32l010-st-nucleo/README.md b/bsp/stm32/stm32l010-st-nucleo/README.md new file mode 100644 index 0000000000..6b8613bb36 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/README.md @@ -0,0 +1,120 @@ + +# NUCLEO-L010RB 开发板 BSP 说明 + +## 简介 + +本文档为ST官方 NUCLEO-L010RB 开发板的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +NUCLEO-L010RB 开发板是 ST 官方推出的一款基于 ARM Cortex-M0+ 内核的开发板,绿色的 Nucleo 标志显示了这款芯片是低功耗系列,板载 ST-LINK/V2-1 调试器/编程器,该开发板具有丰富的扩展接口,且与Arduino™ nano 接口兼容,可以方便验证 STM32L010RB 芯片的性能。 + +开发板外观如下图所示: + +![board](figures/board.jpg) + +该开发板常用 **板载资源** 如下: + +- MCU:STM32L010RB + - 主频 32MHz + - 128KB FLASH + - 20KB RAM + - 512 byte EEPROM +- 常用外设 + - LED:3个,USB communication(LD1 双色),power LED(LD3 红色),user LED(LD2 黄色) + - 按键:1个,B1(兼具唤醒功能,PC13),B2(RESET) +- 常用接口:USB 支持 3 种不同接口:虚拟 COM 端口、大容量存储和调试端口;arduino 接口等 +- 调试接口:标准 SWD + +开发板更多详细信息请参考[STMicroelectronics NUCLEO-L010RB](https://www.st.com/content/st_com/en/products/evaluation-tools/product-evaluation-tools/mcu-mpu-eval-tools/stm32-mcu-mpu-eval-tools/stm32-nucleo-boards/nucleo-l010rb.html#overview)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------------- | :----------: | :------------------------------------- | +| 板载 ST-LINK 转串口 | 支持 | | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | PA0, PA1... PC15 ---> PIN: 0, 1...47 | +| UART | 支持 | UART2 | +| SPI | 暂不支持 | | +| I2C | 暂不支持 | | +| RTC | 暂不支持 | | +| PWM | 暂不支持 | | +| USB Device | 暂不支持 | | +| IWG | 暂不支持 | | +| **扩展模块** | **支持情况** | **备注** | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,打开电源开关。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 ST-LINK 仿真器下载程序,在通过 microUSB 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,红色 LED1 和 LED3 常亮、黄色 LED2 会周期性闪烁。 + +USB 虚拟 COM 端口默认连接串口 2,在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.0.3 build Apr 9 2020 + 2006 - 2020 Copyright by rt-thread team +msh > + +``` +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 串口 2 的功能,如果需使用更多高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk5/iar` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32系列BSP外设驱动使用教程.md)。 + +## 注意事项 + +- 开机时如果不能打印 RT-Thread 版本信息,请将BSP中串口 GPIO 速率调低 +- 开机时如果不能打印 RT-Thread 版本信息,请重新选择 PC 端串口调试软件的串口号 + +## 联系人信息 + +- 维护人: [xph](https://github.com/xupenghu) +- 邮箱: diff --git a/bsp/stm32/stm32l010-st-nucleo/SConscript b/bsp/stm32/stm32l010-st-nucleo/SConscript new file mode 100644 index 0000000000..20f7689c53 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/stm32/stm32l010-st-nucleo/SConstruct b/bsp/stm32/stm32l010-st-nucleo/SConstruct new file mode 100644 index 0000000000..5fcb889bc2 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/SConstruct @@ -0,0 +1,60 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +TARGET = 'rt-thread.' + rtconfig.TARGET_EXT + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.map') + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +stm32_library = 'STM32L0xx_HAL' +rtconfig.BSP_LIBRARY_TYPE = stm32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/stm32/stm32l010-st-nucleo/applications/SConscript b/bsp/stm32/stm32l010-st-nucleo/applications/SConscript new file mode 100644 index 0000000000..01eb940dfb --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/applications/SConscript @@ -0,0 +1,11 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * + +cwd = os.path.join(str(Dir('#')), 'applications') +src = Glob('*.c') +CPPPATH = [cwd, str(Dir('#'))] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/stm32/stm32l010-st-nucleo/applications/main.c b/bsp/stm32/stm32l010-st-nucleo/applications/main.c new file mode 100644 index 0000000000..8541bd3b9f --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/applications/main.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift change to new framework + */ + +#include +#include +#include + +/* defined the LED pin: PA5 */ +#define LED0_PIN GET_PIN(A, 5) + +int main(void) +{ + int count = 1; + /* set LED0 pin mode to output */ + rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); + + while (count++) + { + rt_pin_write(LED0_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED0_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + + return RT_EOK; +} diff --git a/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..8450d50e58 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/.mxproject @@ -0,0 +1,14 @@ +[PreviousGenFiles] +HeaderPath=D:/GitHub/rt-thread/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Inc +HeaderFiles=stm32l0xx_it.h;stm32l0xx_hal_conf.h;main.h; +SourcePath=D:/GitHub/rt-thread/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src +SourceFiles=stm32l0xx_it.c;stm32l0xx_hal_msp.c;main.c; + +[PreviousLibFiles] +LibFiles=Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_tim.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_tim_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_uart.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_uart_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_def.h;Drivers/STM32L0xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_i2c.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_i2c_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_rcc.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_rcc_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_flash_ramfunc.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_flash.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_flash_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_gpio.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_gpio_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_dma.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_dma_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_pwr.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_pwr_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_cortex.h;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_tim.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_tim_ex.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_uart.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_uart_ex.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_i2c.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_i2c_ex.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_rcc.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_rcc_ex.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash_ramfunc.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash_ex.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_gpio.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_dma.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_pwr.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_pwr_ex.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_cortex.c;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_tim.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_tim_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_uart.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_uart_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_def.h;Drivers/STM32L0xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_i2c.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_i2c_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_rcc.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_rcc_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_flash_ramfunc.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_flash.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_flash_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_gpio.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_gpio_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_dma.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_dma_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_pwr.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_pwr_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_cortex.h;Drivers/CMSIS/Device/ST/STM32L0xx/Include/stm32l010xb.h;Drivers/CMSIS/Device/ST/STM32L0xx/Include/stm32l0xx.h;Drivers/CMSIS/Device/ST/STM32L0xx/Include/system_stm32l0xx.h;Drivers/CMSIS/Device/ST/STM32L0xx/Source/Templates/system_stm32l0xx.c;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; + +[PreviousUsedKeilFiles] +SourceFiles=..\Src\main.c;..\Src\stm32l0xx_it.c;..\Src\stm32l0xx_hal_msp.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_tim.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_tim_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_uart.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_uart_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_i2c.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_i2c_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_rcc.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_rcc_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash_ramfunc.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_gpio.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_dma.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_pwr.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_pwr_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_cortex.c;../\Src/system_stm32l0xx.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_tim.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_tim_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_uart.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_uart_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_i2c.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_i2c_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_rcc.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_rcc_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash_ramfunc.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_gpio.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_dma.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_pwr.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_pwr_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_cortex.c;../\Src/system_stm32l0xx.c;../Drivers/CMSIS/Device/ST/STM32L0xx/Source/Templates/system_stm32l0xx.c;null; +HeaderPath=..\Drivers\STM32L0xx_HAL_Driver\Inc;..\Drivers\STM32L0xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32L0xx\Include;..\Drivers\CMSIS\Include;..\Inc; +CDefines=USE_HAL_DRIVER;STM32L010xB;USE_HAL_DRIVER;STM32L010xB; + diff --git a/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 0000000000..fd1de238ea --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,114 @@ +#MicroXplorer Configuration settings - do not modify +File.Version=6 +KeepUserPlacement=false +Mcu.Family=STM32L0 +Mcu.IP0=NVIC +Mcu.IP1=RCC +Mcu.IP2=SYS +Mcu.IP3=USART2 +Mcu.IPNb=4 +Mcu.Name=STM32L010RBTx +Mcu.Package=LQFP64 +Mcu.Pin0=PC14-OSC32_IN +Mcu.Pin1=PC15-OSC32_OUT +Mcu.Pin2=PH0-OSC_IN +Mcu.Pin3=PH1-OSC_OUT +Mcu.Pin4=PA2 +Mcu.Pin5=PA3 +Mcu.Pin6=VP_SYS_VS_Systick +Mcu.PinsNb=7 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32L010RBTx +MxCube.Version=5.3.0 +MxDb.Version=DB.5.0.30 +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.SVC_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PA3.Mode=Asynchronous +PA3.Signal=USART2_RX +PC14-OSC32_IN.Mode=LSE-External-Oscillator +PC14-OSC32_IN.Signal=RCC_OSC32_IN +PC15-OSC32_OUT.Mode=LSE-External-Oscillator +PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PCC.Checker=true +PCC.Line=STM32L0x0 Value Line +PCC.MCU=STM32L010RBTx +PCC.PartNumber=STM32L010RBTx +PCC.Seq0=0 +PCC.Series=STM32L0 +PCC.Temperature=25 +PCC.Vdd=3.0 +PH0-OSC_IN.Mode=HSE-External-Oscillator +PH0-OSC_IN.Signal=RCC_OSC_IN +PH1-OSC_OUT.Mode=HSE-External-Oscillator +PH1-OSC_OUT.Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32L010RBTx +ProjectManager.FirmwarePackage=STM32Cube FW_L0 V1.11.2 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=0 +ProjectManager.MainLocation=Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=STM32L010RB_Test.ioc +ProjectManager.ProjectName=STM32L010RB_Test +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=MDK-ARM V5 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART2_Init-USART2-false-HAL-true +RCC.AHBFreq_Value=32000000 +RCC.APB1Freq_Value=32000000 +RCC.APB1TimFreq_Value=32000000 +RCC.APB2Freq_Value=32000000 +RCC.APB2TimFreq_Value=32000000 +RCC.FCLKCortexFreq_Value=32000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=32000000 +RCC.HSE_VALUE=8000000 +RCC.HSI16_VALUE=16000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=32000000 +RCC.IPParameters=AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI16_VALUE,HSI_VALUE,I2C1Freq_Value,LPTIMFreq_Value,LPUARTFreq_Value,LSI_VALUE,MCOPinFreq_Value,MSI_VALUE,PLLCLKFreq_Value,PLLMUL,PLLSourceVirtual,PWRFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,TIMFreq_Value,TimerFreq_Value,USART2Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,WatchDogFreq_Value +RCC.LPTIMFreq_Value=32000000 +RCC.LPUARTFreq_Value=32000000 +RCC.LSI_VALUE=37000 +RCC.MCOPinFreq_Value=32000000 +RCC.MSI_VALUE=2097000 +RCC.PLLCLKFreq_Value=32000000 +RCC.PLLMUL=RCC_PLLMUL_8 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +RCC.PWRFreq_Value=32000000 +RCC.RTCFreq_Value=37000 +RCC.RTCHSEDivFreq_Value=4000000 +RCC.SYSCLKFreq_VALUE=32000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.TIMFreq_Value=32000000 +RCC.TimerFreq_Value=32000000 +RCC.USART2Freq_Value=32000000 +RCC.VCOInputFreq_Value=8000000 +RCC.VCOOutputFreq_Value=64000000 +RCC.WatchDogFreq_Value=37000 +USART2.IPParameters=VirtualMode-Asynchronous +USART2.VirtualMode-Asynchronous=VM_ASYNC +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=custom diff --git a/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..dd129ce7c3 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,71 @@ +/* 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 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 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l0xx_hal.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/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_hal_conf.h b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_hal_conf.h new file mode 100644 index 0000000000..224365aeb3 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_hal_conf.h @@ -0,0 +1,302 @@ +/** + ****************************************************************************** + * @file stm32l0xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration template file. + * This file should be copied to the application folder and renamed + * to stm32l0xx_hal_conf.h. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2016 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 __STM32L0xx_HAL_CONF_H +#define __STM32L0xx_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_COMP_MODULE_ENABLED */ +/*#define HAL_CRC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +/*#define HAL_FIREWALL_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +/*#define HAL_LCD_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SPI_MODULE_ENABLED */ +/*#define HAL_TIM_MODULE_ENABLED */ +/*#define HAL_TSC_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SMBUS_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +/*#define HAL_EXTI_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_I2C_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)2097000U) /*!< 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 for USB (HSI48) value. + */ +#if !defined (HSI48_VALUE) +#define HSI48_VALUE ((uint32_t)48000000U) /*!< Value of the Internal High Speed oscillator for USB in Hz. + The real value may vary depending on the variations + in voltage and temperature. */ +#endif /* HSI48_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)37000U) /*!< 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 ((uint32_t)32768U) /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/* 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 ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 0U +#define PREREAD_ENABLE 1U +#define BUFFER_CACHE_DISABLE 0U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32l0xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32l0xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32l0xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32l0xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32l0xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32l0xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED + #include "stm32l0xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32l0xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32l0xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32l0xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_FIREWALL_MODULE_ENABLED + #include "stm32l0xx_hal_firewall.h" +#endif /* HAL_FIREWALL_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32l0xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32l0xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32l0xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32l0xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LCD_MODULE_ENABLED + #include "stm32l0xx_hal_lcd.h" +#endif /* HAL_LCD_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32l0xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32l0xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32l0xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32l0xx_hal_rtc.h" + +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32l0xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32l0xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_TSC_MODULE_ENABLED + #include "stm32l0xx_hal_tsc.h" +#endif /* HAL_TSC_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32l0xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32l0xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32l0xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32l0xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32l0xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32l0xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32l0xx_hal_pcd.h" +#endif /* HAL_PCD_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 /* __STM32L0xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_it.h b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_it.h new file mode 100644 index 0000000000..e75e56bd0b --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_it.h @@ -0,0 +1,65 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l0xx_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 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 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32L0xx_IT_H +#define __STM32L0xx_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 SVC_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L0xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..0cb4860658 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/main.c @@ -0,0 +1,238 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 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 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +UART_HandleTypeDef huart2; + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART2_UART_Init(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART2_UART_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + /** Configure the main internal regulator output voltage + */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_8; + RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief USART2 Initialization Function + * @param None + * @retval None + */ +static void MX_USART2_UART_Init(void) +{ + + /* USER CODE BEGIN USART2_Init 0 */ + + /* USER CODE END USART2_Init 0 */ + + /* USER CODE BEGIN USART2_Init 1 */ + + /* USER CODE END USART2_Init 1 */ + huart2.Instance = USART2; + huart2.Init.BaudRate = 115200; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&huart2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART2_Init 2 */ + + /* USER CODE END USART2_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_hal_msp.c b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_hal_msp.c new file mode 100644 index 0000000000..3570c90a39 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_hal_msp.c @@ -0,0 +1,149 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32l0xx_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 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 + * + ****************************************************************************** + */ +/* 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 */ +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART2_MspInit 1 */ + + /* USER CODE END USART2_MspInit 1 */ + } + +} + +/** +* @brief UART MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); + + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_it.c b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_it.c new file mode 100644 index 0000000000..52e4aa9e44 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_it.c @@ -0,0 +1,145 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l0xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 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 + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32l0xx_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 --------------------------------------------------------*/ + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M0+ 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 System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVC_IRQn 0 */ + + /* USER CODE END SVC_IRQn 0 */ + /* USER CODE BEGIN SVC_IRQn 1 */ + + /* USER CODE END SVC_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 */ +} + +/******************************************************************************/ +/* STM32L0xx 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_stm32l0xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/system_stm32l0xx.c b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/system_stm32l0xx.c new file mode 100644 index 0000000000..814b0c752e --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/CubeMX_Config/Src/system_stm32l0xx.c @@ -0,0 +1,279 @@ +/** + ****************************************************************************** + * @file system_stm32l0xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M0+ 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_stm32l0xx.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. + * + * + ****************************************************************************** + * @attention + * + *

© Copyright(c) 2016 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 + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32l0xx_system + * @{ + */ + +/** @addtogroup STM32L0xx_System_Private_Includes + * @{ + */ + +#include "stm32l0xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (MSI_VALUE) + #define MSI_VALUE ((uint32_t)2097152U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* MSI_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + + +/** + * @} + */ + +/** @addtogroup STM32L0xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L0xx_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 0x00U /*!< Vector Table base offset field. + This value must be a multiple of 0x100. */ +/******************************************************************************/ +/** + * @} + */ + +/** @addtogroup STM32L0xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L0xx_System_Private_Variables + * @{ + */ + /* This 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 = 2097152U; /* 32.768 kHz * 2^6 */ + 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 uint8_t PLLMulTable[9] = {3U, 4U, 6U, 8U, 12U, 16U, 24U, 32U, 48U}; + +/** + * @} + */ + +/** @addtogroup STM32L0xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L0xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ +void SystemInit (void) +{ +/*!< Set MSION bit */ + RCC->CR |= (uint32_t)0x00000100U; + + /*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], MCOSEL[2:0] and MCOPRE[2:0] bits */ + RCC->CFGR &= (uint32_t) 0x88FF400CU; + + /*!< Reset HSION, HSIDIVEN, HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFF6U; + + /*!< Reset HSI48ON bit */ + RCC->CRRCR &= (uint32_t)0xFFFFFFFEU; + + /*!< Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFFU; + + /*!< Reset PLLSRC, PLLMUL[3:0] and PLLDIV[1:0] bits */ + RCC->CFGR &= (uint32_t)0xFF02FFFFU; + + /*!< 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 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 as defined by the MSI range. + * + * - 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(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32l0xx_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 stm32l0xx_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, pllmul = 0U, plldiv = 0U, pllsource = 0U, msirange = 0U; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00U: /* MSI used as system clock */ + msirange = (RCC->ICSCR & RCC_ICSCR_MSIRANGE) >> RCC_ICSCR_MSIRANGE_Pos; + SystemCoreClock = (32768U * (1U << (msirange + 1U))); + break; + case 0x04U: /* HSI used as system clock */ + if ((RCC->CR & RCC_CR_HSIDIVF) != 0U) + { + SystemCoreClock = HSI_VALUE / 4U; + } + else + { + SystemCoreClock = HSI_VALUE; + } + break; + case 0x08U: /* HSE used as system clock */ + SystemCoreClock = HSE_VALUE; + break; + default: /* PLL used as system clock */ + /* Get PLL clock source and multiplication factor ----------------------*/ + pllmul = RCC->CFGR & RCC_CFGR_PLLMUL; + plldiv = RCC->CFGR & RCC_CFGR_PLLDIV; + pllmul = PLLMulTable[(pllmul >> RCC_CFGR_PLLMUL_Pos)]; + plldiv = (plldiv >> RCC_CFGR_PLLDIV_Pos) + 1U; + + pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + + if (pllsource == 0x00U) + { + /* HSI oscillator clock selected as PLL clock entry */ + if ((RCC->CR & RCC_CR_HSIDIVF) != 0U) + { + SystemCoreClock = (((HSI_VALUE / 4U) * pllmul) / plldiv); + } + else + { + SystemCoreClock = (((HSI_VALUE) * pllmul) / plldiv); + } + } + else + { + /* HSE selected as PLL clock entry */ + SystemCoreClock = (((HSE_VALUE) * pllmul) / plldiv); + } + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l010-st-nucleo/board/Kconfig b/bsp/stm32/stm32l010-st-nucleo/board/Kconfig new file mode 100644 index 0000000000..13ef4ec408 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/Kconfig @@ -0,0 +1,48 @@ +menu "Hardware Drivers Config" + +config SOC_STM32L010RB + bool + select SOC_SERIES_STM32L0 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +menu "Onboard Peripheral Drivers" + + config BSP_USING_USB_TO_USART + bool "Enable USB TO USART (uart2)" + select BSP_USING_UART2 + default y + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART2 + bool "Enable UART2" + default y + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + endif + source "../libraries/HAL_Drivers/Kconfig" + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32l010-st-nucleo/board/SConscript b/bsp/stm32/stm32l010-st-nucleo/board/SConscript new file mode 100644 index 0000000000..74f501ff9b --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/SConscript @@ -0,0 +1,34 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Src/stm32l0xx_hal_msp.c +''') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32L0xx_HAL/CMSIS/Device/ST/STM32L0xx/Source/Templates/gcc/startup_stm32l053xx.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32L0xx_HAL/CMSIS/Device/ST/STM32L0xx/Source/Templates/arm/startup_stm32l053xx.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32L0xx_HAL/CMSIS/Device/ST/STM32L0xx/Source/Templates/iar/startup_stm32l053xx.s'] + +# STM32L052xx || STM32L053xx || STM32L062xx +# STM32L063xx || STM32L072xx || STM32L073xx +# STM32L082xx || STM32L083xx +# You can select chips from the list above +CPPDEFINES = ['STM32L053xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/stm32/stm32l010-st-nucleo/board/board.c b/bsp/stm32/stm32l010-st-nucleo/board/board.c new file mode 100644 index 0000000000..858d59660f --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/board.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + */ + +#include "board.h" + +void SystemClock_Config(void) +{ + + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_PeriphCLKInitTypeDef PeriphClkInit; + + /**Configure the main internal regulator output voltage + */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = 16; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4; + RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Configure the Systick interrupt time + */ + HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); + + /**Configure the Systick + */ + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); +} diff --git a/bsp/stm32/stm32l010-st-nucleo/board/board.h b/bsp/stm32/stm32l010-st-nucleo/board/board.h new file mode 100644 index 0000000000..9ca68af470 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/board.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +#include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (128 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +/* Internal SRAM memory size[Kbytes] <8-64>, Default: 36 */ +#define STM32_SRAM_SIZE 20 +#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) + +#if defined(__CC_ARM) || defined(__CLANG_ARM) +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN ((void *)&__bss_end) +#endif + +#define HEAP_END STM32_SRAM_END + +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __BOARD_H__ */ diff --git a/bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.icf new file mode 100644 index 0000000000..24d6f5275c --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.icf @@ -0,0 +1,29 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20004FFF; + +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0400; +define symbol __ICFEDIT_size_heap__ = 0x0000; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, last block CSTACK}; \ No newline at end of file diff --git a/bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.lds b/bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.lds new file mode 100644 index 0000000000..2280d5e461 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.lds @@ -0,0 +1,157 @@ +/* + * linker script for STM32L4XX with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 128k /* 128KB flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 20k /* 20KB sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } > RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } > RAM + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.sct b/bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.sct new file mode 100644 index 0000000000..418dc4b9fe --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.sct @@ -0,0 +1,16 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00020000 { ; load region size_region + ER_IROM1 0x08000000 0x00020000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM1 0x20000000 0x00005000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32l010-st-nucleo/figures/board.jpg b/bsp/stm32/stm32l010-st-nucleo/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f5322e602d4a8945c4856c2077570de872ed59ac GIT binary patch literal 161179 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�D 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%0De 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

2f*dB47zH+$n_z3H2nuC{oeKuFjr#o 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 + + 3 + + rt-thread + + ARM + + 1 + + C-SPY + 2 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\IARProbe\IarProbePlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\IARProbe\IarProbePlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/stm32/stm32l010-st-nucleo/project.ewp b/bsp/stm32/stm32l010-st-nucleo/project.ewp new file mode 100644 index 0000000000..ff955eb8e7 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/project.ewp @@ -0,0 +1,2259 @@ + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\device.c + + + $PROJ_DIR$\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\src\scheduler.c + + + $PROJ_DIR$\..\..\..\src\signal.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\board\CubeMX_Config\Src\stm32l0xx_hal_msp.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\CMSIS\Device\ST\STM32L0xx\Source\Templates\iar\startup_stm32l053xx.s + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_common.c + + + + cpu + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m0\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m0\context_iar.S + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\workqueue.c + + + + finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + + libc + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\time.c + + + + STM32_HAL + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\CMSIS\Device\ST\STM32L0xx\Source\Templates\system_stm32l0xx.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_comp.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cortex.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_crc.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_crc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cryp.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cryp_ex.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_dma.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_pwr.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_pwr_ex.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rcc.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rcc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rng.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_gpio.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_uart.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_uart_ex.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_usart.c + + + diff --git a/bsp/stm32/stm32l010-st-nucleo/project.eww b/bsp/stm32/stm32l010-st-nucleo/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32l010-st-nucleo/project.uvoptx b/bsp/stm32/stm32l010-st-nucleo/project.uvoptx new file mode 100644 index 0000000000..97f78109ad --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/project.uvoptx @@ -0,0 +1,932 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC800 -FD20000000 -FF0STM32L0xx_128 -FL020000 -FS08000000 -FP0($$Device:STM32L010RBTx$CMSIS\Flash\STM32L0xx_128.FLM) + + + 0 + ST-LINKIII-KEIL_SWO + -U0671FF535155878281103613 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("") -D00(00000000) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32L0xx_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32L010RBTx$CMSIS\Flash\STM32L0xx_128.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Kernel + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 1 + 9 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 1 + 10 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 1 + 11 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler.c + scheduler.c + 0 + 0 + + + 1 + 12 + 1 + 0 + 0 + 0 + ..\..\..\src\signal.c + signal.c + 0 + 0 + + + 1 + 13 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 1 + 14 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Applications + 1 + 0 + 0 + 0 + + 2 + 15 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 3 + 16 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + board\CubeMX_Config\Src\stm32l0xx_hal_msp.c + stm32l0xx_hal_msp.c + 0 + 0 + + + 3 + 18 + 2 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\CMSIS\Device\ST\STM32L0xx\Source\Templates\arm\startup_stm32l053xx.s + startup_stm32l053xx.s + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + + + cpu + 0 + 0 + 0 + 0 + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\backtrace.c + backtrace.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m0\cpuport.c + cpuport.c + 0 + 0 + + + 4 + 26 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m0\context_rvds.S + context_rvds.S + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 5 + 27 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\completion.c + completion.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\dataqueue.c + dataqueue.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\pipe.c + pipe.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\waitqueue.c + waitqueue.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\workqueue.c + workqueue.c + 0 + 0 + + + + + finsh + 0 + 0 + 0 + 0 + + 6 + 36 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + + + libc + 0 + 0 + 0 + 0 + + 7 + 39 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\time.c + time.c + 0 + 0 + + + + + STM32_HAL + 0 + 0 + 0 + 0 + + 8 + 40 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\CMSIS\Device\ST\STM32L0xx\Source\Templates\system_stm32l0xx.c + system_stm32l0xx.c + 0 + 0 + + + 8 + 41 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal.c + stm32l0xx_hal.c + 0 + 0 + + + 8 + 42 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_comp.c + stm32l0xx_hal_comp.c + 0 + 0 + + + 8 + 43 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cortex.c + stm32l0xx_hal_cortex.c + 0 + 0 + + + 8 + 44 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_crc.c + stm32l0xx_hal_crc.c + 0 + 0 + + + 8 + 45 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_crc_ex.c + stm32l0xx_hal_crc_ex.c + 0 + 0 + + + 8 + 46 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cryp.c + stm32l0xx_hal_cryp.c + 0 + 0 + + + 8 + 47 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cryp_ex.c + stm32l0xx_hal_cryp_ex.c + 0 + 0 + + + 8 + 48 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_dma.c + stm32l0xx_hal_dma.c + 0 + 0 + + + 8 + 49 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_pwr.c + stm32l0xx_hal_pwr.c + 0 + 0 + + + 8 + 50 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_pwr_ex.c + stm32l0xx_hal_pwr_ex.c + 0 + 0 + + + 8 + 51 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rcc.c + stm32l0xx_hal_rcc.c + 0 + 0 + + + 8 + 52 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rcc_ex.c + stm32l0xx_hal_rcc_ex.c + 0 + 0 + + + 8 + 53 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rng.c + stm32l0xx_hal_rng.c + 0 + 0 + + + 8 + 54 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_gpio.c + stm32l0xx_hal_gpio.c + 0 + 0 + + + 8 + 55 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_uart.c + stm32l0xx_hal_uart.c + 0 + 0 + + + 8 + 56 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_uart_ex.c + stm32l0xx_hal_uart_ex.c + 0 + 0 + + + 8 + 57 + 1 + 0 + 0 + 0 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_usart.c + stm32l0xx_hal_usart.c + 0 + 0 + + + + diff --git a/bsp/stm32/stm32l010-st-nucleo/project.uvprojx b/bsp/stm32/stm32l010-st-nucleo/project.uvprojx new file mode 100644 index 0000000000..0e71514be5 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/project.uvprojx @@ -0,0 +1,717 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32L010RBTx + STMicroelectronics + Keil.STM32L0xx_DFP.2.0.1 + http://www.keil.com/pack/ + IRAM(0x20000000,0x00000800) IROM(0x08000000,0x00020000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC800 -FN1 -FF0STM32L0xx_128 -FS08000000 -FL020000 -FP0($$Device:STM32L010RBTx$CMSIS\Flash\STM32L0xx_128.FLM)) + 0 + $$Device:STM32L010RBTx$Drivers\CMSIS\Device\ST\STM32L0xx\Include\stm32l0xx.h + + + + + + + + + + $$Device:STM32L010RBTx$CMSIS\SVD\STM32L0x0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 1 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DARMCM1.DLL + -pCM0+ + SARMCM3.DLL + + TARMCM1.DLL + -pCM0+ + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0+" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x800 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x800 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + STM32L010xB,USE_HAL_DRIVER + + .;..\..\..\include;applications;.;board;board\CubeMX_Config\Inc;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m0;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\..\..\components\libc\compilers\common;..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Inc;..\libraries\STM32L0xx_HAL\CMSIS\Device\ST\STM32L0xx\Include;..\libraries\STM32L0xx_HAL\CMSIS\Include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + signal.c + 1 + ..\..\..\src\signal.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + stm32l0xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32l0xx_hal_msp.c + + + startup_stm32l053xx.s + 2 + ..\libraries\STM32L0xx_HAL\CMSIS\Device\ST\STM32L0xx\Source\Templates\arm\startup_stm32l053xx.s + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\HAL_Drivers\drv_usart.c + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + + + cpu + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m0\cpuport.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m0\context_rvds.S + + + + + DeviceDrivers + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + + + libc + + + time.c + 1 + ..\..\..\components\libc\compilers\common\time.c + + + + + STM32_HAL + + + system_stm32l0xx.c + 1 + ..\libraries\STM32L0xx_HAL\CMSIS\Device\ST\STM32L0xx\Source\Templates\system_stm32l0xx.c + + + stm32l0xx_hal.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal.c + + + stm32l0xx_hal_comp.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_comp.c + + + stm32l0xx_hal_cortex.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cortex.c + + + stm32l0xx_hal_crc.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_crc.c + + + stm32l0xx_hal_crc_ex.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_crc_ex.c + + + stm32l0xx_hal_cryp.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cryp.c + + + stm32l0xx_hal_cryp_ex.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cryp_ex.c + + + stm32l0xx_hal_dma.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_dma.c + + + stm32l0xx_hal_pwr.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_pwr.c + + + stm32l0xx_hal_pwr_ex.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_pwr_ex.c + + + stm32l0xx_hal_rcc.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rcc.c + + + stm32l0xx_hal_rcc_ex.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rcc_ex.c + + + stm32l0xx_hal_rng.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rng.c + + + stm32l0xx_hal_gpio.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_gpio.c + + + stm32l0xx_hal_uart.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_uart.c + + + stm32l0xx_hal_uart_ex.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_uart_ex.c + + + stm32l0xx_hal_usart.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_usart.c + + + + + + + + + + + + + +
diff --git a/bsp/stm32/stm32l010-st-nucleo/rtconfig.h b/bsp/stm32/stm32l010-st-nucleo/rtconfig.h new file mode 100644 index 0000000000..4d177a0aaf --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/rtconfig.h @@ -0,0 +1,170 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 4 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_DEBUG +#define RT_DEBUG_COLOR + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 256 +#define RT_CONSOLE_DEVICE_NAME "uart2" +#define RT_VER_NUM 0x40003 +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M0 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 + +/* C++ features */ + + +/* Command shell */ + +#define RT_USING_FINSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_USING_DESCRIPTION +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 1024 +#define FINSH_CMD_SIZE 80 +#define FINSH_USING_MSH +#define FINSH_USING_MSH_DEFAULT +#define FINSH_USING_MSH_ONLY +#define FINSH_ARG_MAX 10 + +/* Device virtual file system */ + + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_PIPE_BUFSZ 512 +#define RT_USING_SERIAL +#define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN + +/* Using USB */ + + +/* POSIX layer and C standard library */ + +#define RT_LIBC_USING_TIME + +/* Network */ + +/* Socket abstraction layer */ + + +/* Network interface device */ + + +/* light weight TCP/IP stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + + +/* multimedia packages */ + + +/* tools packages */ + + +/* system packages */ + + +/* peripheral libraries and drivers */ + + +/* miscellaneous packages */ + + +/* samples: kernel and components samples */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32L0 + +/* Hardware Drivers Config */ + +#define SOC_STM32L010RB + +/* Onboard Peripheral Drivers */ + + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART2 + +/* Board extended module Drivers */ + + +#endif diff --git a/bsp/stm32/stm32l010-st-nucleo/rtconfig.py b/bsp/stm32/stm32l010-st-nucleo/rtconfig.py new file mode 100644 index 0000000000..39d6af6879 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/rtconfig.py @@ -0,0 +1,143 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m0' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m0plus -mthumb -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + CXX = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M0 ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M0' + CFLAGS += ' -e' + CFLAGS += ' --fpu=None' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M0' + AFLAGS += ' --fpu None' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' diff --git a/bsp/stm32/stm32l010-st-nucleo/template.ewp b/bsp/stm32/stm32l010-st-nucleo/template.ewp new file mode 100644 index 0000000000..f390ad7bc1 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/template.ewp @@ -0,0 +1,2031 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + diff --git a/bsp/stm32/stm32l010-st-nucleo/template.eww b/bsp/stm32/stm32l010-st-nucleo/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32l010-st-nucleo/template.uvoptx b/bsp/stm32/stm32l010-st-nucleo/template.uvoptx new file mode 100644 index 0000000000..7f4a45a0e7 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/template.uvoptx @@ -0,0 +1,192 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC800 -FD20000000 -FF0STM32L0xx_128 -FL020000 -FS08000000 -FP0($$Device:STM32L010RBTx$CMSIS\Flash\STM32L0xx_128.FLM) + + + 0 + ST-LINKIII-KEIL_SWO + -U303030303030303030303031 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("") -D00(00000000) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32L0xx_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32L010RBTx$CMSIS\Flash\STM32L0xx_128.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/stm32/stm32l010-st-nucleo/template.uvprojx b/bsp/stm32/stm32l010-st-nucleo/template.uvprojx new file mode 100644 index 0000000000..74da7a4e37 --- /dev/null +++ b/bsp/stm32/stm32l010-st-nucleo/template.uvprojx @@ -0,0 +1,395 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060300::V5.06 update 3 (build 300)::ARMCC + 0 + + + STM32L010RBTx + STMicroelectronics + Keil.STM32L0xx_DFP.2.0.1 + http://www.keil.com/pack/ + IRAM(0x20000000,0x00000800) IROM(0x08000000,0x00020000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC800 -FN1 -FF0STM32L0xx_128 -FS08000000 -FL020000 -FP0($$Device:STM32L010RBTx$CMSIS\Flash\STM32L0xx_128.FLM)) + 0 + $$Device:STM32L010RBTx$Drivers\CMSIS\Device\ST\STM32L0xx\Include\stm32l0xx.h + + + + + + + + + + $$Device:STM32L010RBTx$CMSIS\SVD\STM32L0x0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 1 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DARMCM1.DLL + -pCM0+ + SARMCM3.DLL + + TARMCM1.DLL + -pCM0+ + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0+" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x800 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x800 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + + + + + + + +
From c0947d443a11175d1c33d805b0dbf03e7f3f708c Mon Sep 17 00:00:00 2001 From: Jonne Date: Sat, 11 Apr 2020 12:06:40 +0800 Subject: [PATCH 02/27] 1. Add 4.3 inch lcd(480x272) support for mini2440 2. Add choice menu for lcd configure 3. Remove origin sdcard driver and add new mmc driver that use kernel mmc stack for s3c2440 --- bsp/mini2440/.config | 8 +- bsp/mini2440/Kconfig | 23 +- bsp/mini2440/applications/main.c | 17 +- bsp/mini2440/applications/mnt.c | 19 +- bsp/mini2440/drivers/SConscript | 32 +- bsp/mini2440/drivers/lcd.h | 21 - bsp/mini2440/drivers/lcd_a70.c | 7 +- bsp/mini2440/drivers/lcd_n35.c | 7 +- bsp/mini2440/drivers/lcd_t35.c | 7 +- bsp/mini2440/drivers/lcd_t43.c | 249 ++++++++++++ bsp/mini2440/drivers/lcd_x35.c | 7 +- bsp/mini2440/drivers/s3cmci.c | 332 ++++++++++++++++ bsp/mini2440/drivers/sdcard.c | 651 ------------------------------- bsp/mini2440/drivers/sdcard.h | 11 - bsp/mini2440/drivers/touch.c | 33 +- bsp/mini2440/drivers/touch.h | 2 +- bsp/mini2440/rtconfig.h | 6 + bsp/mini2440/rtconfig.py | 4 - 18 files changed, 704 insertions(+), 732 deletions(-) delete mode 100644 bsp/mini2440/drivers/lcd.h create mode 100644 bsp/mini2440/drivers/lcd_t43.c create mode 100644 bsp/mini2440/drivers/s3cmci.c delete mode 100644 bsp/mini2440/drivers/sdcard.c delete mode 100644 bsp/mini2440/drivers/sdcard.h diff --git a/bsp/mini2440/.config b/bsp/mini2440/.config index e10689caa8..1e1372162c 100644 --- a/bsp/mini2440/.config +++ b/bsp/mini2440/.config @@ -161,7 +161,13 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_MTD_NAND is not set # CONFIG_RT_USING_PM is not set # CONFIG_RT_USING_RTC is not set -# CONFIG_RT_USING_SDIO is not set +CONFIG_RT_USING_SDIO=y +CONFIG_RT_SDIO_STACK_SIZE=512 +CONFIG_RT_SDIO_THREAD_PRIORITY=15 +CONFIG_RT_MMCSD_STACK_SIZE=1024 +CONFIG_RT_MMCSD_THREAD_PREORITY=22 +CONFIG_RT_MMCSD_MAX_PARTITION=16 +# CONFIG_RT_SDIO_DEBUG is not set # CONFIG_RT_USING_SPI is not set # CONFIG_RT_USING_WDT is not set # CONFIG_RT_USING_AUDIO is not set diff --git a/bsp/mini2440/Kconfig b/bsp/mini2440/Kconfig index 44da5183eb..48e4f26a38 100644 --- a/bsp/mini2440/Kconfig +++ b/bsp/mini2440/Kconfig @@ -16,12 +16,33 @@ config PKGS_DIR default "packages" config BOARD_MINI2440 - bool "mini2440" + bool select ARCH_ARM_ARM9 select RT_USING_COMPONENTS_INIT select RT_USING_USER_MAIN default y +choice + prompt "Lcd for mini2440" + default RT_MINI2440_LCD_T35 + depends on PKG_USING_GUIENGINE + + config RT_MINI2440_LCD_A70 + bool "A70" + + config RT_MINI2440_LCD_T43 + bool "T43" + + config RT_MINI2440_LCD_N35 + bool "N35" + + config RT_MINI2440_LCD_T35 + bool "T35" + + config RT_MINI2440_LCD_X35 + bool "X35" +endchoice + source "$RTT_DIR/Kconfig" source "$PKGS_DIR/Kconfig" diff --git a/bsp/mini2440/applications/main.c b/bsp/mini2440/applications/main.c index a67ff93f7a..923f014469 100644 --- a/bsp/mini2440/applications/main.c +++ b/bsp/mini2440/applications/main.c @@ -5,9 +5,24 @@ #include "led.h" +#ifdef PKG_USING_GUIENGINE +#include +#endif + int main(void) { - printf("hello rt-thread\n"); + rt_device_t device; + + printf("hello rt-thread\n"); + +#ifdef PKG_USING_GUIENGINE + device = rt_device_find("lcd"); + if (device) + { + rtgui_graphic_set_device(device); + } +#endif + while (1) { diff --git a/bsp/mini2440/applications/mnt.c b/bsp/mini2440/applications/mnt.c index 50ade3a3eb..2e1ae80692 100644 --- a/bsp/mini2440/applications/mnt.c +++ b/bsp/mini2440/applications/mnt.c @@ -6,15 +6,28 @@ int mnt_init(void) { - if (dfs_mount("sd0", "/", "elm", 0, 0) == 0) + rt_uint32_t tryCnt = 5; + rt_device_t dev; + + while(tryCnt--) { - rt_kprintf("File System initialized!\n"); + dev = rt_device_find("sd0"); + if(dev != RT_NULL) + { + break; + } + rt_thread_mdelay(500); + } + + if(dfs_mount("sd0", "/", "elm", 0, 0) == 0) + { + rt_kprintf("File System initialized!\n"); } else { rt_kprintf("File System initialzation failed!\n"); } - + return RT_EOK; } INIT_ENV_EXPORT(mnt_init); diff --git a/bsp/mini2440/drivers/SConscript b/bsp/mini2440/drivers/SConscript index 2c81f19e33..902b48320d 100644 --- a/bsp/mini2440/drivers/SConscript +++ b/bsp/mini2440/drivers/SConscript @@ -8,30 +8,30 @@ cwd = os.path.join(str(Dir('#')), 'drivers') src = Split(""" board.c led.c +key.c uart.c """) -if GetDepend('RT_USING_DFS'): - src += ['sdcard.c'] - if GetDepend('RT_USING_LWIP'): src += ['dm9000.c'] -if GetDepend('PKG_USING_GUIENGINE'): - src += ['touch.c', 'key.c'] +if GetDepend('RT_MINI2440_LCD_A70'): + src += ['lcd_a70.c'] +if GetDepend('RT_MINI2440_LCD_T43'): + src += ['lcd_t43.c'] +if GetDepend('RT_MINI2440_LCD_N35'): + src += ['lcd_n35.c'] +if GetDepend('RT_MINI2440_LCD_T35'): + src += ['lcd_t35.c'] +if GetDepend('RT_MINI2440_LCD_X35'): + src += ['lcd_x35.c'] -if GetDepend('RT_USING_RTI'): - src += ['rti_stub.c'] - if GetDepend('PKG_USING_GUIENGINE'): - if rtconfig.RT_USING_LCD_TYPE == 'PNL_A70': - src += ['lcd_a70.c'] - elif rtconfig.RT_USING_LCD_TYPE == 'PNL_N35': - src += ['lcd_n35.c'] - elif rtconfig.RT_USING_LCD_TYPE == 'PNL_T35': - src += ['lcd_t35.c'] - elif rtconfig.RT_USING_LCD_TYPE == 'PNL_X35': - src += ['lcd_x35.c'] + src += ['touch.c'] + +if GetDepend('RT_USING_SDIO'): + src += ['s3cmci.c'] + CPPPATH = [cwd] diff --git a/bsp/mini2440/drivers/lcd.h b/bsp/mini2440/drivers/lcd.h deleted file mode 100644 index f733b5593c..0000000000 --- a/bsp/mini2440/drivers/lcd.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * File : lcd.h - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2006, RT-Thread Develop Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2008-03-29 Yi.Qiu - */ -#ifndef __LCD_H__ -#define __LCD_H__ - -#include - -void rt_hw_lcd_init(void); - -#endif diff --git a/bsp/mini2440/drivers/lcd_a70.c b/bsp/mini2440/drivers/lcd_a70.c index 02a89b9d47..7ebcf6a047 100644 --- a/bsp/mini2440/drivers/lcd_a70.c +++ b/bsp/mini2440/drivers/lcd_a70.c @@ -15,7 +15,6 @@ #include #include -#include "lcd.h" /* LCD driver for A7' */ #define LCD_WIDTH 800 @@ -223,10 +222,11 @@ static rt_err_t rt_lcd_control (rt_device_t dev, int cmd, void *args) return RT_EOK; } -void rt_hw_lcd_init(void) +int rt_hw_lcd_init(void) { rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); - if (lcd == RT_NULL) return; /* no memory yet */ + if (lcd == RT_NULL) + return -RT_ERROR; /* no memory yet */ _lcd_info.bits_per_pixel = 16; _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; @@ -246,3 +246,4 @@ void rt_hw_lcd_init(void) rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); } +INIT_BOARD_EXPORT(rt_hw_lcd_init); diff --git a/bsp/mini2440/drivers/lcd_n35.c b/bsp/mini2440/drivers/lcd_n35.c index bcd3b85b8a..57d792ea39 100644 --- a/bsp/mini2440/drivers/lcd_n35.c +++ b/bsp/mini2440/drivers/lcd_n35.c @@ -15,7 +15,6 @@ #include #include -#include "lcd.h" /* LCD driver for N3'5 */ #define LCD_WIDTH 240 @@ -224,10 +223,11 @@ static rt_err_t rt_lcd_control (rt_device_t dev, int cmd, void *args) return RT_EOK; } -void rt_hw_lcd_init(void) +int rt_hw_lcd_init(void) { rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); - if (lcd == RT_NULL) return; /* no memory yet */ + if (lcd == RT_NULL) + return -RT_ERROR; /* no memory yet */ _lcd_info.bits_per_pixel = 16; _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; @@ -247,3 +247,4 @@ void rt_hw_lcd_init(void) rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); } +INIT_BOARD_EXPORT(rt_hw_lcd_init); diff --git a/bsp/mini2440/drivers/lcd_t35.c b/bsp/mini2440/drivers/lcd_t35.c index ef424a7bf7..fdcab887f5 100644 --- a/bsp/mini2440/drivers/lcd_t35.c +++ b/bsp/mini2440/drivers/lcd_t35.c @@ -15,7 +15,6 @@ #include #include -#include "lcd.h" /* LCD driver for T3'5 */ #define LCD_WIDTH 240 @@ -225,10 +224,11 @@ static rt_err_t rt_lcd_control (rt_device_t dev, int cmd, void *args) return RT_EOK; } -void rt_hw_lcd_init(void) +int rt_hw_lcd_init(void) { rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); - if (lcd == RT_NULL) return; /* no memory yet */ + if (lcd == RT_NULL) + return -RT_ERROR; /* no memory yet */ _lcd_info.bits_per_pixel = 16; _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; @@ -248,3 +248,4 @@ void rt_hw_lcd_init(void) rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); } +INIT_BOARD_EXPORT(rt_hw_lcd_init); diff --git a/bsp/mini2440/drivers/lcd_t43.c b/bsp/mini2440/drivers/lcd_t43.c new file mode 100644 index 0000000000..54abc12f3e --- /dev/null +++ b/bsp/mini2440/drivers/lcd_t43.c @@ -0,0 +1,249 @@ +/* + * File : lcd_t43.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2010, RT-Thread Develop Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2020-04-12 Jonne first version from 4.3 inch lcd(480x272) + */ + +#include +#include + +/* LCD driver for N3'5 */ +#define LCD_WIDTH 480 +#define LCD_HEIGHT 272 +#define LCD_PIXCLOCK 4 + +#define LCD_RIGHT_MARGIN 2 +#define LCD_LEFT_MARGIN 2 +#define LCD_HSYNC_LEN 41 + +#define LCD_UPPER_MARGIN 2 +#define LCD_LOWER_MARGIN 2 +#define LCD_VSYNC_LEN 10 + +#define LCD_XSIZE LCD_WIDTH +#define LCD_YSIZE LCD_HEIGHT +#define SCR_XSIZE LCD_WIDTH +#define SCR_YSIZE LCD_HEIGHT + +#define RT_HW_LCD_WIDTH LCD_WIDTH +#define RT_HW_LCD_HEIGHT LCD_HEIGHT + +#define MVAL (13) +#define MVAL_USED (0) //0=each frame 1=rate by MVAL +#define INVVDEN (1) //0=normal 1=inverted +#define BSWP (0) //Byte swap control +#define HWSWP (1) //Half word swap control + +#define GPB1_TO_OUT() (GPBUP &= 0xfffd, GPBCON &= 0xfffffff3, GPBCON |= 0x00000004) +#define GPB1_TO_1() (GPBDAT |= 0x0002) +#define GPB1_TO_0() (GPBDAT &= 0xfffd) + +#define S3C2410_LCDCON1_CLKVAL(x) ((x) << 8) +#define S3C2410_LCDCON1_MMODE (1<<7) +#define S3C2410_LCDCON1_DSCAN4 (0<<5) +#define S3C2410_LCDCON1_STN4 (1<<5) +#define S3C2410_LCDCON1_STN8 (2<<5) +#define S3C2410_LCDCON1_TFT (3<<5) + +#define S3C2410_LCDCON1_STN1BPP (0<<1) +#define S3C2410_LCDCON1_STN2GREY (1<<1) +#define S3C2410_LCDCON1_STN4GREY (2<<1) +#define S3C2410_LCDCON1_STN8BPP (3<<1) +#define S3C2410_LCDCON1_STN12BPP (4<<1) + +#define S3C2410_LCDCON1_TFT1BPP (8<<1) +#define S3C2410_LCDCON1_TFT2BPP (9<<1) +#define S3C2410_LCDCON1_TFT4BPP (10<<1) +#define S3C2410_LCDCON1_TFT8BPP (11<<1) +#define S3C2410_LCDCON1_TFT16BPP (12<<1) +#define S3C2410_LCDCON1_TFT24BPP (13<<1) + +#define S3C2410_LCDCON1_ENVID (1) + +#define S3C2410_LCDCON1_MODEMASK 0x1E + +#define S3C2410_LCDCON2_VBPD(x) ((x) << 24) +#define S3C2410_LCDCON2_LINEVAL(x) ((x) << 14) +#define S3C2410_LCDCON2_VFPD(x) ((x) << 6) +#define S3C2410_LCDCON2_VSPW(x) ((x) << 0) + +#define S3C2410_LCDCON2_GET_VBPD(x) ( ((x) >> 24) & 0xFF) +#define S3C2410_LCDCON2_GET_VFPD(x) ( ((x) >> 6) & 0xFF) +#define S3C2410_LCDCON2_GET_VSPW(x) ( ((x) >> 0) & 0x3F) + +#define S3C2410_LCDCON3_HBPD(x) ((x) << 19) +#define S3C2410_LCDCON3_WDLY(x) ((x) << 19) +#define S3C2410_LCDCON3_HOZVAL(x) ((x) << 8) +#define S3C2410_LCDCON3_HFPD(x) ((x) << 0) +#define S3C2410_LCDCON3_LINEBLANK(x)((x) << 0) + +#define S3C2410_LCDCON3_GET_HBPD(x) ( ((x) >> 19) & 0x7F) +#define S3C2410_LCDCON3_GET_HFPD(x) ( ((x) >> 0) & 0xFF) + +#define S3C2410_LCDCON4_MVAL(x) ((x) << 8) +#define S3C2410_LCDCON4_HSPW(x) ((x) << 0) +#define S3C2410_LCDCON4_WLH(x) ((x) << 0) + +#define S3C2410_LCDCON4_GET_HSPW(x) ( ((x) >> 0) & 0xFF) + +#define S3C2410_LCDCON5_BPP24BL (1<<12) +#define S3C2410_LCDCON5_FRM565 (1<<11) +#define S3C2410_LCDCON5_INVVCLK (1<<10) +#define S3C2410_LCDCON5_INVVLINE (1<<9) +#define S3C2410_LCDCON5_INVVFRAME (1<<8) +#define S3C2410_LCDCON5_INVVD (1<<7) +#define S3C2410_LCDCON5_INVVDEN (1<<6) +#define S3C2410_LCDCON5_INVPWREN (1<<5) +#define S3C2410_LCDCON5_INVLEND (1<<4) +#define S3C2410_LCDCON5_PWREN (1<<3) +#define S3C2410_LCDCON5_ENLEND (1<<2) +#define S3C2410_LCDCON5_BSWP (1<<1) +#define S3C2410_LCDCON5_HWSWP (1<<0) + +#define S3C2410_LCDINT_FRSYNC (1<<1) + +static volatile rt_uint16_t _rt_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH]; +//static volatile rt_uint16_t _rt_hw_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH]; +static struct rt_device_graphic_info _lcd_info; + +static void lcd_power_enable(int invpwren, int pwren) +{ + //GPG4 is setted as LCD_PWREN + GPGUP = GPGUP | (1<<4); // Pull-up disable + GPGCON = GPGCON | (3<<8); //GPG4=LCD_PWREN + + //Enable LCD POWER ENABLE Function + LCDCON5 = LCDCON5&(~(1<<3))|(pwren<<3); // PWREN + LCDCON5 = LCDCON5&(~(1<<5))|(invpwren<<5); // INVPWREN +} + +static void lcd_envid_on_off(int onoff) +{ + if(onoff==1) + /*ENVID=ON*/ + LCDCON1|=1; + else + /*ENVID Off*/ + LCDCON1 =LCDCON1 & 0x3fffe; +} + +//********************** BOARD LCD backlight **************************** +static void LcdBkLtSet(rt_uint32_t HiRatio) +{ +#define FREQ_PWM1 1000 + if(!HiRatio) + { + GPBCON = GPBCON & (~(3<<2)) | (1<<2) ; + GPBDAT &= ~(1<<1); + return; + } + GPBCON = GPBCON & (~(3<<2)) | (2<<2) ; + + if( HiRatio > 100 ) HiRatio = 100 ; + + TCON = TCON & (~(0xf<<8)) ; // clear manual update bit, stop Timer1 + + TCFG0 &= 0xffffff00; // set Timer 0&1 prescaler 0 + TCFG0 |= 15; //prescaler = 15+1 + + TCFG1 &= 0xffffff0f; // set Timer 1 MUX 1/16 + TCFG1 |= 0x00000030; // set Timer 1 MUX 1/16 + + TCNTB1 = ( 100000000>>8 )/FREQ_PWM1; //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low + TCMPB1 = ( TCNTB1*(100-HiRatio))/100 ; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high + + TCON = TCON & (~(0xf<<8)) | (0x0e<<8) ; + TCON = TCON & (~(0xf<<8)) | (0x0d<<8) ; +} + +/* RT-Thread Device Interface */ +static rt_err_t rt_lcd_init (rt_device_t dev) +{ + GPB1_TO_OUT(); + GPB1_TO_1(); + + GPCUP = 0x00000000; + GPCCON = 0xaaaa02a9; + + GPDUP = 0x00000000; + GPDCON = 0xaaaaaaaa; + +#define M5D(n) ((n)&0x1fffff) +#define LCD_ADDR ((rt_uint32_t)_rt_framebuffer) + LCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1); + LCDCON2 = ((LCD_UPPER_MARGIN - 1) << 24) | ((LCD_HEIGHT - 1) << 14) | ((LCD_LOWER_MARGIN - 1) << 6) | ((LCD_VSYNC_LEN - 1) << 0); + LCDCON3 = ((LCD_RIGHT_MARGIN - 1) << 19) | ((LCD_WIDTH - 1) << 8) | ((LCD_LEFT_MARGIN - 1) << 0); + LCDCON4 = (13 << 8) | ((LCD_HSYNC_LEN - 1) << 0); +#if !defined(LCD_CON5) + #define LCD_CON5 ((1<<11) | (0<<10) | (1<<9) | (1<<8) | (1<<0)) +#endif + LCDCON5 = LCD_CON5; + + LCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) << 0); + LCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1); + LCDSADDR3 = LCD_WIDTH; + + LCDINTMSK |= (3); + LPCSEL &= (~7) ; + TPAL=0; + + LcdBkLtSet(70) ; + lcd_power_enable(0, 1); + lcd_envid_on_off(1); + + return RT_EOK; +} + +static rt_err_t rt_lcd_control (rt_device_t dev, int cmd, void *args) +{ + switch (cmd) + { + case RTGRAPHIC_CTRL_RECT_UPDATE: + break; + case RTGRAPHIC_CTRL_POWERON: + break; + case RTGRAPHIC_CTRL_POWEROFF: + break; + case RTGRAPHIC_CTRL_GET_INFO: + rt_memcpy(args, &_lcd_info, sizeof(_lcd_info)); + break; + case RTGRAPHIC_CTRL_SET_MODE: + break; + } + + return RT_EOK; +} + +int rt_hw_lcd_init(void) +{ + rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); + if (lcd == RT_NULL) + return -RT_ERROR; /* no memory yet */ + + _lcd_info.bits_per_pixel = 16; + _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; + _lcd_info.framebuffer = (void*)_rt_framebuffer; + _lcd_info.width = LCD_WIDTH; + _lcd_info.height = LCD_HEIGHT; + + /* init device structure */ + lcd->type = RT_Device_Class_Unknown; + lcd->init = rt_lcd_init; + lcd->open = RT_NULL; + lcd->close = RT_NULL; + lcd->control = rt_lcd_control; + lcd->user_data = (void*)&_lcd_info; + + /* register lcd device to RT-Thread */ + rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); +} + +INIT_BOARD_EXPORT(rt_hw_lcd_init); diff --git a/bsp/mini2440/drivers/lcd_x35.c b/bsp/mini2440/drivers/lcd_x35.c index 679d433f9b..e625905130 100644 --- a/bsp/mini2440/drivers/lcd_x35.c +++ b/bsp/mini2440/drivers/lcd_x35.c @@ -17,7 +17,6 @@ #include #include -#include "lcd.h" /* LCD driver for X3'5 */ #define LCD_WIDTH 240 // xres @@ -230,10 +229,11 @@ static rt_err_t rt_lcd_control (rt_device_t dev, int cmd, void *args) return RT_EOK; } -void rt_hw_lcd_init(void) +int rt_hw_lcd_init(void) { rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); - if (lcd == RT_NULL) return; /* no memory yet */ + if (lcd == RT_NULL) + return -RT_ERROR; /* no memory yet */ _lcd_info.bits_per_pixel = 16; _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; @@ -253,3 +253,4 @@ void rt_hw_lcd_init(void) rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); } +INIT_BOARD_EXPORT(rt_hw_lcd_init); diff --git a/bsp/mini2440/drivers/s3cmci.c b/bsp/mini2440/drivers/s3cmci.c new file mode 100644 index 0000000000..2333c74495 --- /dev/null +++ b/bsp/mini2440/drivers/s3cmci.c @@ -0,0 +1,332 @@ +/* + * File : s3cmci.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2010, RT-Thread Develop Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2020-04-15 Jonne first version for s3c2440 mmc controller + */ + +#include +#include +#include +#include +#include + +#define S3C_PCLK 50000000 + + +static void s3c_mmc_set_clk(struct rt_mmcsd_host *host, rt_uint32_t clock) +{ + rt_uint32_t prescale; + rt_uint32_t realClk; + + for(prescale = 0; prescale < 256; ++prescale) + { + realClk = S3C_PCLK / (1 + prescale); + if(realClk <= clock) + { + break; + } + } + + SDIPRE = prescale; + host->io_cfg.clock = realClk; +} + +static rt_uint32_t s3c_mmc_send_cmd(struct rt_mmcsd_host *host, struct rt_mmcsd_cmd *cmd) +{ + rt_uint32_t ccon; + rt_uint32_t cmdSta; + + SDICARG = cmd->arg; + + ccon = cmd->cmd_code & 0x3f; + ccon |= (0 << 7) | (1 << 6); /* two start bits*/ + ccon |= (1 << 8);/* command start*/ + + if(cmd->flags & 0xF) + { + // Need response + ccon |= (1 << 9); + } + + if((cmd->flags & 0xF) == RESP_R2) + { + // R2 need 136bit response + ccon |= (1 << 10); + } + + SDICCON = ccon; /* start cmd */ + + if(cmd->flags & 0xF) + { + cmdSta = SDICSTA; + while((cmdSta & 0x200) != 0x200 && (cmdSta & 0x400) != 0x400) + { + cmdSta = SDICSTA; + } + + if((cmdSta & 0x1000) == 0x1000 && (cmd->flags & 0xF) != RESP_R3 && (cmd->flags & 0xF) != RESP_R4) + { + // crc error, but R3 R4 ignore it + SDICSTA = cmdSta; + return -RT_ERROR; + } + + if((cmdSta & 0xF00) != 0xa00) + { + SDICSTA = cmdSta; + return -RT_ERROR; + } + + cmd->resp[0] = SDIRSP0; + if((cmd->flags & 0xF) == RESP_R2) + { + cmd->resp[1] = SDIRSP1; + cmd->resp[2] = SDIRSP2; + cmd->resp[3] = SDIRSP3; + } + } + else + { + cmdSta = SDICSTA; + while((cmdSta & 0x800) != 0x800) + { + cmdSta = SDICSTA; + } + } + + SDICSTA = cmdSta; // clear current status + + return RT_EOK; + +} + +static rt_uint32_t s3c_mmc_xfer_data(struct rt_mmcsd_data *data) +{ + rt_uint32_t status; + rt_uint32_t xfer_size; + rt_uint32_t handled_size = 0; + rt_uint32_t *pBuf = RT_NULL; + + + if(data == RT_NULL) + { + return -RT_ERROR; + } + + xfer_size = data->blks * data->blksize; + + pBuf = data->buf; + if(data->flags & DATA_DIR_READ) + { + while(handled_size < xfer_size) + { + if ((SDIDSTA & 0x20) == 0x20) + { + SDIDSTA = (0x1 << 0x5); + break; + } + + status = SDIFSTA; + if ((status & 0x1000) == 0x1000) + { + *pBuf++ = SDIDAT; + handled_size += 4; + } + } + } + else + { + while(handled_size < xfer_size) + { + status = SDIFSTA; + if ((status & 0x2000) == 0x2000) + { + SDIDAT = *pBuf++; + handled_size += 4; + } + } + } + + // wait for end + status = SDIDSTA; + while((status & 0x30) == 0) + { + status = SDIDSTA; + } + SDIDSTA = status; + + if ((status & 0xfc) != 0x10) + { + return -RT_ERROR; + } + + SDIDCON = SDIDCON & ~(7<<12); + SDIFSTA = SDIFSTA & 0x200; + SDIDSTA = 0x10; + + return RT_EOK; +} +static void mmc_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req) +{ + rt_uint32_t ret; + struct rt_mmcsd_cmd *cmd; + struct rt_mmcsd_data *data; + rt_uint32_t val; + rt_uint32_t tryCnt = 0; + + if(req->cmd == RT_NULL) + { + goto out; + } + cmd = req->cmd; + + /* prepare for data transfer*/ + if(req->data != RT_NULL) + { + SDIFSTA = SDIFSTA | (1<<16); // reset fifo + + while(SDIDSTA & 0x03) + { + if(tryCnt++ > 500) + { + break; + SDIDSTA = SDIDSTA; + } + } + + data = req->data; + + if((data->blksize & 0x3) != 0) + { + goto out; + } + + val = (2 << 22) //word transfer + | (1 << 20) // transmet after response + | (1 << 19) // reciveve after command sent + | (1 << 17) // block data transfer + | (1 << 14); // data start + + if(host->io_cfg.bus_width == MMCSD_BUS_WIDTH_4) + { + val |= (1 << 16); // wide bus mode(4bit data) + } + + if(data->flags & DATA_DIR_READ) + { + // for data read + val |= (2 << 12); + } + else + { + val |= (3 << 12); + } + + val |= (data->blks & 0xFFF); + + SDIDCON = val; + + SDIBSIZE = data->blksize; + SDIDTIMER = 0x7fffff; + } + + ret = s3c_mmc_send_cmd(host,req->cmd); + if(ret != RT_EOK) { + cmd->err = ret; + goto out; + } + + if(req->data != RT_NULL) + { + /*do transfer data*/ + ret = s3c_mmc_xfer_data(data); + if(ret != RT_EOK) + { + data->err = ret; + goto out; + } + } + +out: + mmcsd_req_complete(host); +} +static void mmc_set_iocfg(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg) +{ + switch (io_cfg->power_mode) { + case MMCSD_POWER_ON: + case MMCSD_POWER_UP: + /* Enable PCLK into SDI Block */ + CLKCON |= 1 << 9; + + /* Setup GPIO as SD and SDCMD, SDDAT[3:0] Pull up En */ + GPEUP = GPEUP & (~(0x3f << 5)) | (0x01 << 5); + GPECON = GPECON & (~(0xfff << 10)) | (0xaaa << 10); + break; + + case MMCSD_POWER_OFF: + default: + break; + } + + s3c_mmc_set_clk(host, io_cfg->clock); + + SDICON = 1; +} + +static rt_int32_t mmc_get_card_status(struct rt_mmcsd_host *host) +{ + return RT_EOK; +} +static void mmc_enable_sdio_irq(struct rt_mmcsd_host *host, rt_int32_t en) +{ +} + +static const struct rt_mmcsd_host_ops ops = +{ + mmc_request, + mmc_set_iocfg, + mmc_get_card_status, + mmc_enable_sdio_irq +}; + +int s3c_sdio_init(void) +{ + struct rt_mmcsd_host * host = RT_NULL; + + + host = mmcsd_alloc_host(); + if (!host) + { + goto err; + } + + host->ops = &ops; + host->freq_min = 300000; + host->freq_max = 50000000; + host->valid_ocr = VDD_32_33 | VDD_33_34; + host->flags = MMCSD_MUTBLKWRITE | MMCSD_SUP_HIGHSPEED | MMCSD_SUP_SDIO_IRQ | MMCSD_BUSWIDTH_4; + host->max_seg_size = 2048; + host->max_dma_segs = 10; + host->max_blk_size = 512; + host->max_blk_count = 4096; + + + mmcsd_change(host); + + return RT_EOK; + +err: + if(host) rt_free(host); + + return -RT_EIO; +} + +INIT_DEVICE_EXPORT(s3c_sdio_init); diff --git a/bsp/mini2440/drivers/sdcard.c b/bsp/mini2440/drivers/sdcard.c deleted file mode 100644 index 9815770bab..0000000000 --- a/bsp/mini2440/drivers/sdcard.c +++ /dev/null @@ -1,651 +0,0 @@ -/* - * File : sd.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2006, 2007, RT-Thread Develop Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2007-12-02 Yi.Qiu the first version - * 2010-01-01 Bernard Modify for mini2440 - * 2012-12-15 amr168 support SDHC - * 2017-11-20 kuangdazzidd add csd cmd support - */ - -#include "sdcard.h" -#include "rtdef.h" - -extern rt_uint32_t PCLK; -volatile rt_uint32_t rd_cnt; -volatile rt_uint32_t wt_cnt; -volatile rt_int32_t RCA; -volatile rt_int32_t sd_type; - -struct sd_csd { - rt_uint16_t bsize; - rt_uint32_t nblks; -}g_sd_csd; - -static void sd_delay(rt_uint32_t ms) -{ - ms *= 7326; - while(--ms); -} - -static int sd_cmd_end(int cmd, int be_resp) -{ - int finish0; - - if (!be_resp) - { - finish0 = SDICSTA; - - while ((finish0&0x800) != 0x800) - finish0 = SDICSTA; - - SDICSTA = finish0; - - return RT_EOK; - } - else - { - finish0 = SDICSTA; - - while (!(((finish0&0x200)==0x200) | ((finish0&0x400) == 0x400))) - finish0=SDICSTA; - - if (cmd == 1 || cmd == 41) - { - if ((finish0 & 0xf00) != 0xa00) - { - SDICSTA = finish0; - if ((finish0&0x400) == 0x400) - return RT_ERROR; - } - SDICSTA = finish0; - } - else - { - if ((finish0 & 0x1f00) != 0xa00) - { - /* rt_kprintf("CMD%d:SDICSTA=0x%x, SDIRSP0=0x%x\n", cmd, SDICSTA, SDIRSP0); */ - SDICSTA = finish0; - if ((finish0 & 0x400) == 0x400) - return RT_ERROR; - } - SDICSTA = finish0; - } - return RT_EOK; - } -} - -static int sd_data_end(void) -{ - int finish; - - finish = SDIDSTA; - - while (!(((finish & 0x10) == 0x10) | ((finish & 0x20) == 0x20))) - { - finish = SDIDSTA; - } - - if ((finish & 0xfc) != 0x10) - { - SDIDSTA = 0xec; - - return RT_ERROR; - } - - return RT_EOK; -} - -static void sd_cmd0(void) -{ - SDICARG = 0x0; - SDICCON = (1<<8) | 0x40; - - sd_cmd_end(0, 0); - SDICSTA = 0x800; /* Clear cmd_end(no rsp) */ -} - -static int sd_cmd55(void) -{ - SDICARG = RCA << 16; - SDICCON = (0x1 << 9) | (0x1 << 8) | 0x77; - - if (sd_cmd_end(55, 1) == RT_ERROR) - { - /* rt_kprintf("CMD55 error\n"); */ - return RT_ERROR; - } - - SDICSTA = 0xa00; - - - return RT_EOK; -} - -static int sd_cmd9(void *p_rsp) -{ -SDICARG = RCA << 16; -SDICCON = (1 << 10) | (1 << 9) | (0x1<<8) | (0x40 | 0x09); - -sd_cmd_end(9, 1); - - ((rt_uint32_t *)p_rsp)[0] = SDIRSP3; - ((rt_uint32_t *)p_rsp)[1] = SDIRSP2; - ((rt_uint32_t *)p_rsp)[2] = SDIRSP1; - ((rt_uint32_t *)p_rsp)[3] = SDIRSP0; - -return RT_EOK; -} - -static void sd_sel_desel(char sel_desel) -{ - if (sel_desel) - { -RECMDS7: - SDICARG = RCA << 16; - SDICCON = (0x1 << 9) | (0x1 << 8) | 0x47; - if (sd_cmd_end(7, 1) == RT_ERROR) - goto RECMDS7; - - SDICSTA = 0xa00; - - if (SDIRSP0 & 0x1e00 != 0x800) - goto RECMDS7; - } - else - { -RECMDD7: - SDICARG = 0 << 16; - SDICCON = (0x1 << 8) | 0x47; - - if (sd_cmd_end(7, 0) == RT_ERROR) - goto RECMDD7; - SDICSTA = 0x800; - } -} - -static void sd_setbus(void) -{ - do - { - sd_cmd55(); - - SDICARG = 1 << 1; /* 4bit bus */ - SDICCON = (0x1<<9) | (0x1<<8) | 0x46; /* sht_resp, wait_resp, start, CMD55 */ - }while (sd_cmd_end(6, 1) == RT_ERROR); - - SDICSTA=0xa00; /* Clear cmd_end(with rsp) */ -} - - -static rt_uint32_t bits_str (rt_uint32_t *str, rt_uint32_t start, rt_uint8_t len) -{ - rt_uint32_t mask; - rt_uint32_t index; - rt_uint8_t shift; - rt_uint32_t value; - - mask = (int)((len < 32) ? (1 << len) : 0) - 1; - index = start / 32; - shift = start & 31; - value = str[index] >> shift; - - if ((len + shift) > 32) { - value |= str[index + 1] << (32 - shift); - } - value &= mask; - return value; -} - - -static int sd_decode_csd (rt_uint32_t *p_csd) -{ - rt_uint32_t e, m, r; - rt_uint8_t structure; - - structure = bits_str(p_csd, 126, 2); - - switch (structure) { - case 0: - m = bits_str(p_csd, 99, 4); - e = bits_str(p_csd, 96, 3); - g_sd_csd.bsize = 512; - m = bits_str(p_csd, 62, 12); - e = bits_str(p_csd, 47, 3); - r = bits_str(p_csd, 80, 4); - g_sd_csd.nblks = ((1 + m) << (e + r - 7)); - break; - - case 1: - m = bits_str(p_csd, 99, 4); - e = bits_str(p_csd, 96, 3); - g_sd_csd.bsize = 512; - m = bits_str(p_csd, 48, 22); - g_sd_csd.nblks = (1 + m) << 10; - break; - - default: - return RT_ERROR; - } - return RT_EOK; -} - - -static int sd_send_csd(rt_uint32_t *p_csd) -{ - int ret; - rt_uint32_t rsp[4]; - - ret = sd_cmd9((void*)&rsp); - - if (ret != 0) { - return ret; - } - - rt_memcpy((void*)p_csd, (void*)rsp, 16); - return RT_EOK; -} - -static int sd_ocr(void) -{ - int i, ver=0; - - /* Negotiate operating condition for SD, it makes card ready state */ - for (i = 0; i < 50; i ++) - { - sd_cmd55(); - - SDICARG = 0x40ff8000; /* HCS=1, compatible v1.x and v2.0 */ - SDICCON = (0x1<<9) | (0x1<<8) | 0x69; - - /* if using real board, should replace code here. need to modify qemu in near future*/ - /* Check end of ACMD41 */ - if (sd_cmd_end(41, 1) == RT_EOK) - { - if (SDIRSP0 == 0x80ff8000) - { - ver = 1; /* SD V1.x, CCS=0 */ - break; - } - else if (SDIRSP0 == 0xc0ff8000) - { - ver = 2; /* SD V2.0, CCS=1 */ - break; - } - } - - sd_delay(200); - } - SDICSTA = 0xa00; - - return ver; -} - -rt_err_t sd_cmd8(void) -{ - SDICARG = 0x000001AA; - SDICCON = (0x1<<9) | (0x1<<8) | 0x48; //sht_resp, wait_resp, start - if (sd_cmd_end(8, 1) == RT_ERROR) - return RT_ERROR; - SDICSTA = 0xa00; - - if ((SDIRSP0&0x1aa) == 0x1aa) - return RT_EOK; - else - return RT_ERROR; -} - -static rt_uint8_t sd_init(void) -{ - //-- SD controller & card initialize - int i; - rt_uint32_t csd[4]; - /* Important notice for MMC test condition */ - /* Cmd & Data lines must be enabled by pull up resister */ - SDIPRE = PCLK / (INICLK) - 1; - SDICON = (0<<4) | 1; // Type A, clk enable - SDIFSTA = SDIFSTA | (1<<16); - SDIBSIZE = 0x200; /* 512byte per one block */ - SDIDTIMER = 0x7fffff; /* timeout count */ - - /* Wait 74SDCLK for MMC card */ - for (i = 0; i < 0x1000; i ++); - - sd_cmd0(); - sd_cmd8(); /* Must be use it, Host shall supports high capacity */ - - /* Check SD card OCR */ - sd_type = sd_ocr(); - if (sd_type > 0) - { - rt_kprintf("In SD ready\n"); - } - else - { - rt_kprintf("Initialize fail\nNo Card assertion\n"); - - return RT_ERROR; - } - -RECMD2: - SDICARG = 0x0; - SDICCON = (0x1<<10)|(0x1<<9)|(0x1<<8)|0x42; /* lng_resp, wait_resp, start, CMD2 */ - if (sd_cmd_end(2, 1) == RT_ERROR) - goto RECMD2; - - SDICSTA = 0xa00; /* Clear cmd_end(with rsp) */ - -RECMD3: - SDICARG = 0<<16; /* CMD3(MMC:Set RCA, SD:Ask RCA-->SBZ) */ - SDICCON = (0x1<<9)|(0x1<<8)|0x43; /* sht_resp, wait_resp, start, CMD3 */ - if (sd_cmd_end(3, 1) == RT_ERROR) - goto RECMD3; - SDICSTA=0xa00; /* Clear cmd_end(with rsp) */ - - sd_send_csd(csd); - sd_decode_csd(csd); - - RCA = (SDIRSP0 & 0xffff0000) >> 16; - SDIPRE = PCLK / (SDCLK) - 1; /* Normal clock=25MHz */ - if (SDIRSP0 & 0x1e00 != 0x600) - goto RECMD3; - - sd_sel_desel(1); - sd_delay(200); - sd_setbus(); - - return RT_EOK; -} - -static rt_uint8_t sd_readblock(rt_uint32_t address, rt_uint8_t *buf) -{ - rt_uint32_t status, tmp; - - rd_cnt = 0; - SDIFSTA = SDIFSTA | (1<<16); - - SDIDCON = (2 << 22) | (1 << 19) | (1 << 17) | (1 << 16) | (1 << 14) | (2 << 12) | (1 << 0); - SDICARG = address; - -RERDCMD: - SDICCON = (0x1 << 9 ) | (0x1 << 8) | 0x51; - if (sd_cmd_end(17, 1) == RT_ERROR) - { - rt_kprintf("Read CMD Error\n"); - goto RERDCMD; - } - - SDICSTA = 0xa00; - - while (rd_cnt < 128) - { - if ((SDIDSTA & 0x20) == 0x20) - { - SDIDSTA = (0x1 << 0x5); - break; - } - status = SDIFSTA; - if ((status & 0x1000) == 0x1000) - { - tmp = SDIDAT; - rt_memcpy(buf, &tmp, sizeof(rt_uint32_t)); - rd_cnt ++; - buf += 4; - } - } - if (sd_data_end() == RT_ERROR) - { - rt_kprintf("Dat error\n"); - - return RT_ERROR; - } - - SDIDCON = SDIDCON &~ (7<<12); - SDIFSTA = SDIFSTA & 0x200; - SDIDSTA = 0x10; - - return RT_EOK; -} - -static rt_uint8_t sd_writeblock(rt_uint32_t address, rt_uint8_t *buf) -{ - rt_uint32_t status, tmp; - - wt_cnt = 0; - SDIFSTA = SDIFSTA | (1 << 16); - - SDIDCON = (2 << 22) | (1 << 20) | (1 << 17) | (1 << 16) | (1 << 14) | (3 << 12) | (1 << 0); - SDICARG = address; - -REWTCMD: - SDICCON = (0x1 << 9) | (0x1 << 8) |0x58; - - if (sd_cmd_end(24, 1) == RT_ERROR) - goto REWTCMD; - - SDICSTA = 0xa00; - - while (wt_cnt < 128) - { - status = SDIFSTA; - if ((status & 0x2000) == 0x2000) - { - rt_memcpy(&tmp, buf, sizeof(rt_uint32_t)); - SDIDAT = tmp; - wt_cnt ++; - buf += 4; - } - } - if (sd_data_end() == RT_ERROR) - { - rt_kprintf("Data Error\n"); - - return RT_ERROR; - } - SDIDCON = SDIDCON &~ (7<<12); - SDIDSTA = 0x10; - - return RT_EOK; -} - -#ifdef RT_USING_DFS -/* RT-Thread Device Driver Interface */ -#include - -#include - -struct rt_device sdcard_device[4]; -struct dfs_partition part[4]; - -static rt_err_t rt_sdcard_init(rt_device_t dev) -{ - return RT_EOK; -} - -static rt_err_t rt_sdcard_open(rt_device_t dev, rt_uint16_t oflag) -{ - return RT_EOK; -} - -static rt_err_t rt_sdcard_close(rt_device_t dev) -{ - return RT_EOK; -} - -static rt_err_t rt_sdcard_control(rt_device_t dev, int cmd, void *args) -{ -struct rt_device_blk_geometry *p_geometry = (struct rt_device_blk_geometry *)args; -p_geometry->block_size = g_sd_csd.bsize; -p_geometry->sector_count = g_sd_csd.nblks; -p_geometry->bytes_per_sector = 512; - return RT_EOK; -} - -static rt_size_t rt_sdcard_read(rt_device_t dev, - rt_off_t pos, - void *buffer, - rt_size_t size) -{ - int i, addr; - struct dfs_partition *part = (struct dfs_partition *)dev->user_data; - - if (dev == RT_NULL) - { - rt_set_errno(-EINVAL); - - return 0; - } - - /* read all sectors */ - for (i = 0; i < size; i ++) - { - rt_sem_take(part->lock, RT_WAITING_FOREVER); - if (sd_type == 1) - addr = (part->offset + i + pos)*SECTOR_SIZE; - else - addr = (part->offset + i + pos); - sd_readblock(addr, (rt_uint8_t *)((rt_uint8_t *)buffer + i * SECTOR_SIZE)); - rt_sem_release(part->lock); - } - - /* the length of reading must align to SECTOR SIZE */ - return size; -} - -static rt_size_t rt_sdcard_write(rt_device_t dev, - rt_off_t pos, - const void *buffer, - rt_size_t size) -{ - int i, addr; - struct dfs_partition *part = (struct dfs_partition *)dev->user_data; - - if (dev == RT_NULL) - { - rt_set_errno(-EINVAL); - - return 0; - } - - /* read all sectors */ - for (i = 0; i < size; i++) - { - rt_sem_take(part->lock, RT_WAITING_FOREVER); - if (sd_type == 1) - addr = (part->offset + i + pos)*SECTOR_SIZE; - else - addr = (part->offset + i + pos); - sd_writeblock(addr, (rt_uint8_t*)((rt_uint8_t*)buffer + i * SECTOR_SIZE)); - rt_sem_release(part->lock); - } - - /* the length of reading must align to SECTOR SIZE */ - return size; -} - -int rt_hw_sdcard_init(void) -{ - rt_uint8_t i, status; - rt_uint8_t *sector; - char dname[4]; - char sname[8]; - - /* Enable PCLK into SDI Block */ - CLKCON |= 1 << 9; - - /* Setup GPIO as SD and SDCMD, SDDAT[3:0] Pull up En */ - GPEUP = GPEUP & (~(0x3f << 5)) | (0x01 << 5); - GPECON = GPECON & (~(0xfff << 10)) | (0xaaa << 10); - - RCA = 0; - - if (sd_init() == RT_EOK) - { - /* get the first sector to read partition table */ - sector = (rt_uint8_t*) rt_malloc (512); - if (sector == RT_NULL) - { - rt_kprintf("allocate partition sector buffer failed\n"); - - return -RT_ERROR; - } - status = sd_readblock(0, sector); - if (status == RT_EOK) - { - for (i = 0; i < 4; i ++) - { - /* get the first partition */ - status = dfs_filesystem_get_partition(&part[i], sector, i); - if (status == RT_EOK) - { - rt_snprintf(dname, 4, "sd%d", i); - rt_snprintf(sname, 8, "sem_sd%d", i); - part[i].lock = rt_sem_create(sname, 1, RT_IPC_FLAG_FIFO); - - /* register sdcard device */ - sdcard_device[i].type = RT_Device_Class_Block; - sdcard_device[i].init = rt_sdcard_init; - sdcard_device[i].open = rt_sdcard_open; - sdcard_device[i].close = rt_sdcard_close; - sdcard_device[i].read = rt_sdcard_read; - sdcard_device[i].write = rt_sdcard_write; - sdcard_device[i].control = rt_sdcard_control; - sdcard_device[i].user_data = &part[i]; - - rt_device_register(&sdcard_device[i], dname, - RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE); - } - else - { - if (i == 0) - { - /* there is no partition table */ - part[0].offset = 0; - part[0].size = 0; - part[0].lock = rt_sem_create("sem_sd0", 1, RT_IPC_FLAG_FIFO); - - /* register sdcard device */ - sdcard_device[0].type = RT_Device_Class_Block; - sdcard_device[0].init = rt_sdcard_init; - sdcard_device[0].open = rt_sdcard_open; - sdcard_device[0].close = rt_sdcard_close; - sdcard_device[0].read = rt_sdcard_read; - sdcard_device[0].write = rt_sdcard_write; - sdcard_device[0].control = rt_sdcard_control; - sdcard_device[0].user_data = &part[0]; - - rt_device_register(&sdcard_device[0], "sd0", - RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE); - - break; - } - } - } - } - else - { - rt_kprintf("read sdcard first sector failed\n"); - } - - /* release sector buffer */ - rt_free(sector); - - return -RT_ERROR; - } - else - { - rt_kprintf("sdcard init failed\n"); - } - - return RT_EOK; -} - -INIT_BOARD_EXPORT(rt_hw_sdcard_init); -#endif diff --git a/bsp/mini2440/drivers/sdcard.h b/bsp/mini2440/drivers/sdcard.h deleted file mode 100644 index f9aa52e818..0000000000 --- a/bsp/mini2440/drivers/sdcard.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef __SDCARD_H -#define __SDCARD_H - -#include - -#define INICLK 300000 -#define SDCLK 24000000 //PCLK=49.392MHz -#define MMCCLK 15000000 //PCLK=49.392MHz - -#endif - diff --git a/bsp/mini2440/drivers/touch.c b/bsp/mini2440/drivers/touch.c index e584c379e3..b2d09ff7a5 100644 --- a/bsp/mini2440/drivers/touch.c +++ b/bsp/mini2440/drivers/touch.c @@ -16,13 +16,14 @@ #include #include -#ifdef RT_USING_RTGUI +#ifdef PKG_USING_GUIENGINE #include #include #include #endif -#include "lcd.h" +#define TOUCH_SWAP_XY + #include "touch.h" /* ADCCON Register Bits */ @@ -108,7 +109,7 @@ struct rtgui_touch_device }; static struct rtgui_touch_device *touch = RT_NULL; -#ifdef RT_USING_RTGUI +#ifdef PKG_USING_GUIENGINE static void report_touch_input(int updown) { struct rtgui_event_mouse emouse; @@ -125,6 +126,12 @@ static void report_touch_input(int updown) ts.xp = ts.xp / ts.count; ts.yp = ts.yp / ts.count;; + #ifdef TOUCH_SWAP_XY + ts.xp = ts.xp + ts.yp; + ts.yp = ts.xp - ts.yp; + ts.xp = ts.xp - ts.yp; + #endif + if ((touch->calibrating == RT_TRUE) && (touch->calibration_func != RT_NULL)) { touch->x = ts.xp; @@ -446,7 +453,7 @@ static rt_err_t rtgui_touch_control(rt_device_t dev, int cmd, void *args) return RT_EOK; } -void rtgui_touch_hw_init(void) +int rtgui_touch_hw_init(void) { rt_err_t result = RT_FALSE; rt_device_t device = RT_NULL; @@ -454,7 +461,7 @@ void rtgui_touch_hw_init(void) touch = (struct rtgui_touch_device *)rt_malloc(sizeof(struct rtgui_touch_device)); if (touch == RT_NULL) - return; /* no memory yet */ + return -RT_ERROR; /* no memory yet */ /* clear device structure */ rt_memset(&(touch->parent), 0, sizeof(struct rt_device)); @@ -473,17 +480,19 @@ void rtgui_touch_hw_init(void) touch->parent.user_data = RT_NULL; device = rt_device_find("lcd"); - if (device == RT_NULL) - return; /* no this device */ + if (device == RT_NULL) + { + rt_kprintf("No lcd found\n"); + return -RT_ERROR; /* no this device */ + } /* get graphic device info */ result = rt_device_control(device, RTGRAPHIC_CTRL_GET_INFO, &info); if (result != RT_EOK) { - /* get device information failed */ - - return; + rt_kprintf("Get graphic device info failed\n"); + return -RT_ERROR; } touch->width = info.width; @@ -495,4 +504,8 @@ void rtgui_touch_hw_init(void) /* register touch device to RT-Thread */ rt_device_register(&(touch->parent), "touch", RT_DEVICE_FLAG_RDWR); + + return RT_EOK; } + +INIT_PREV_EXPORT(rtgui_touch_hw_init); diff --git a/bsp/mini2440/drivers/touch.h b/bsp/mini2440/drivers/touch.h index 854f274782..c0e1238148 100644 --- a/bsp/mini2440/drivers/touch.h +++ b/bsp/mini2440/drivers/touch.h @@ -26,7 +26,7 @@ typedef void (*rt_touch_calibration_func_t)(rt_uint16_t x, rt_uint16_t y); typedef void (*rt_touch_eventpost_func_t)(void *, struct rt_touch_event *); -void rtgui_touch_hw_init(void); +int rtgui_touch_hw_init(void); #endif diff --git a/bsp/mini2440/rtconfig.h b/bsp/mini2440/rtconfig.h index 5d65b46148..37c215bdd0 100644 --- a/bsp/mini2440/rtconfig.h +++ b/bsp/mini2440/rtconfig.h @@ -107,6 +107,12 @@ #define RT_SERIAL_USING_DMA #define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_PIN +#define RT_USING_SDIO +#define RT_SDIO_STACK_SIZE 512 +#define RT_SDIO_THREAD_PRIORITY 15 +#define RT_MMCSD_STACK_SIZE 1024 +#define RT_MMCSD_THREAD_PREORITY 22 +#define RT_MMCSD_MAX_PARTITION 16 /* Using USB */ diff --git a/bsp/mini2440/rtconfig.py b/bsp/mini2440/rtconfig.py index 106597711a..f8332f1e6c 100644 --- a/bsp/mini2440/rtconfig.py +++ b/bsp/mini2440/rtconfig.py @@ -1,9 +1,5 @@ import os -# panel options -# 'PNL_A70','PNL_N35', 'PNL_T35' , 'PNL_X35' -RT_USING_LCD_TYPE = 'PNL_T35' - # toolchains options ARCH = 'arm' CPU = 's3c24x0' From 4b035622ce411ce53455eba96ba3d0835b3e2997 Mon Sep 17 00:00:00 2001 From: Jonne Date: Wed, 15 Apr 2020 21:03:43 +0800 Subject: [PATCH 03/27] 1. Modify the file indention 2. Modify the license head --- bsp/mini2440/applications/main.c | 14 +- bsp/mini2440/applications/mnt.c | 40 +- bsp/mini2440/drivers/SConscript | 2 +- bsp/mini2440/drivers/lcd_a70.c | 242 +++++------ bsp/mini2440/drivers/lcd_n35.c | 234 +++++----- bsp/mini2440/drivers/lcd_t35.c | 244 +++++------ bsp/mini2440/drivers/lcd_t43.c | 239 +++++----- bsp/mini2440/drivers/lcd_x35.c | 234 +++++----- bsp/mini2440/drivers/s3cmci.c | 9 +- bsp/mini2440/drivers/touch.c | 722 +++++++++++++++---------------- bsp/mini2440/drivers/touch.h | 16 +- 11 files changed, 993 insertions(+), 1003 deletions(-) diff --git a/bsp/mini2440/applications/main.c b/bsp/mini2440/applications/main.c index 923f014469..94a3f4ccea 100644 --- a/bsp/mini2440/applications/main.c +++ b/bsp/mini2440/applications/main.c @@ -11,16 +11,16 @@ int main(void) { - rt_device_t device; + rt_device_t device; - printf("hello rt-thread\n"); + printf("hello rt-thread\n"); #ifdef PKG_USING_GUIENGINE - device = rt_device_find("lcd"); - if (device) - { - rtgui_graphic_set_device(device); - } + device = rt_device_find("lcd"); + if (device) + { + rtgui_graphic_set_device(device); + } #endif diff --git a/bsp/mini2440/applications/mnt.c b/bsp/mini2440/applications/mnt.c index 2e1ae80692..14949abff4 100644 --- a/bsp/mini2440/applications/mnt.c +++ b/bsp/mini2440/applications/mnt.c @@ -6,29 +6,29 @@ int mnt_init(void) { - rt_uint32_t tryCnt = 5; - rt_device_t dev; + rt_uint32_t tryCnt = 5; + rt_device_t dev; - while(tryCnt--) - { - dev = rt_device_find("sd0"); - if(dev != RT_NULL) - { - break; - } - rt_thread_mdelay(500); - } + while(tryCnt--) + { + dev = rt_device_find("sd0"); + if(dev != RT_NULL) + { + break; + } + rt_thread_mdelay(500); + } - if(dfs_mount("sd0", "/", "elm", 0, 0) == 0) - { - rt_kprintf("File System initialized!\n"); - } - else - { - rt_kprintf("File System initialzation failed!\n"); - } + if(dfs_mount("sd0", "/", "elm", 0, 0) == 0) + { + rt_kprintf("File System initialized!\n"); + } + else + { + rt_kprintf("File System initialzation failed!\n"); + } - return RT_EOK; + return RT_EOK; } INIT_ENV_EXPORT(mnt_init); #endif diff --git a/bsp/mini2440/drivers/SConscript b/bsp/mini2440/drivers/SConscript index 902b48320d..2ea54187ed 100644 --- a/bsp/mini2440/drivers/SConscript +++ b/bsp/mini2440/drivers/SConscript @@ -27,7 +27,7 @@ if GetDepend('RT_MINI2440_LCD_X35'): src += ['lcd_x35.c'] if GetDepend('PKG_USING_GUIENGINE'): - src += ['touch.c'] + src += ['touch.c'] if GetDepend('RT_USING_SDIO'): src += ['s3cmci.c'] diff --git a/bsp/mini2440/drivers/lcd_a70.c b/bsp/mini2440/drivers/lcd_a70.c index 7ebcf6a047..5020012b2f 100644 --- a/bsp/mini2440/drivers/lcd_a70.c +++ b/bsp/mini2440/drivers/lcd_a70.c @@ -34,81 +34,81 @@ #define SCR_XSIZE LCD_WIDTH #define SCR_YSIZE LCD_HEIGHT -#define RT_HW_LCD_WIDTH LCD_WIDTH -#define RT_HW_LCD_HEIGHT LCD_HEIGHT +#define RT_HW_LCD_WIDTH LCD_WIDTH +#define RT_HW_LCD_HEIGHT LCD_HEIGHT -#define MVAL (13) -#define MVAL_USED (0) //0=each frame 1=rate by MVAL -#define INVVDEN (1) //0=normal 1=inverted -#define BSWP (0) //Byte swap control -#define HWSWP (1) //Half word swap control +#define MVAL (13) +#define MVAL_USED (0) //0=each frame 1=rate by MVAL +#define INVVDEN (1) //0=normal 1=inverted +#define BSWP (0) //Byte swap control +#define HWSWP (1) //Half word swap control -#define GPB1_TO_OUT() (GPBUP &= 0xfffd, GPBCON &= 0xfffffff3, GPBCON |= 0x00000004) -#define GPB1_TO_1() (GPBDAT |= 0x0002) -#define GPB1_TO_0() (GPBDAT &= 0xfffd) +#define GPB1_TO_OUT() (GPBUP &= 0xfffd, GPBCON &= 0xfffffff3, GPBCON |= 0x00000004) +#define GPB1_TO_1() (GPBDAT |= 0x0002) +#define GPB1_TO_0() (GPBDAT &= 0xfffd) #define S3C2410_LCDCON1_CLKVAL(x) ((x) << 8) -#define S3C2410_LCDCON1_MMODE (1<<7) -#define S3C2410_LCDCON1_DSCAN4 (0<<5) -#define S3C2410_LCDCON1_STN4 (1<<5) -#define S3C2410_LCDCON1_STN8 (2<<5) -#define S3C2410_LCDCON1_TFT (3<<5) +#define S3C2410_LCDCON1_MMODE (1<<7) +#define S3C2410_LCDCON1_DSCAN4 (0<<5) +#define S3C2410_LCDCON1_STN4 (1<<5) +#define S3C2410_LCDCON1_STN8 (2<<5) +#define S3C2410_LCDCON1_TFT (3<<5) -#define S3C2410_LCDCON1_STN1BPP (0<<1) +#define S3C2410_LCDCON1_STN1BPP (0<<1) #define S3C2410_LCDCON1_STN2GREY (1<<1) #define S3C2410_LCDCON1_STN4GREY (2<<1) -#define S3C2410_LCDCON1_STN8BPP (3<<1) +#define S3C2410_LCDCON1_STN8BPP (3<<1) #define S3C2410_LCDCON1_STN12BPP (4<<1) -#define S3C2410_LCDCON1_TFT1BPP (8<<1) -#define S3C2410_LCDCON1_TFT2BPP (9<<1) -#define S3C2410_LCDCON1_TFT4BPP (10<<1) -#define S3C2410_LCDCON1_TFT8BPP (11<<1) +#define S3C2410_LCDCON1_TFT1BPP (8<<1) +#define S3C2410_LCDCON1_TFT2BPP (9<<1) +#define S3C2410_LCDCON1_TFT4BPP (10<<1) +#define S3C2410_LCDCON1_TFT8BPP (11<<1) #define S3C2410_LCDCON1_TFT16BPP (12<<1) #define S3C2410_LCDCON1_TFT24BPP (13<<1) -#define S3C2410_LCDCON1_ENVID (1) +#define S3C2410_LCDCON1_ENVID (1) #define S3C2410_LCDCON1_MODEMASK 0x1E -#define S3C2410_LCDCON2_VBPD(x) ((x) << 24) +#define S3C2410_LCDCON2_VBPD(x) ((x) << 24) #define S3C2410_LCDCON2_LINEVAL(x) ((x) << 14) -#define S3C2410_LCDCON2_VFPD(x) ((x) << 6) -#define S3C2410_LCDCON2_VSPW(x) ((x) << 0) +#define S3C2410_LCDCON2_VFPD(x) ((x) << 6) +#define S3C2410_LCDCON2_VSPW(x) ((x) << 0) #define S3C2410_LCDCON2_GET_VBPD(x) ( ((x) >> 24) & 0xFF) #define S3C2410_LCDCON2_GET_VFPD(x) ( ((x) >> 6) & 0xFF) #define S3C2410_LCDCON2_GET_VSPW(x) ( ((x) >> 0) & 0x3F) -#define S3C2410_LCDCON3_HBPD(x) ((x) << 19) -#define S3C2410_LCDCON3_WDLY(x) ((x) << 19) +#define S3C2410_LCDCON3_HBPD(x) ((x) << 19) +#define S3C2410_LCDCON3_WDLY(x) ((x) << 19) #define S3C2410_LCDCON3_HOZVAL(x) ((x) << 8) -#define S3C2410_LCDCON3_HFPD(x) ((x) << 0) +#define S3C2410_LCDCON3_HFPD(x) ((x) << 0) #define S3C2410_LCDCON3_LINEBLANK(x)((x) << 0) #define S3C2410_LCDCON3_GET_HBPD(x) ( ((x) >> 19) & 0x7F) #define S3C2410_LCDCON3_GET_HFPD(x) ( ((x) >> 0) & 0xFF) -#define S3C2410_LCDCON4_MVAL(x) ((x) << 8) -#define S3C2410_LCDCON4_HSPW(x) ((x) << 0) -#define S3C2410_LCDCON4_WLH(x) ((x) << 0) +#define S3C2410_LCDCON4_MVAL(x) ((x) << 8) +#define S3C2410_LCDCON4_HSPW(x) ((x) << 0) +#define S3C2410_LCDCON4_WLH(x) ((x) << 0) #define S3C2410_LCDCON4_GET_HSPW(x) ( ((x) >> 0) & 0xFF) -#define S3C2410_LCDCON5_BPP24BL (1<<12) -#define S3C2410_LCDCON5_FRM565 (1<<11) -#define S3C2410_LCDCON5_INVVCLK (1<<10) +#define S3C2410_LCDCON5_BPP24BL (1<<12) +#define S3C2410_LCDCON5_FRM565 (1<<11) +#define S3C2410_LCDCON5_INVVCLK (1<<10) #define S3C2410_LCDCON5_INVVLINE (1<<9) #define S3C2410_LCDCON5_INVVFRAME (1<<8) -#define S3C2410_LCDCON5_INVVD (1<<7) -#define S3C2410_LCDCON5_INVVDEN (1<<6) +#define S3C2410_LCDCON5_INVVD (1<<7) +#define S3C2410_LCDCON5_INVVDEN (1<<6) #define S3C2410_LCDCON5_INVPWREN (1<<5) -#define S3C2410_LCDCON5_INVLEND (1<<4) -#define S3C2410_LCDCON5_PWREN (1<<3) -#define S3C2410_LCDCON5_ENLEND (1<<2) -#define S3C2410_LCDCON5_BSWP (1<<1) -#define S3C2410_LCDCON5_HWSWP (1<<0) -#define S3C2410_LCDINT_FRSYNC (1<<1) +#define S3C2410_LCDCON5_INVLEND (1<<4) +#define S3C2410_LCDCON5_PWREN (1<<3) +#define S3C2410_LCDCON5_ENLEND (1<<2) +#define S3C2410_LCDCON5_BSWP (1<<1) +#define S3C2410_LCDCON5_HWSWP (1<<0) +#define S3C2410_LCDINT_FRSYNC (1<<1) static volatile rt_uint16_t _rt_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH]; //static volatile rt_uint16_t _rt_hw_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH]; @@ -127,123 +127,123 @@ static void lcd_power_enable(int invpwren, int pwren) static void lcd_envid_on_off(int onoff) { - if(onoff==1) - /*ENVID=ON*/ - LCDCON1|=1; - else - /*ENVID Off*/ - LCDCON1 =LCDCON1 & 0x3fffe; + if(onoff==1) + /*ENVID=ON*/ + LCDCON1|=1; + else + /*ENVID Off*/ + LCDCON1 =LCDCON1 & 0x3fffe; } //********************** BOARD LCD backlight **************************** static void LcdBkLtSet(rt_uint32_t HiRatio) { -#define FREQ_PWM1 1000 - if(!HiRatio) - { - GPBCON = GPBCON & (~(3<<2)) | (1<<2) ; //GPB1Ϊoutput - GPBDAT &= ~(1<<1); - return; - } - GPBCON = GPBCON & (~(3<<2)) | (2<<2) ; +#define FREQ_PWM1 1000 + if(!HiRatio) + { + GPBCON = GPBCON & (~(3<<2)) | (1<<2) ; + GPBDAT &= ~(1<<1); + return; + } + GPBCON = GPBCON & (~(3<<2)) | (2<<2) ; - if( HiRatio > 100 ) HiRatio = 100 ; + if( HiRatio > 100 ) HiRatio = 100 ; - TCON = TCON & (~(0xf<<8)) ; // clear manual update bit, stop Timer1 + TCON = TCON & (~(0xf<<8)) ; // clear manual update bit, stop Timer1 - TCFG0 &= 0xffffff00; // set Timer 0&1 prescaler 0 - TCFG0 |= 15; //prescaler = 15+1 + TCFG0 &= 0xffffff00; // set Timer 0&1 prescaler 0 + TCFG0 |= 15; //prescaler = 15+1 - TCFG1 &= 0xffffff0f; // set Timer 1 MUX 1/16 - TCFG1 |= 0x00000030; // set Timer 1 MUX 1/16 + TCFG1 &= 0xffffff0f; // set Timer 1 MUX 1/16 + TCFG1 |= 0x00000030; // set Timer 1 MUX 1/16 - TCNTB1 = ( 100000000>>8 )/FREQ_PWM1; //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low - TCMPB1 = ( TCNTB1*(100-HiRatio))/100 ; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high + TCNTB1 = ( 100000000>>8 )/FREQ_PWM1; //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low + TCMPB1 = ( TCNTB1*(100-HiRatio))/100 ; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high - TCON = TCON & (~(0xf<<8)) | (0x0e<<8) ; - TCON = TCON & (~(0xf<<8)) | (0x0d<<8) ; + TCON = TCON & (~(0xf<<8)) | (0x0e<<8) ; + TCON = TCON & (~(0xf<<8)) | (0x0d<<8) ; } /* RT-Thread Device Interface */ static rt_err_t rt_lcd_init (rt_device_t dev) -{ - GPB1_TO_OUT(); - GPB1_TO_1(); +{ + GPB1_TO_OUT(); + GPB1_TO_1(); - GPCUP = 0x00000000; - GPCCON = 0xaaaa02a9; + GPCUP = 0x00000000; + GPCCON = 0xaaaa02a9; - GPDUP = 0x00000000; - GPDCON = 0xaaaaaaaa; + GPDUP = 0x00000000; + GPDCON = 0xaaaaaaaa; -#define M5D(n) ((n)&0x1fffff) +#define M5D(n) ((n)&0x1fffff) #define LCD_ADDR ((rt_uint32_t)_rt_framebuffer) - LCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1); - LCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0); - LCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH - 1) << 8) | (LCD_LEFT_MARGIN << 0); - LCDCON4 = (13 << 8) | (LCD_HSYNC_LEN << 0); + LCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1); + LCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0); + LCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH - 1) << 8) | (LCD_LEFT_MARGIN << 0); + LCDCON4 = (13 << 8) | (LCD_HSYNC_LEN << 0); #if !defined(LCD_CON5) #define LCD_CON5 ((1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0)) #endif - LCDCON5 = LCD_CON5; + LCDCON5 = LCD_CON5; - LCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) << 0); - LCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1); - LCDSADDR3 = LCD_WIDTH; + LCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) << 0); + LCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1); + LCDSADDR3 = LCD_WIDTH; - LCDINTMSK |= (3); - LPCSEL &= (~7) ; - TPAL=0; + LCDINTMSK |= (3); + LPCSEL &= (~7) ; + TPAL=0; - LcdBkLtSet(70) ; - lcd_power_enable(0, 1); - lcd_envid_on_off(1); + LcdBkLtSet(70) ; + lcd_power_enable(0, 1); + lcd_envid_on_off(1); - return RT_EOK; + return RT_EOK; } static rt_err_t rt_lcd_control (rt_device_t dev, int cmd, void *args) { - switch (cmd) - { - case RTGRAPHIC_CTRL_RECT_UPDATE: - break; - case RTGRAPHIC_CTRL_POWERON: - break; - case RTGRAPHIC_CTRL_POWEROFF: - break; - case RTGRAPHIC_CTRL_GET_INFO: - rt_memcpy(args, &_lcd_info, sizeof(_lcd_info)); - break; - case RTGRAPHIC_CTRL_SET_MODE: - break; - } + switch (cmd) + { + case RTGRAPHIC_CTRL_RECT_UPDATE: + break; + case RTGRAPHIC_CTRL_POWERON: + break; + case RTGRAPHIC_CTRL_POWEROFF: + break; + case RTGRAPHIC_CTRL_GET_INFO: + rt_memcpy(args, &_lcd_info, sizeof(_lcd_info)); + break; + case RTGRAPHIC_CTRL_SET_MODE: + break; + } - return RT_EOK; + return RT_EOK; } int rt_hw_lcd_init(void) { - rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); - if (lcd == RT_NULL) + rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); + if (lcd == RT_NULL) return -RT_ERROR; /* no memory yet */ - _lcd_info.bits_per_pixel = 16; - _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; - _lcd_info.framebuffer = (void*)_rt_framebuffer; - _lcd_info.width = LCD_WIDTH; - _lcd_info.height = LCD_HEIGHT; + _lcd_info.bits_per_pixel = 16; + _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; + _lcd_info.framebuffer = (void*)_rt_framebuffer; + _lcd_info.width = LCD_WIDTH; + _lcd_info.height = LCD_HEIGHT; - /* init device structure */ - lcd->type = RT_Device_Class_Unknown; - lcd->init = rt_lcd_init; - lcd->open = RT_NULL; - lcd->close = RT_NULL; - lcd->control = rt_lcd_control; - lcd->user_data = (void*)&_lcd_info; - - /* register lcd device to RT-Thread */ - rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); + /* init device structure */ + lcd->type = RT_Device_Class_Unknown; + lcd->init = rt_lcd_init; + lcd->open = RT_NULL; + lcd->close = RT_NULL; + lcd->control = rt_lcd_control; + lcd->user_data = (void*)&_lcd_info; + + /* register lcd device to RT-Thread */ + rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); } INIT_BOARD_EXPORT(rt_hw_lcd_init); diff --git a/bsp/mini2440/drivers/lcd_n35.c b/bsp/mini2440/drivers/lcd_n35.c index 57d792ea39..1a3af23c09 100644 --- a/bsp/mini2440/drivers/lcd_n35.c +++ b/bsp/mini2440/drivers/lcd_n35.c @@ -34,82 +34,82 @@ #define SCR_XSIZE LCD_WIDTH #define SCR_YSIZE LCD_HEIGHT -#define RT_HW_LCD_WIDTH LCD_WIDTH -#define RT_HW_LCD_HEIGHT LCD_HEIGHT +#define RT_HW_LCD_WIDTH LCD_WIDTH +#define RT_HW_LCD_HEIGHT LCD_HEIGHT -#define MVAL (13) -#define MVAL_USED (0) //0=each frame 1=rate by MVAL -#define INVVDEN (1) //0=normal 1=inverted -#define BSWP (0) //Byte swap control -#define HWSWP (1) //Half word swap control +#define MVAL (13) +#define MVAL_USED (0) //0=each frame 1=rate by MVAL +#define INVVDEN (1) //0=normal 1=inverted +#define BSWP (0) //Byte swap control +#define HWSWP (1) //Half word swap control -#define GPB1_TO_OUT() (GPBUP &= 0xfffd, GPBCON &= 0xfffffff3, GPBCON |= 0x00000004) -#define GPB1_TO_1() (GPBDAT |= 0x0002) -#define GPB1_TO_0() (GPBDAT &= 0xfffd) +#define GPB1_TO_OUT() (GPBUP &= 0xfffd, GPBCON &= 0xfffffff3, GPBCON |= 0x00000004) +#define GPB1_TO_1() (GPBDAT |= 0x0002) +#define GPB1_TO_0() (GPBDAT &= 0xfffd) #define S3C2410_LCDCON1_CLKVAL(x) ((x) << 8) -#define S3C2410_LCDCON1_MMODE (1<<7) -#define S3C2410_LCDCON1_DSCAN4 (0<<5) -#define S3C2410_LCDCON1_STN4 (1<<5) -#define S3C2410_LCDCON1_STN8 (2<<5) -#define S3C2410_LCDCON1_TFT (3<<5) +#define S3C2410_LCDCON1_MMODE (1<<7) +#define S3C2410_LCDCON1_DSCAN4 (0<<5) +#define S3C2410_LCDCON1_STN4 (1<<5) +#define S3C2410_LCDCON1_STN8 (2<<5) +#define S3C2410_LCDCON1_TFT (3<<5) -#define S3C2410_LCDCON1_STN1BPP (0<<1) +#define S3C2410_LCDCON1_STN1BPP (0<<1) #define S3C2410_LCDCON1_STN2GREY (1<<1) #define S3C2410_LCDCON1_STN4GREY (2<<1) -#define S3C2410_LCDCON1_STN8BPP (3<<1) +#define S3C2410_LCDCON1_STN8BPP (3<<1) #define S3C2410_LCDCON1_STN12BPP (4<<1) -#define S3C2410_LCDCON1_TFT1BPP (8<<1) -#define S3C2410_LCDCON1_TFT2BPP (9<<1) -#define S3C2410_LCDCON1_TFT4BPP (10<<1) -#define S3C2410_LCDCON1_TFT8BPP (11<<1) +#define S3C2410_LCDCON1_TFT1BPP (8<<1) +#define S3C2410_LCDCON1_TFT2BPP (9<<1) +#define S3C2410_LCDCON1_TFT4BPP (10<<1) +#define S3C2410_LCDCON1_TFT8BPP (11<<1) #define S3C2410_LCDCON1_TFT16BPP (12<<1) #define S3C2410_LCDCON1_TFT24BPP (13<<1) -#define S3C2410_LCDCON1_ENVID (1) +#define S3C2410_LCDCON1_ENVID (1) #define S3C2410_LCDCON1_MODEMASK 0x1E -#define S3C2410_LCDCON2_VBPD(x) ((x) << 24) +#define S3C2410_LCDCON2_VBPD(x) ((x) << 24) #define S3C2410_LCDCON2_LINEVAL(x) ((x) << 14) -#define S3C2410_LCDCON2_VFPD(x) ((x) << 6) -#define S3C2410_LCDCON2_VSPW(x) ((x) << 0) +#define S3C2410_LCDCON2_VFPD(x) ((x) << 6) +#define S3C2410_LCDCON2_VSPW(x) ((x) << 0) #define S3C2410_LCDCON2_GET_VBPD(x) ( ((x) >> 24) & 0xFF) #define S3C2410_LCDCON2_GET_VFPD(x) ( ((x) >> 6) & 0xFF) #define S3C2410_LCDCON2_GET_VSPW(x) ( ((x) >> 0) & 0x3F) -#define S3C2410_LCDCON3_HBPD(x) ((x) << 19) -#define S3C2410_LCDCON3_WDLY(x) ((x) << 19) +#define S3C2410_LCDCON3_HBPD(x) ((x) << 19) +#define S3C2410_LCDCON3_WDLY(x) ((x) << 19) #define S3C2410_LCDCON3_HOZVAL(x) ((x) << 8) -#define S3C2410_LCDCON3_HFPD(x) ((x) << 0) +#define S3C2410_LCDCON3_HFPD(x) ((x) << 0) #define S3C2410_LCDCON3_LINEBLANK(x)((x) << 0) #define S3C2410_LCDCON3_GET_HBPD(x) ( ((x) >> 19) & 0x7F) #define S3C2410_LCDCON3_GET_HFPD(x) ( ((x) >> 0) & 0xFF) -#define S3C2410_LCDCON4_MVAL(x) ((x) << 8) -#define S3C2410_LCDCON4_HSPW(x) ((x) << 0) -#define S3C2410_LCDCON4_WLH(x) ((x) << 0) +#define S3C2410_LCDCON4_MVAL(x) ((x) << 8) +#define S3C2410_LCDCON4_HSPW(x) ((x) << 0) +#define S3C2410_LCDCON4_WLH(x) ((x) << 0) #define S3C2410_LCDCON4_GET_HSPW(x) ( ((x) >> 0) & 0xFF) -#define S3C2410_LCDCON5_BPP24BL (1<<12) -#define S3C2410_LCDCON5_FRM565 (1<<11) -#define S3C2410_LCDCON5_INVVCLK (1<<10) +#define S3C2410_LCDCON5_BPP24BL (1<<12) +#define S3C2410_LCDCON5_FRM565 (1<<11) +#define S3C2410_LCDCON5_INVVCLK (1<<10) #define S3C2410_LCDCON5_INVVLINE (1<<9) #define S3C2410_LCDCON5_INVVFRAME (1<<8) -#define S3C2410_LCDCON5_INVVD (1<<7) -#define S3C2410_LCDCON5_INVVDEN (1<<6) +#define S3C2410_LCDCON5_INVVD (1<<7) +#define S3C2410_LCDCON5_INVVDEN (1<<6) #define S3C2410_LCDCON5_INVPWREN (1<<5) -#define S3C2410_LCDCON5_INVLEND (1<<4) -#define S3C2410_LCDCON5_PWREN (1<<3) -#define S3C2410_LCDCON5_ENLEND (1<<2) -#define S3C2410_LCDCON5_BSWP (1<<1) -#define S3C2410_LCDCON5_HWSWP (1<<0) +#define S3C2410_LCDCON5_INVLEND (1<<4) +#define S3C2410_LCDCON5_PWREN (1<<3) +#define S3C2410_LCDCON5_ENLEND (1<<2) +#define S3C2410_LCDCON5_BSWP (1<<1) +#define S3C2410_LCDCON5_HWSWP (1<<0) -#define S3C2410_LCDINT_FRSYNC (1<<1) +#define S3C2410_LCDINT_FRSYNC (1<<1) static volatile rt_uint16_t _rt_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH]; //static volatile rt_uint16_t _rt_hw_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH]; @@ -128,61 +128,61 @@ static void lcd_power_enable(int invpwren, int pwren) static void lcd_envid_on_off(int onoff) { - if(onoff==1) - /*ENVID=ON*/ - LCDCON1|=1; - else - /*ENVID Off*/ - LCDCON1 =LCDCON1 & 0x3fffe; + if(onoff==1) + /*ENVID=ON*/ + LCDCON1|=1; + else + /*ENVID Off*/ + LCDCON1 =LCDCON1 & 0x3fffe; } //********************** BOARD LCD backlight **************************** static void LcdBkLtSet(rt_uint32_t HiRatio) { -#define FREQ_PWM1 1000 - if(!HiRatio) - { - GPBCON = GPBCON & (~(3<<2)) | (1<<2) ; //GPB1Ϊoutput - GPBDAT &= ~(1<<1); - return; - } - GPBCON = GPBCON & (~(3<<2)) | (2<<2) ; +#define FREQ_PWM1 1000 + if(!HiRatio) + { + GPBCON = GPBCON & (~(3<<2)) | (1<<2) ; + GPBDAT &= ~(1<<1); + return; + } + GPBCON = GPBCON & (~(3<<2)) | (2<<2) ; - if( HiRatio > 100 ) HiRatio = 100 ; + if( HiRatio > 100 ) HiRatio = 100 ; - TCON = TCON & (~(0xf<<8)) ; // clear manual update bit, stop Timer1 + TCON = TCON & (~(0xf<<8)) ; // clear manual update bit, stop Timer1 - TCFG0 &= 0xffffff00; // set Timer 0&1 prescaler 0 - TCFG0 |= 15; //prescaler = 15+1 + TCFG0 &= 0xffffff00; // set Timer 0&1 prescaler 0 + TCFG0 |= 15; //prescaler = 15+1 - TCFG1 &= 0xffffff0f; // set Timer 1 MUX 1/16 - TCFG1 |= 0x00000030; // set Timer 1 MUX 1/16 + TCFG1 &= 0xffffff0f; // set Timer 1 MUX 1/16 + TCFG1 |= 0x00000030; // set Timer 1 MUX 1/16 - TCNTB1 = ( 100000000>>8 )/FREQ_PWM1; //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low - TCMPB1 = ( TCNTB1*(100-HiRatio))/100 ; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high + TCNTB1 = ( 100000000>>8 )/FREQ_PWM1; //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low + TCMPB1 = ( TCNTB1*(100-HiRatio))/100 ; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high - TCON = TCON & (~(0xf<<8)) | (0x0e<<8) ; - TCON = TCON & (~(0xf<<8)) | (0x0d<<8) ; + TCON = TCON & (~(0xf<<8)) | (0x0e<<8) ; + TCON = TCON & (~(0xf<<8)) | (0x0d<<8) ; } /* RT-Thread Device Interface */ static rt_err_t rt_lcd_init (rt_device_t dev) -{ - GPB1_TO_OUT(); - GPB1_TO_1(); +{ + GPB1_TO_OUT(); + GPB1_TO_1(); - GPCUP = 0x00000000; - GPCCON = 0xaaaa02a9; + GPCUP = 0x00000000; + GPCCON = 0xaaaa02a9; - GPDUP = 0x00000000; - GPDCON = 0xaaaaaaaa; + GPDUP = 0x00000000; + GPDCON = 0xaaaaaaaa; -#define M5D(n) ((n)&0x1fffff) +#define M5D(n) ((n)&0x1fffff) #define LCD_ADDR ((rt_uint32_t)_rt_framebuffer) - LCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1); - LCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0); - LCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH - 1) << 8) | (LCD_LEFT_MARGIN << 0); - LCDCON4 = (13 << 8) | (LCD_HSYNC_LEN << 0); + LCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1); + LCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0); + LCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH - 1) << 8) | (LCD_LEFT_MARGIN << 0); + LCDCON4 = (13 << 8) | (LCD_HSYNC_LEN << 0); #if !defined(LCD_CON5) #define LCD_CON5 ((1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0)) #endif @@ -192,59 +192,59 @@ static rt_err_t rt_lcd_init (rt_device_t dev) LCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1); LCDSADDR3 = LCD_WIDTH; - LCDINTMSK |= (3); - LPCSEL &= (~7) ; - TPAL=0; + LCDINTMSK |= (3); + LPCSEL &= (~7) ; + TPAL=0; - LcdBkLtSet(70) ; - lcd_power_enable(0, 1); - lcd_envid_on_off(1); + LcdBkLtSet(70) ; + lcd_power_enable(0, 1); + lcd_envid_on_off(1); - return RT_EOK; + return RT_EOK; } static rt_err_t rt_lcd_control (rt_device_t dev, int cmd, void *args) { - switch (cmd) - { - case RTGRAPHIC_CTRL_RECT_UPDATE: - break; - case RTGRAPHIC_CTRL_POWERON: - break; - case RTGRAPHIC_CTRL_POWEROFF: - break; - case RTGRAPHIC_CTRL_GET_INFO: - rt_memcpy(args, &_lcd_info, sizeof(_lcd_info)); - break; - case RTGRAPHIC_CTRL_SET_MODE: - break; - } + switch (cmd) + { + case RTGRAPHIC_CTRL_RECT_UPDATE: + break; + case RTGRAPHIC_CTRL_POWERON: + break; + case RTGRAPHIC_CTRL_POWEROFF: + break; + case RTGRAPHIC_CTRL_GET_INFO: + rt_memcpy(args, &_lcd_info, sizeof(_lcd_info)); + break; + case RTGRAPHIC_CTRL_SET_MODE: + break; + } - return RT_EOK; + return RT_EOK; } int rt_hw_lcd_init(void) { - rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); - if (lcd == RT_NULL) + rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); + if (lcd == RT_NULL) return -RT_ERROR; /* no memory yet */ - _lcd_info.bits_per_pixel = 16; - _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; - _lcd_info.framebuffer = (void*)_rt_framebuffer; - _lcd_info.width = LCD_WIDTH; - _lcd_info.height = LCD_HEIGHT; + _lcd_info.bits_per_pixel = 16; + _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; + _lcd_info.framebuffer = (void*)_rt_framebuffer; + _lcd_info.width = LCD_WIDTH; + _lcd_info.height = LCD_HEIGHT; - /* init device structure */ - lcd->type = RT_Device_Class_Unknown; - lcd->init = rt_lcd_init; - lcd->open = RT_NULL; - lcd->close = RT_NULL; - lcd->control = rt_lcd_control; - lcd->user_data = (void*)&_lcd_info; - - /* register lcd device to RT-Thread */ - rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); + /* init device structure */ + lcd->type = RT_Device_Class_Unknown; + lcd->init = rt_lcd_init; + lcd->open = RT_NULL; + lcd->close = RT_NULL; + lcd->control = rt_lcd_control; + lcd->user_data = (void*)&_lcd_info; + + /* register lcd device to RT-Thread */ + rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); } INIT_BOARD_EXPORT(rt_hw_lcd_init); diff --git a/bsp/mini2440/drivers/lcd_t35.c b/bsp/mini2440/drivers/lcd_t35.c index fdcab887f5..c13a3c030f 100644 --- a/bsp/mini2440/drivers/lcd_t35.c +++ b/bsp/mini2440/drivers/lcd_t35.c @@ -34,82 +34,82 @@ #define SCR_XSIZE LCD_WIDTH #define SCR_YSIZE LCD_HEIGHT -#define RT_HW_LCD_WIDTH LCD_WIDTH -#define RT_HW_LCD_HEIGHT LCD_HEIGHT +#define RT_HW_LCD_WIDTH LCD_WIDTH +#define RT_HW_LCD_HEIGHT LCD_HEIGHT -#define MVAL (13) -#define MVAL_USED (0) //0=each frame 1=rate by MVAL -#define INVVDEN (1) //0=normal 1=inverted -#define BSWP (0) //Byte swap control -#define HWSWP (1) //Half word swap control +#define MVAL (13) +#define MVAL_USED (0) //0=each frame 1=rate by MVAL +#define INVVDEN (1) //0=normal 1=inverted +#define BSWP (0) //Byte swap control +#define HWSWP (1) //Half word swap control -#define GPB1_TO_OUT() (GPBUP &= 0xfffd, GPBCON &= 0xfffffff3, GPBCON |= 0x00000004) -#define GPB1_TO_1() (GPBDAT |= 0x0002) -#define GPB1_TO_0() (GPBDAT &= 0xfffd) +#define GPB1_TO_OUT() (GPBUP &= 0xfffd, GPBCON &= 0xfffffff3, GPBCON |= 0x00000004) +#define GPB1_TO_1() (GPBDAT |= 0x0002) +#define GPB1_TO_0() (GPBDAT &= 0xfffd) #define S3C2410_LCDCON1_CLKVAL(x) ((x) << 8) -#define S3C2410_LCDCON1_MMODE (1<<7) -#define S3C2410_LCDCON1_DSCAN4 (0<<5) -#define S3C2410_LCDCON1_STN4 (1<<5) -#define S3C2410_LCDCON1_STN8 (2<<5) -#define S3C2410_LCDCON1_TFT (3<<5) +#define S3C2410_LCDCON1_MMODE (1<<7) +#define S3C2410_LCDCON1_DSCAN4 (0<<5) +#define S3C2410_LCDCON1_STN4 (1<<5) +#define S3C2410_LCDCON1_STN8 (2<<5) +#define S3C2410_LCDCON1_TFT (3<<5) -#define S3C2410_LCDCON1_STN1BPP (0<<1) +#define S3C2410_LCDCON1_STN1BPP (0<<1) #define S3C2410_LCDCON1_STN2GREY (1<<1) #define S3C2410_LCDCON1_STN4GREY (2<<1) -#define S3C2410_LCDCON1_STN8BPP (3<<1) +#define S3C2410_LCDCON1_STN8BPP (3<<1) #define S3C2410_LCDCON1_STN12BPP (4<<1) -#define S3C2410_LCDCON1_TFT1BPP (8<<1) -#define S3C2410_LCDCON1_TFT2BPP (9<<1) -#define S3C2410_LCDCON1_TFT4BPP (10<<1) -#define S3C2410_LCDCON1_TFT8BPP (11<<1) +#define S3C2410_LCDCON1_TFT1BPP (8<<1) +#define S3C2410_LCDCON1_TFT2BPP (9<<1) +#define S3C2410_LCDCON1_TFT4BPP (10<<1) +#define S3C2410_LCDCON1_TFT8BPP (11<<1) #define S3C2410_LCDCON1_TFT16BPP (12<<1) #define S3C2410_LCDCON1_TFT24BPP (13<<1) -#define S3C2410_LCDCON1_ENVID (1) +#define S3C2410_LCDCON1_ENVID (1) #define S3C2410_LCDCON1_MODEMASK 0x1E -#define S3C2410_LCDCON2_VBPD(x) ((x) << 24) +#define S3C2410_LCDCON2_VBPD(x) ((x) << 24) #define S3C2410_LCDCON2_LINEVAL(x) ((x) << 14) -#define S3C2410_LCDCON2_VFPD(x) ((x) << 6) -#define S3C2410_LCDCON2_VSPW(x) ((x) << 0) +#define S3C2410_LCDCON2_VFPD(x) ((x) << 6) +#define S3C2410_LCDCON2_VSPW(x) ((x) << 0) #define S3C2410_LCDCON2_GET_VBPD(x) ( ((x) >> 24) & 0xFF) #define S3C2410_LCDCON2_GET_VFPD(x) ( ((x) >> 6) & 0xFF) #define S3C2410_LCDCON2_GET_VSPW(x) ( ((x) >> 0) & 0x3F) -#define S3C2410_LCDCON3_HBPD(x) ((x) << 19) -#define S3C2410_LCDCON3_WDLY(x) ((x) << 19) +#define S3C2410_LCDCON3_HBPD(x) ((x) << 19) +#define S3C2410_LCDCON3_WDLY(x) ((x) << 19) #define S3C2410_LCDCON3_HOZVAL(x) ((x) << 8) -#define S3C2410_LCDCON3_HFPD(x) ((x) << 0) +#define S3C2410_LCDCON3_HFPD(x) ((x) << 0) #define S3C2410_LCDCON3_LINEBLANK(x)((x) << 0) #define S3C2410_LCDCON3_GET_HBPD(x) ( ((x) >> 19) & 0x7F) #define S3C2410_LCDCON3_GET_HFPD(x) ( ((x) >> 0) & 0xFF) -#define S3C2410_LCDCON4_MVAL(x) ((x) << 8) -#define S3C2410_LCDCON4_HSPW(x) ((x) << 0) -#define S3C2410_LCDCON4_WLH(x) ((x) << 0) +#define S3C2410_LCDCON4_MVAL(x) ((x) << 8) +#define S3C2410_LCDCON4_HSPW(x) ((x) << 0) +#define S3C2410_LCDCON4_WLH(x) ((x) << 0) #define S3C2410_LCDCON4_GET_HSPW(x) ( ((x) >> 0) & 0xFF) -#define S3C2410_LCDCON5_BPP24BL (1<<12) -#define S3C2410_LCDCON5_FRM565 (1<<11) -#define S3C2410_LCDCON5_INVVCLK (1<<10) +#define S3C2410_LCDCON5_BPP24BL (1<<12) +#define S3C2410_LCDCON5_FRM565 (1<<11) +#define S3C2410_LCDCON5_INVVCLK (1<<10) #define S3C2410_LCDCON5_INVVLINE (1<<9) #define S3C2410_LCDCON5_INVVFRAME (1<<8) -#define S3C2410_LCDCON5_INVVD (1<<7) -#define S3C2410_LCDCON5_INVVDEN (1<<6) +#define S3C2410_LCDCON5_INVVD (1<<7) +#define S3C2410_LCDCON5_INVVDEN (1<<6) #define S3C2410_LCDCON5_INVPWREN (1<<5) -#define S3C2410_LCDCON5_INVLEND (1<<4) -#define S3C2410_LCDCON5_PWREN (1<<3) -#define S3C2410_LCDCON5_ENLEND (1<<2) -#define S3C2410_LCDCON5_BSWP (1<<1) -#define S3C2410_LCDCON5_HWSWP (1<<0) +#define S3C2410_LCDCON5_INVLEND (1<<4) +#define S3C2410_LCDCON5_PWREN (1<<3) +#define S3C2410_LCDCON5_ENLEND (1<<2) +#define S3C2410_LCDCON5_BSWP (1<<1) +#define S3C2410_LCDCON5_HWSWP (1<<0) -#define S3C2410_LCDINT_FRSYNC (1<<1) +#define S3C2410_LCDINT_FRSYNC (1<<1) volatile rt_uint16_t _rt_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH]; //volatile rt_uint16_t _rt_hw_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH]; @@ -128,124 +128,124 @@ static void lcd_power_enable(int invpwren, int pwren) static void lcd_envid_on_off(int onoff) { - if(onoff==1) - /*ENVID=ON*/ - LCDCON1|=1; - else - /*ENVID Off*/ - LCDCON1 =LCDCON1 & 0x3fffe; + if(onoff==1) + /*ENVID=ON*/ + LCDCON1|=1; + else + /*ENVID Off*/ + LCDCON1 =LCDCON1 & 0x3fffe; } //********************** BOARD LCD backlight **************************** static void LcdBkLtSet(rt_uint32_t HiRatio) { -#define FREQ_PWM1 1000 - if(!HiRatio) - { - GPBCON = GPBCON & (~(3<<2)) | (1<<2) ; //GPB1Ϊoutput - GPBDAT &= ~(1<<1); - return; - } - GPBCON = GPBCON & (~(3<<2)) | (2<<2) ; +#define FREQ_PWM1 1000 + if(!HiRatio) + { + GPBCON = GPBCON & (~(3<<2)) | (1<<2) ; + GPBDAT &= ~(1<<1); + return; + } + GPBCON = GPBCON & (~(3<<2)) | (2<<2) ; - if( HiRatio > 100 ) HiRatio = 100 ; + if( HiRatio > 100 ) HiRatio = 100 ; - TCON = TCON & (~(0xf<<8)) ; // clear manual update bit, stop Timer1 + TCON = TCON & (~(0xf<<8)) ; // clear manual update bit, stop Timer1 - TCFG0 &= 0xffffff00; // set Timer 0&1 prescaler 0 - TCFG0 |= 15; //prescaler = 15+1 + TCFG0 &= 0xffffff00; // set Timer 0&1 prescaler 0 + TCFG0 |= 15; //prescaler = 15+1 - TCFG1 &= 0xffffff0f; // set Timer 1 MUX 1/16 - TCFG1 |= 0x00000030; // set Timer 1 MUX 1/16 + TCFG1 &= 0xffffff0f; // set Timer 1 MUX 1/16 + TCFG1 |= 0x00000030; // set Timer 1 MUX 1/16 - TCNTB1 = ( 100000000>>8 )/FREQ_PWM1; //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low - TCMPB1 = ( TCNTB1*(100-HiRatio))/100 ; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high + TCNTB1 = ( 100000000>>8 )/FREQ_PWM1; //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low + TCMPB1 = ( TCNTB1*(100-HiRatio))/100 ; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high - TCON = TCON & (~(0xf<<8)) | (0x0e<<8) ; - TCON = TCON & (~(0xf<<8)) | (0x0d<<8) ; + TCON = TCON & (~(0xf<<8)) | (0x0e<<8) ; + TCON = TCON & (~(0xf<<8)) | (0x0d<<8) ; } /* RT-Thread Device Interface */ static rt_err_t rt_lcd_init (rt_device_t dev) -{ - GPB1_TO_OUT(); - GPB1_TO_1(); +{ + GPB1_TO_OUT(); + GPB1_TO_1(); - GPCUP = 0x00000000; - GPCCON = 0xaaaa02a9; + GPCUP = 0x00000000; + GPCCON = 0xaaaa02a9; - GPDUP = 0x00000000; - GPDCON = 0xaaaaaaaa; + GPDUP = 0x00000000; + GPDCON = 0xaaaaaaaa; -#define M5D(n) ((n)&0x1fffff) +#define M5D(n) ((n)&0x1fffff) #define LCD_ADDR ((rt_uint32_t)_rt_framebuffer) - LCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1); - LCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0); - LCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH - 1) << 8) | (LCD_LEFT_MARGIN << 0); - LCDCON4 = (13 << 8) | (LCD_HSYNC_LEN << 0); + LCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1); + LCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0); + LCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH - 1) << 8) | (LCD_LEFT_MARGIN << 0); + LCDCON4 = (13 << 8) | (LCD_HSYNC_LEN << 0); #if !defined(LCD_CON5) #define LCD_CON5 ((1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0)) #endif - LCDCON5 = LCD_CON5; + LCDCON5 = LCD_CON5; - LCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) << 0); - LCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1); - LCDSADDR3 = LCD_WIDTH; + LCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) << 0); + LCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1); + LCDSADDR3 = LCD_WIDTH; - LCDINTMSK |= (3); - LPCSEL &= (~7) ; - TPAL=0; + LCDINTMSK |= (3); + LPCSEL &= (~7) ; + TPAL=0; - LcdBkLtSet(70) ; - lcd_power_enable(0, 1); - lcd_envid_on_off(1); + LcdBkLtSet(70) ; + lcd_power_enable(0, 1); + lcd_envid_on_off(1); - return RT_EOK; + return RT_EOK; } static rt_err_t rt_lcd_control (rt_device_t dev, int cmd, void *args) { - switch (cmd) - { - case RTGRAPHIC_CTRL_RECT_UPDATE: - break; - case RTGRAPHIC_CTRL_POWERON: - break; - case RTGRAPHIC_CTRL_POWEROFF: - break; - case RTGRAPHIC_CTRL_GET_INFO: - rt_memcpy(args, &_lcd_info, sizeof(_lcd_info)); - break; - case RTGRAPHIC_CTRL_SET_MODE: - break; - } + switch (cmd) + { + case RTGRAPHIC_CTRL_RECT_UPDATE: + break; + case RTGRAPHIC_CTRL_POWERON: + break; + case RTGRAPHIC_CTRL_POWEROFF: + break; + case RTGRAPHIC_CTRL_GET_INFO: + rt_memcpy(args, &_lcd_info, sizeof(_lcd_info)); + break; + case RTGRAPHIC_CTRL_SET_MODE: + break; + } - return RT_EOK; + return RT_EOK; } int rt_hw_lcd_init(void) { - rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); - if (lcd == RT_NULL) - return -RT_ERROR; /* no memory yet */ + rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); + if (lcd == RT_NULL) + return -RT_ERROR; /* no memory yet */ - _lcd_info.bits_per_pixel = 16; - _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; - _lcd_info.framebuffer = (void*)_rt_framebuffer; - _lcd_info.width = LCD_WIDTH; - _lcd_info.height = LCD_HEIGHT; + _lcd_info.bits_per_pixel = 16; + _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; + _lcd_info.framebuffer = (void*)_rt_framebuffer; + _lcd_info.width = LCD_WIDTH; + _lcd_info.height = LCD_HEIGHT; - /* init device structure */ - lcd->type = RT_Device_Class_Unknown; - lcd->init = rt_lcd_init; - lcd->open = RT_NULL; - lcd->close = RT_NULL; - lcd->control = rt_lcd_control; - lcd->user_data = (void*)&_lcd_info; - - /* register lcd device to RT-Thread */ - rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); + /* init device structure */ + lcd->type = RT_Device_Class_Unknown; + lcd->init = rt_lcd_init; + lcd->open = RT_NULL; + lcd->close = RT_NULL; + lcd->control = rt_lcd_control; + lcd->user_data = (void*)&_lcd_info; + + /* register lcd device to RT-Thread */ + rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); } INIT_BOARD_EXPORT(rt_hw_lcd_init); diff --git a/bsp/mini2440/drivers/lcd_t43.c b/bsp/mini2440/drivers/lcd_t43.c index 54abc12f3e..42b22c36c2 100644 --- a/bsp/mini2440/drivers/lcd_t43.c +++ b/bsp/mini2440/drivers/lcd_t43.c @@ -1,17 +1,12 @@ /* - * File : lcd_t43.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2010, RT-Thread Develop Team + * Copyright (c) 2006-2018, RT-Thread Development Team * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE + * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2020-04-12 Jonne first version from 4.3 inch lcd(480x272) */ - #include #include @@ -36,79 +31,79 @@ #define RT_HW_LCD_WIDTH LCD_WIDTH #define RT_HW_LCD_HEIGHT LCD_HEIGHT -#define MVAL (13) -#define MVAL_USED (0) //0=each frame 1=rate by MVAL -#define INVVDEN (1) //0=normal 1=inverted -#define BSWP (0) //Byte swap control -#define HWSWP (1) //Half word swap control +#define MVAL (13) +#define MVAL_USED (0) //0=each frame 1=rate by MVAL +#define INVVDEN (1) //0=normal 1=inverted +#define BSWP (0) //Byte swap control +#define HWSWP (1) //Half word swap control -#define GPB1_TO_OUT() (GPBUP &= 0xfffd, GPBCON &= 0xfffffff3, GPBCON |= 0x00000004) -#define GPB1_TO_1() (GPBDAT |= 0x0002) -#define GPB1_TO_0() (GPBDAT &= 0xfffd) +#define GPB1_TO_OUT() (GPBUP &= 0xfffd, GPBCON &= 0xfffffff3, GPBCON |= 0x00000004) +#define GPB1_TO_1() (GPBDAT |= 0x0002) +#define GPB1_TO_0() (GPBDAT &= 0xfffd) #define S3C2410_LCDCON1_CLKVAL(x) ((x) << 8) -#define S3C2410_LCDCON1_MMODE (1<<7) -#define S3C2410_LCDCON1_DSCAN4 (0<<5) -#define S3C2410_LCDCON1_STN4 (1<<5) -#define S3C2410_LCDCON1_STN8 (2<<5) -#define S3C2410_LCDCON1_TFT (3<<5) +#define S3C2410_LCDCON1_MMODE (1<<7) +#define S3C2410_LCDCON1_DSCAN4 (0<<5) +#define S3C2410_LCDCON1_STN4 (1<<5) +#define S3C2410_LCDCON1_STN8 (2<<5) +#define S3C2410_LCDCON1_TFT (3<<5) -#define S3C2410_LCDCON1_STN1BPP (0<<1) +#define S3C2410_LCDCON1_STN1BPP (0<<1) #define S3C2410_LCDCON1_STN2GREY (1<<1) #define S3C2410_LCDCON1_STN4GREY (2<<1) -#define S3C2410_LCDCON1_STN8BPP (3<<1) +#define S3C2410_LCDCON1_STN8BPP (3<<1) #define S3C2410_LCDCON1_STN12BPP (4<<1) -#define S3C2410_LCDCON1_TFT1BPP (8<<1) -#define S3C2410_LCDCON1_TFT2BPP (9<<1) -#define S3C2410_LCDCON1_TFT4BPP (10<<1) -#define S3C2410_LCDCON1_TFT8BPP (11<<1) +#define S3C2410_LCDCON1_TFT1BPP (8<<1) +#define S3C2410_LCDCON1_TFT2BPP (9<<1) +#define S3C2410_LCDCON1_TFT4BPP (10<<1) +#define S3C2410_LCDCON1_TFT8BPP (11<<1) #define S3C2410_LCDCON1_TFT16BPP (12<<1) #define S3C2410_LCDCON1_TFT24BPP (13<<1) -#define S3C2410_LCDCON1_ENVID (1) +#define S3C2410_LCDCON1_ENVID (1) #define S3C2410_LCDCON1_MODEMASK 0x1E -#define S3C2410_LCDCON2_VBPD(x) ((x) << 24) +#define S3C2410_LCDCON2_VBPD(x) ((x) << 24) #define S3C2410_LCDCON2_LINEVAL(x) ((x) << 14) -#define S3C2410_LCDCON2_VFPD(x) ((x) << 6) -#define S3C2410_LCDCON2_VSPW(x) ((x) << 0) +#define S3C2410_LCDCON2_VFPD(x) ((x) << 6) +#define S3C2410_LCDCON2_VSPW(x) ((x) << 0) #define S3C2410_LCDCON2_GET_VBPD(x) ( ((x) >> 24) & 0xFF) #define S3C2410_LCDCON2_GET_VFPD(x) ( ((x) >> 6) & 0xFF) #define S3C2410_LCDCON2_GET_VSPW(x) ( ((x) >> 0) & 0x3F) -#define S3C2410_LCDCON3_HBPD(x) ((x) << 19) -#define S3C2410_LCDCON3_WDLY(x) ((x) << 19) +#define S3C2410_LCDCON3_HBPD(x) ((x) << 19) +#define S3C2410_LCDCON3_WDLY(x) ((x) << 19) #define S3C2410_LCDCON3_HOZVAL(x) ((x) << 8) -#define S3C2410_LCDCON3_HFPD(x) ((x) << 0) +#define S3C2410_LCDCON3_HFPD(x) ((x) << 0) #define S3C2410_LCDCON3_LINEBLANK(x)((x) << 0) #define S3C2410_LCDCON3_GET_HBPD(x) ( ((x) >> 19) & 0x7F) #define S3C2410_LCDCON3_GET_HFPD(x) ( ((x) >> 0) & 0xFF) -#define S3C2410_LCDCON4_MVAL(x) ((x) << 8) -#define S3C2410_LCDCON4_HSPW(x) ((x) << 0) -#define S3C2410_LCDCON4_WLH(x) ((x) << 0) +#define S3C2410_LCDCON4_MVAL(x) ((x) << 8) +#define S3C2410_LCDCON4_HSPW(x) ((x) << 0) +#define S3C2410_LCDCON4_WLH(x) ((x) << 0) #define S3C2410_LCDCON4_GET_HSPW(x) ( ((x) >> 0) & 0xFF) -#define S3C2410_LCDCON5_BPP24BL (1<<12) -#define S3C2410_LCDCON5_FRM565 (1<<11) -#define S3C2410_LCDCON5_INVVCLK (1<<10) +#define S3C2410_LCDCON5_BPP24BL (1<<12) +#define S3C2410_LCDCON5_FRM565 (1<<11) +#define S3C2410_LCDCON5_INVVCLK (1<<10) #define S3C2410_LCDCON5_INVVLINE (1<<9) #define S3C2410_LCDCON5_INVVFRAME (1<<8) -#define S3C2410_LCDCON5_INVVD (1<<7) -#define S3C2410_LCDCON5_INVVDEN (1<<6) +#define S3C2410_LCDCON5_INVVD (1<<7) +#define S3C2410_LCDCON5_INVVDEN (1<<6) #define S3C2410_LCDCON5_INVPWREN (1<<5) -#define S3C2410_LCDCON5_INVLEND (1<<4) -#define S3C2410_LCDCON5_PWREN (1<<3) -#define S3C2410_LCDCON5_ENLEND (1<<2) -#define S3C2410_LCDCON5_BSWP (1<<1) -#define S3C2410_LCDCON5_HWSWP (1<<0) +#define S3C2410_LCDCON5_INVLEND (1<<4) +#define S3C2410_LCDCON5_PWREN (1<<3) +#define S3C2410_LCDCON5_ENLEND (1<<2) +#define S3C2410_LCDCON5_BSWP (1<<1) +#define S3C2410_LCDCON5_HWSWP (1<<0) -#define S3C2410_LCDINT_FRSYNC (1<<1) +#define S3C2410_LCDINT_FRSYNC (1<<1) static volatile rt_uint16_t _rt_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH]; //static volatile rt_uint16_t _rt_hw_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH]; @@ -127,61 +122,61 @@ static void lcd_power_enable(int invpwren, int pwren) static void lcd_envid_on_off(int onoff) { - if(onoff==1) - /*ENVID=ON*/ - LCDCON1|=1; - else - /*ENVID Off*/ - LCDCON1 =LCDCON1 & 0x3fffe; + if(onoff==1) + /*ENVID=ON*/ + LCDCON1|=1; + else + /*ENVID Off*/ + LCDCON1 =LCDCON1 & 0x3fffe; } //********************** BOARD LCD backlight **************************** static void LcdBkLtSet(rt_uint32_t HiRatio) { -#define FREQ_PWM1 1000 - if(!HiRatio) - { - GPBCON = GPBCON & (~(3<<2)) | (1<<2) ; - GPBDAT &= ~(1<<1); - return; - } - GPBCON = GPBCON & (~(3<<2)) | (2<<2) ; +#define FREQ_PWM1 1000 + if(!HiRatio) + { + GPBCON = GPBCON & (~(3<<2)) | (1<<2) ; + GPBDAT &= ~(1<<1); + return; + } + GPBCON = GPBCON & (~(3<<2)) | (2<<2) ; - if( HiRatio > 100 ) HiRatio = 100 ; + if( HiRatio > 100 ) HiRatio = 100 ; - TCON = TCON & (~(0xf<<8)) ; // clear manual update bit, stop Timer1 + TCON = TCON & (~(0xf<<8)) ; // clear manual update bit, stop Timer1 - TCFG0 &= 0xffffff00; // set Timer 0&1 prescaler 0 - TCFG0 |= 15; //prescaler = 15+1 + TCFG0 &= 0xffffff00; // set Timer 0&1 prescaler 0 + TCFG0 |= 15; //prescaler = 15+1 - TCFG1 &= 0xffffff0f; // set Timer 1 MUX 1/16 - TCFG1 |= 0x00000030; // set Timer 1 MUX 1/16 + TCFG1 &= 0xffffff0f; // set Timer 1 MUX 1/16 + TCFG1 |= 0x00000030; // set Timer 1 MUX 1/16 - TCNTB1 = ( 100000000>>8 )/FREQ_PWM1; //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low - TCMPB1 = ( TCNTB1*(100-HiRatio))/100 ; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high + TCNTB1 = ( 100000000>>8 )/FREQ_PWM1; //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low + TCMPB1 = ( TCNTB1*(100-HiRatio))/100 ; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high - TCON = TCON & (~(0xf<<8)) | (0x0e<<8) ; - TCON = TCON & (~(0xf<<8)) | (0x0d<<8) ; + TCON = TCON & (~(0xf<<8)) | (0x0e<<8) ; + TCON = TCON & (~(0xf<<8)) | (0x0d<<8) ; } /* RT-Thread Device Interface */ static rt_err_t rt_lcd_init (rt_device_t dev) -{ - GPB1_TO_OUT(); - GPB1_TO_1(); +{ + GPB1_TO_OUT(); + GPB1_TO_1(); - GPCUP = 0x00000000; - GPCCON = 0xaaaa02a9; + GPCUP = 0x00000000; + GPCCON = 0xaaaa02a9; - GPDUP = 0x00000000; - GPDCON = 0xaaaaaaaa; + GPDUP = 0x00000000; + GPDCON = 0xaaaaaaaa; -#define M5D(n) ((n)&0x1fffff) +#define M5D(n) ((n)&0x1fffff) #define LCD_ADDR ((rt_uint32_t)_rt_framebuffer) - LCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1); - LCDCON2 = ((LCD_UPPER_MARGIN - 1) << 24) | ((LCD_HEIGHT - 1) << 14) | ((LCD_LOWER_MARGIN - 1) << 6) | ((LCD_VSYNC_LEN - 1) << 0); - LCDCON3 = ((LCD_RIGHT_MARGIN - 1) << 19) | ((LCD_WIDTH - 1) << 8) | ((LCD_LEFT_MARGIN - 1) << 0); - LCDCON4 = (13 << 8) | ((LCD_HSYNC_LEN - 1) << 0); + LCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1); + LCDCON2 = ((LCD_UPPER_MARGIN - 1) << 24) | ((LCD_HEIGHT - 1) << 14) | ((LCD_LOWER_MARGIN - 1) << 6) | ((LCD_VSYNC_LEN - 1) << 0); + LCDCON3 = ((LCD_RIGHT_MARGIN - 1) << 19) | ((LCD_WIDTH - 1) << 8) | ((LCD_LEFT_MARGIN - 1) << 0); + LCDCON4 = (13 << 8) | ((LCD_HSYNC_LEN - 1) << 0); #if !defined(LCD_CON5) #define LCD_CON5 ((1<<11) | (0<<10) | (1<<9) | (1<<8) | (1<<0)) #endif @@ -191,59 +186,59 @@ static rt_err_t rt_lcd_init (rt_device_t dev) LCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1); LCDSADDR3 = LCD_WIDTH; - LCDINTMSK |= (3); - LPCSEL &= (~7) ; - TPAL=0; + LCDINTMSK |= (3); + LPCSEL &= (~7) ; + TPAL=0; - LcdBkLtSet(70) ; - lcd_power_enable(0, 1); - lcd_envid_on_off(1); + LcdBkLtSet(70) ; + lcd_power_enable(0, 1); + lcd_envid_on_off(1); - return RT_EOK; + return RT_EOK; } static rt_err_t rt_lcd_control (rt_device_t dev, int cmd, void *args) { - switch (cmd) - { - case RTGRAPHIC_CTRL_RECT_UPDATE: - break; - case RTGRAPHIC_CTRL_POWERON: - break; - case RTGRAPHIC_CTRL_POWEROFF: - break; - case RTGRAPHIC_CTRL_GET_INFO: - rt_memcpy(args, &_lcd_info, sizeof(_lcd_info)); - break; - case RTGRAPHIC_CTRL_SET_MODE: - break; - } + switch (cmd) + { + case RTGRAPHIC_CTRL_RECT_UPDATE: + break; + case RTGRAPHIC_CTRL_POWERON: + break; + case RTGRAPHIC_CTRL_POWEROFF: + break; + case RTGRAPHIC_CTRL_GET_INFO: + rt_memcpy(args, &_lcd_info, sizeof(_lcd_info)); + break; + case RTGRAPHIC_CTRL_SET_MODE: + break; + } - return RT_EOK; + return RT_EOK; } int rt_hw_lcd_init(void) { - rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); - if (lcd == RT_NULL) + rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); + if (lcd == RT_NULL) return -RT_ERROR; /* no memory yet */ - _lcd_info.bits_per_pixel = 16; - _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; - _lcd_info.framebuffer = (void*)_rt_framebuffer; - _lcd_info.width = LCD_WIDTH; - _lcd_info.height = LCD_HEIGHT; + _lcd_info.bits_per_pixel = 16; + _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; + _lcd_info.framebuffer = (void*)_rt_framebuffer; + _lcd_info.width = LCD_WIDTH; + _lcd_info.height = LCD_HEIGHT; - /* init device structure */ - lcd->type = RT_Device_Class_Unknown; - lcd->init = rt_lcd_init; - lcd->open = RT_NULL; - lcd->close = RT_NULL; - lcd->control = rt_lcd_control; - lcd->user_data = (void*)&_lcd_info; - - /* register lcd device to RT-Thread */ - rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); + /* init device structure */ + lcd->type = RT_Device_Class_Unknown; + lcd->init = rt_lcd_init; + lcd->open = RT_NULL; + lcd->close = RT_NULL; + lcd->control = rt_lcd_control; + lcd->user_data = (void*)&_lcd_info; + + /* register lcd device to RT-Thread */ + rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); } INIT_BOARD_EXPORT(rt_hw_lcd_init); diff --git a/bsp/mini2440/drivers/lcd_x35.c b/bsp/mini2440/drivers/lcd_x35.c index e625905130..b4a8fda23c 100644 --- a/bsp/mini2440/drivers/lcd_x35.c +++ b/bsp/mini2440/drivers/lcd_x35.c @@ -36,82 +36,82 @@ #define SCR_XSIZE LCD_WIDTH #define SCR_YSIZE LCD_HEIGHT -#define RT_HW_LCD_WIDTH LCD_WIDTH -#define RT_HW_LCD_HEIGHT LCD_HEIGHT +#define RT_HW_LCD_WIDTH LCD_WIDTH +#define RT_HW_LCD_HEIGHT LCD_HEIGHT -#define MVAL (13) -#define MVAL_USED (0) //0=each frame 1=rate by MVAL -#define INVVDEN (1) //0=normal 1=inverted -#define BSWP (0) //Byte swap control -#define HWSWP (1) //Half word swap control +#define MVAL (13) +#define MVAL_USED (0) //0=each frame 1=rate by MVAL +#define INVVDEN (1) //0=normal 1=inverted +#define BSWP (0) //Byte swap control +#define HWSWP (1) //Half word swap control -#define GPB1_TO_OUT() (GPBUP &= 0xfffd, GPBCON &= 0xfffffff3, GPBCON |= 0x00000004) -#define GPB1_TO_1() (GPBDAT |= 0x0002) -#define GPB1_TO_0() (GPBDAT &= 0xfffd) +#define GPB1_TO_OUT() (GPBUP &= 0xfffd, GPBCON &= 0xfffffff3, GPBCON |= 0x00000004) +#define GPB1_TO_1() (GPBDAT |= 0x0002) +#define GPB1_TO_0() (GPBDAT &= 0xfffd) #define S3C2410_LCDCON1_CLKVAL(x) ((x) << 8) -#define S3C2410_LCDCON1_MMODE (1<<7) -#define S3C2410_LCDCON1_DSCAN4 (0<<5) -#define S3C2410_LCDCON1_STN4 (1<<5) -#define S3C2410_LCDCON1_STN8 (2<<5) -#define S3C2410_LCDCON1_TFT (3<<5) +#define S3C2410_LCDCON1_MMODE (1<<7) +#define S3C2410_LCDCON1_DSCAN4 (0<<5) +#define S3C2410_LCDCON1_STN4 (1<<5) +#define S3C2410_LCDCON1_STN8 (2<<5) +#define S3C2410_LCDCON1_TFT (3<<5) -#define S3C2410_LCDCON1_STN1BPP (0<<1) +#define S3C2410_LCDCON1_STN1BPP (0<<1) #define S3C2410_LCDCON1_STN2GREY (1<<1) #define S3C2410_LCDCON1_STN4GREY (2<<1) -#define S3C2410_LCDCON1_STN8BPP (3<<1) +#define S3C2410_LCDCON1_STN8BPP (3<<1) #define S3C2410_LCDCON1_STN12BPP (4<<1) -#define S3C2410_LCDCON1_TFT1BPP (8<<1) -#define S3C2410_LCDCON1_TFT2BPP (9<<1) -#define S3C2410_LCDCON1_TFT4BPP (10<<1) -#define S3C2410_LCDCON1_TFT8BPP (11<<1) +#define S3C2410_LCDCON1_TFT1BPP (8<<1) +#define S3C2410_LCDCON1_TFT2BPP (9<<1) +#define S3C2410_LCDCON1_TFT4BPP (10<<1) +#define S3C2410_LCDCON1_TFT8BPP (11<<1) #define S3C2410_LCDCON1_TFT16BPP (12<<1) #define S3C2410_LCDCON1_TFT24BPP (13<<1) -#define S3C2410_LCDCON1_ENVID (1) +#define S3C2410_LCDCON1_ENVID (1) #define S3C2410_LCDCON1_MODEMASK 0x1E -#define S3C2410_LCDCON2_VBPD(x) ((x) << 24) +#define S3C2410_LCDCON2_VBPD(x) ((x) << 24) #define S3C2410_LCDCON2_LINEVAL(x) ((x) << 14) -#define S3C2410_LCDCON2_VFPD(x) ((x) << 6) -#define S3C2410_LCDCON2_VSPW(x) ((x) << 0) +#define S3C2410_LCDCON2_VFPD(x) ((x) << 6) +#define S3C2410_LCDCON2_VSPW(x) ((x) << 0) #define S3C2410_LCDCON2_GET_VBPD(x) ( ((x) >> 24) & 0xFF) #define S3C2410_LCDCON2_GET_VFPD(x) ( ((x) >> 6) & 0xFF) #define S3C2410_LCDCON2_GET_VSPW(x) ( ((x) >> 0) & 0x3F) -#define S3C2410_LCDCON3_HBPD(x) ((x) << 19) -#define S3C2410_LCDCON3_WDLY(x) ((x) << 19) +#define S3C2410_LCDCON3_HBPD(x) ((x) << 19) +#define S3C2410_LCDCON3_WDLY(x) ((x) << 19) #define S3C2410_LCDCON3_HOZVAL(x) ((x) << 8) -#define S3C2410_LCDCON3_HFPD(x) ((x) << 0) +#define S3C2410_LCDCON3_HFPD(x) ((x) << 0) #define S3C2410_LCDCON3_LINEBLANK(x)((x) << 0) #define S3C2410_LCDCON3_GET_HBPD(x) ( ((x) >> 19) & 0x7F) #define S3C2410_LCDCON3_GET_HFPD(x) ( ((x) >> 0) & 0xFF) -#define S3C2410_LCDCON4_MVAL(x) ((x) << 8) -#define S3C2410_LCDCON4_HSPW(x) ((x) << 0) -#define S3C2410_LCDCON4_WLH(x) ((x) << 0) +#define S3C2410_LCDCON4_MVAL(x) ((x) << 8) +#define S3C2410_LCDCON4_HSPW(x) ((x) << 0) +#define S3C2410_LCDCON4_WLH(x) ((x) << 0) #define S3C2410_LCDCON4_GET_HSPW(x) ( ((x) >> 0) & 0xFF) -#define S3C2410_LCDCON5_BPP24BL (1<<12) -#define S3C2410_LCDCON5_FRM565 (1<<11) -#define S3C2410_LCDCON5_INVVCLK (1<<10) +#define S3C2410_LCDCON5_BPP24BL (1<<12) +#define S3C2410_LCDCON5_FRM565 (1<<11) +#define S3C2410_LCDCON5_INVVCLK (1<<10) #define S3C2410_LCDCON5_INVVLINE (1<<9) #define S3C2410_LCDCON5_INVVFRAME (1<<8) -#define S3C2410_LCDCON5_INVVD (1<<7) -#define S3C2410_LCDCON5_INVVDEN (1<<6) +#define S3C2410_LCDCON5_INVVD (1<<7) +#define S3C2410_LCDCON5_INVVDEN (1<<6) #define S3C2410_LCDCON5_INVPWREN (1<<5) -#define S3C2410_LCDCON5_INVLEND (1<<4) -#define S3C2410_LCDCON5_PWREN (1<<3) -#define S3C2410_LCDCON5_ENLEND (1<<2) -#define S3C2410_LCDCON5_BSWP (1<<1) -#define S3C2410_LCDCON5_HWSWP (1<<0) +#define S3C2410_LCDCON5_INVLEND (1<<4) +#define S3C2410_LCDCON5_PWREN (1<<3) +#define S3C2410_LCDCON5_ENLEND (1<<2) +#define S3C2410_LCDCON5_BSWP (1<<1) +#define S3C2410_LCDCON5_HWSWP (1<<0) -#define S3C2410_LCDINT_FRSYNC (1<<1) +#define S3C2410_LCDINT_FRSYNC (1<<1) static volatile rt_uint16_t _rt_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH]; //static volatile rt_uint16_t _rt_hw_framebuffer[RT_HW_LCD_HEIGHT][RT_HW_LCD_WIDTH]; @@ -130,61 +130,61 @@ static void lcd_power_enable(int invpwren, int pwren) static void lcd_envid_on_off(int onoff) { - if(onoff==1) - /*ENVID=ON*/ - LCDCON1|=1; - else - /*ENVID Off*/ - LCDCON1 =LCDCON1 & 0x3fffe; + if(onoff==1) + /*ENVID=ON*/ + LCDCON1|=1; + else + /*ENVID Off*/ + LCDCON1 =LCDCON1 & 0x3fffe; } //********************** BOARD LCD backlight **************************** static void LcdBkLtSet(rt_uint32_t HiRatio) { -#define FREQ_PWM1 1000 - if(!HiRatio) - { - GPBCON = GPBCON & (~(3<<2)) | (1<<2) ; //GPB1Ϊoutput - GPBDAT &= ~(1<<1); - return; - } - GPBCON = GPBCON & (~(3<<2)) | (2<<2) ; +#define FREQ_PWM1 1000 + if(!HiRatio) + { + GPBCON = GPBCON & (~(3<<2)) | (1<<2) ; + GPBDAT &= ~(1<<1); + return; + } + GPBCON = GPBCON & (~(3<<2)) | (2<<2) ; - if( HiRatio > 100 ) HiRatio = 100 ; + if( HiRatio > 100 ) HiRatio = 100 ; - TCON = TCON & (~(0xf<<8)) ; // clear manual update bit, stop Timer1 + TCON = TCON & (~(0xf<<8)) ; // clear manual update bit, stop Timer1 - TCFG0 &= 0xffffff00; // set Timer 0&1 prescaler 0 - TCFG0 |= 15; //prescaler = 15+1 + TCFG0 &= 0xffffff00; // set Timer 0&1 prescaler 0 + TCFG0 |= 15; //prescaler = 15+1 - TCFG1 &= 0xffffff0f; // set Timer 1 MUX 1/16 - TCFG1 |= 0x00000030; // set Timer 1 MUX 1/16 + TCFG1 &= 0xffffff0f; // set Timer 1 MUX 1/16 + TCFG1 |= 0x00000030; // set Timer 1 MUX 1/16 - TCNTB1 = ( 100000000>>8 )/FREQ_PWM1; //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low - TCMPB1 = ( TCNTB1*(100-HiRatio))/100 ; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high + TCNTB1 = ( 100000000>>8 )/FREQ_PWM1; //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low + TCMPB1 = ( TCNTB1*(100-HiRatio))/100 ; //if set inverter on, when TCNT2<=TCMP2, TOUT is low, TCNT2>TCMP2, TOUT is high - TCON = TCON & (~(0xf<<8)) | (0x0e<<8) ; - TCON = TCON & (~(0xf<<8)) | (0x0d<<8) ; + TCON = TCON & (~(0xf<<8)) | (0x0e<<8) ; + TCON = TCON & (~(0xf<<8)) | (0x0d<<8) ; } /* RT-Thread Device Interface */ static rt_err_t rt_lcd_init (rt_device_t dev) -{ - GPB1_TO_OUT(); - GPB1_TO_1(); +{ + GPB1_TO_OUT(); + GPB1_TO_1(); - GPCUP = 0x00000000; - GPCCON = 0xaaaa02a9; + GPCUP = 0x00000000; + GPCCON = 0xaaaa02a9; - GPDUP = 0x00000000; - GPDCON = 0xaaaaaaaa; + GPDUP = 0x00000000; + GPDCON = 0xaaaaaaaa; -#define M5D(n) ((n)&0x1fffff) +#define M5D(n) ((n)&0x1fffff) #define LCD_ADDR ((rt_uint32_t)_rt_framebuffer) - LCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1); - LCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0); - LCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH - 1) << 8) | (LCD_LEFT_MARGIN << 0); - LCDCON4 = (13 << 8) | (LCD_HSYNC_LEN << 0); + LCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1); + LCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0); + LCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH - 1) << 8) | (LCD_LEFT_MARGIN << 0); + LCDCON4 = (13 << 8) | (LCD_HSYNC_LEN << 0); #define LCD_CON5 (S3C2410_LCDCON5_FRM565 | S3C2410_LCDCON5_INVVDEN | S3C2410_LCDCON5_INVVFRAME | \ S3C2410_LCDCON5_INVVLINE | S3C2410_LCDCON5_INVVCLK | S3C2410_LCDCON5_PWREN| S3C2410_LCDCON5_HWSWP) @@ -198,59 +198,59 @@ S3C2410_LCDCON5_INVVLINE | S3C2410_LCDCON5_INVVCLK | S3C2410_LCDCON5_PWREN| S3C2 LCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1); LCDSADDR3 = LCD_WIDTH; - LCDINTMSK |= (3); - LPCSEL &= (~7) ; - TPAL=0; + LCDINTMSK |= (3); + LPCSEL &= (~7) ; + TPAL=0; - LcdBkLtSet(70) ; - lcd_power_enable(0, 1); - lcd_envid_on_off(1); + LcdBkLtSet(70) ; + lcd_power_enable(0, 1); + lcd_envid_on_off(1); - return RT_EOK; + return RT_EOK; } static rt_err_t rt_lcd_control (rt_device_t dev, int cmd, void *args) { - switch (cmd) - { - case RTGRAPHIC_CTRL_RECT_UPDATE: - break; - case RTGRAPHIC_CTRL_POWERON: - break; - case RTGRAPHIC_CTRL_POWEROFF: - break; - case RTGRAPHIC_CTRL_GET_INFO: - rt_memcpy(args, &_lcd_info, sizeof(_lcd_info)); - break; - case RTGRAPHIC_CTRL_SET_MODE: - break; - } + switch (cmd) + { + case RTGRAPHIC_CTRL_RECT_UPDATE: + break; + case RTGRAPHIC_CTRL_POWERON: + break; + case RTGRAPHIC_CTRL_POWEROFF: + break; + case RTGRAPHIC_CTRL_GET_INFO: + rt_memcpy(args, &_lcd_info, sizeof(_lcd_info)); + break; + case RTGRAPHIC_CTRL_SET_MODE: + break; + } - return RT_EOK; + return RT_EOK; } int rt_hw_lcd_init(void) { - rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); - if (lcd == RT_NULL) + rt_device_t lcd = rt_malloc(sizeof(struct rt_device)); + if (lcd == RT_NULL) return -RT_ERROR; /* no memory yet */ - _lcd_info.bits_per_pixel = 16; - _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; - _lcd_info.framebuffer = (void*)_rt_framebuffer; - _lcd_info.width = LCD_WIDTH; - _lcd_info.height = LCD_HEIGHT; + _lcd_info.bits_per_pixel = 16; + _lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P; + _lcd_info.framebuffer = (void*)_rt_framebuffer; + _lcd_info.width = LCD_WIDTH; + _lcd_info.height = LCD_HEIGHT; - /* init device structure */ - lcd->type = RT_Device_Class_Unknown; - lcd->init = rt_lcd_init; - lcd->open = RT_NULL; - lcd->close = RT_NULL; - lcd->control = rt_lcd_control; - lcd->user_data = (void*)&_lcd_info; - - /* register lcd device to RT-Thread */ - rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); + /* init device structure */ + lcd->type = RT_Device_Class_Unknown; + lcd->init = rt_lcd_init; + lcd->open = RT_NULL; + lcd->close = RT_NULL; + lcd->control = rt_lcd_control; + lcd->user_data = (void*)&_lcd_info; + + /* register lcd device to RT-Thread */ + rt_device_register(lcd, "lcd", RT_DEVICE_FLAG_RDWR); } INIT_BOARD_EXPORT(rt_hw_lcd_init); diff --git a/bsp/mini2440/drivers/s3cmci.c b/bsp/mini2440/drivers/s3cmci.c index 2333c74495..b5b6f58414 100644 --- a/bsp/mini2440/drivers/s3cmci.c +++ b/bsp/mini2440/drivers/s3cmci.c @@ -1,17 +1,12 @@ /* - * File : s3cmci.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2010, RT-Thread Develop Team + * Copyright (c) 2006-2018, RT-Thread Development Team * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE + * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2020-04-15 Jonne first version for s3c2440 mmc controller */ - #include #include #include diff --git a/bsp/mini2440/drivers/touch.c b/bsp/mini2440/drivers/touch.c index b2d09ff7a5..404169a43f 100644 --- a/bsp/mini2440/drivers/touch.c +++ b/bsp/mini2440/drivers/touch.c @@ -27,485 +27,485 @@ #include "touch.h" /* ADCCON Register Bits */ -#define S3C2410_ADCCON_ECFLG (1<<15) -#define S3C2410_ADCCON_PRSCEN (1<<14) -#define S3C2410_ADCCON_PRSCVL(x) (((x)&0xFF)<<6) -#define S3C2410_ADCCON_PRSCVLMASK (0xFF<<6) -#define S3C2410_ADCCON_SELMUX(x) (((x)&0x7)<<3) -#define S3C2410_ADCCON_MUXMASK (0x7<<3) -#define S3C2410_ADCCON_STDBM (1<<2) -#define S3C2410_ADCCON_READ_START (1<<1) -#define S3C2410_ADCCON_ENABLE_START (1<<0) -#define S3C2410_ADCCON_STARTMASK (0x3<<0) +#define S3C2410_ADCCON_ECFLG (1<<15) +#define S3C2410_ADCCON_PRSCEN (1<<14) +#define S3C2410_ADCCON_PRSCVL(x) (((x)&0xFF)<<6) +#define S3C2410_ADCCON_PRSCVLMASK (0xFF<<6) +#define S3C2410_ADCCON_SELMUX(x) (((x)&0x7)<<3) +#define S3C2410_ADCCON_MUXMASK (0x7<<3) +#define S3C2410_ADCCON_STDBM (1<<2) +#define S3C2410_ADCCON_READ_START (1<<1) +#define S3C2410_ADCCON_ENABLE_START (1<<0) +#define S3C2410_ADCCON_STARTMASK (0x3<<0) /* ADCTSC Register Bits */ -#define S3C2410_ADCTSC_UD_SEN (1<<8) /* ghcstop add for s3c2440a */ -#define S3C2410_ADCTSC_YM_SEN (1<<7) -#define S3C2410_ADCTSC_YP_SEN (1<<6) -#define S3C2410_ADCTSC_XM_SEN (1<<5) -#define S3C2410_ADCTSC_XP_SEN (1<<4) -#define S3C2410_ADCTSC_PULL_UP_DISABLE (1<<3) -#define S3C2410_ADCTSC_AUTO_PST (1<<2) -#define S3C2410_ADCTSC_XY_PST(x) (((x)&0x3)<<0) +#define S3C2410_ADCTSC_UD_SEN (1<<8) /* ghcstop add for s3c2440a */ +#define S3C2410_ADCTSC_YM_SEN (1<<7) +#define S3C2410_ADCTSC_YP_SEN (1<<6) +#define S3C2410_ADCTSC_XM_SEN (1<<5) +#define S3C2410_ADCTSC_XP_SEN (1<<4) +#define S3C2410_ADCTSC_PULL_UP_DISABLE (1<<3) +#define S3C2410_ADCTSC_AUTO_PST (1<<2) +#define S3C2410_ADCTSC_XY_PST(x) (((x)&0x3)<<0) /* ADCDAT0 Bits */ -#define S3C2410_ADCDAT0_UPDOWN (1<<15) -#define S3C2410_ADCDAT0_AUTO_PST (1<<14) -#define S3C2410_ADCDAT0_XY_PST (0x3<<12) -#define S3C2410_ADCDAT0_XPDATA_MASK (0x03FF) +#define S3C2410_ADCDAT0_UPDOWN (1<<15) +#define S3C2410_ADCDAT0_AUTO_PST (1<<14) +#define S3C2410_ADCDAT0_XY_PST (0x3<<12) +#define S3C2410_ADCDAT0_XPDATA_MASK (0x03FF) /* ADCDAT1 Bits */ -#define S3C2410_ADCDAT1_UPDOWN (1<<15) -#define S3C2410_ADCDAT1_AUTO_PST (1<<14) -#define S3C2410_ADCDAT1_XY_PST (0x3<<12) -#define S3C2410_ADCDAT1_YPDATA_MASK (0x03FF) +#define S3C2410_ADCDAT1_UPDOWN (1<<15) +#define S3C2410_ADCDAT1_AUTO_PST (1<<14) +#define S3C2410_ADCDAT1_XY_PST (0x3<<12) +#define S3C2410_ADCDAT1_YPDATA_MASK (0x03FF) #define WAIT4INT(x) (((x)<<8) | \ - S3C2410_ADCTSC_YM_SEN | S3C2410_ADCTSC_YP_SEN | S3C2410_ADCTSC_XP_SEN | \ - S3C2410_ADCTSC_XY_PST(3)) + S3C2410_ADCTSC_YM_SEN | S3C2410_ADCTSC_YP_SEN | S3C2410_ADCTSC_XP_SEN | \ + S3C2410_ADCTSC_XY_PST(3)) -#define AUTOPST (S3C2410_ADCTSC_YM_SEN | S3C2410_ADCTSC_YP_SEN | S3C2410_ADCTSC_XP_SEN | \ - S3C2410_ADCTSC_AUTO_PST | S3C2410_ADCTSC_XY_PST(0)) +#define AUTOPST (S3C2410_ADCTSC_YM_SEN | S3C2410_ADCTSC_YP_SEN | S3C2410_ADCTSC_XP_SEN | \ + S3C2410_ADCTSC_AUTO_PST | S3C2410_ADCTSC_XY_PST(0)) -#define X_MIN 74 -#define X_MAX 934 -#define Y_MIN 920 -#define Y_MAX 89 +#define X_MIN 74 +#define X_MAX 934 +#define Y_MIN 920 +#define Y_MAX 89 struct s3c2410ts { - long xp; - long yp; - int count; - int shift; + long xp; + long yp; + int count; + int shift; - int delay; - int presc; + int delay; + int presc; - char phys[32]; + char phys[32]; }; static struct s3c2410ts ts; struct rtgui_touch_device { - struct rt_device parent; + struct rt_device parent; - rt_timer_t poll_timer; - rt_uint16_t x, y; + rt_timer_t poll_timer; + rt_uint16_t x, y; - rt_bool_t calibrating; - rt_touch_calibration_func_t calibration_func; + rt_bool_t calibrating; + rt_touch_calibration_func_t calibration_func; - rt_touch_eventpost_func_t eventpost_func; - void *eventpost_param; + rt_touch_eventpost_func_t eventpost_func; + void *eventpost_param; - rt_uint16_t min_x, max_x; - rt_uint16_t min_y, max_y; + rt_uint16_t min_x, max_x; + rt_uint16_t min_y, max_y; - rt_uint16_t width; - rt_uint16_t height; - - rt_bool_t first_down_report; + rt_uint16_t width; + rt_uint16_t height; + + rt_bool_t first_down_report; }; static struct rtgui_touch_device *touch = RT_NULL; #ifdef PKG_USING_GUIENGINE static void report_touch_input(int updown) { - struct rtgui_event_mouse emouse; + struct rtgui_event_mouse emouse; - RTGUI_EVENT_MOUSE_BUTTON_INIT(&emouse); - emouse.wid = RT_NULL; + RTGUI_EVENT_MOUSE_BUTTON_INIT(&emouse); + emouse.wid = RT_NULL; - /* set emouse button */ - emouse.button = RTGUI_MOUSE_BUTTON_LEFT; - emouse.parent.sender = RT_NULL; - - if (updown) - { - ts.xp = ts.xp / ts.count; - ts.yp = ts.yp / ts.count;; + /* set emouse button */ + emouse.button = RTGUI_MOUSE_BUTTON_LEFT; + emouse.parent.sender = RT_NULL; + + if (updown) + { + ts.xp = ts.xp / ts.count; + ts.yp = ts.yp / ts.count;; - #ifdef TOUCH_SWAP_XY - ts.xp = ts.xp + ts.yp; - ts.yp = ts.xp - ts.yp; - ts.xp = ts.xp - ts.yp; - #endif + #ifdef TOUCH_SWAP_XY + ts.xp = ts.xp + ts.yp; + ts.yp = ts.xp - ts.yp; + ts.xp = ts.xp - ts.yp; + #endif - if ((touch->calibrating == RT_TRUE) && (touch->calibration_func != RT_NULL)) - { - touch->x = ts.xp; - touch->y = ts.yp; - } - else - { - if (touch->max_x > touch->min_x) - { - touch->x = touch->width * (ts.xp-touch->min_x)/(touch->max_x-touch->min_x); - } - else - { - touch->x = touch->width * ( touch->min_x - ts.xp ) / (touch->min_x-touch->max_x); - } + if ((touch->calibrating == RT_TRUE) && (touch->calibration_func != RT_NULL)) + { + touch->x = ts.xp; + touch->y = ts.yp; + } + else + { + if (touch->max_x > touch->min_x) + { + touch->x = touch->width * (ts.xp-touch->min_x)/(touch->max_x-touch->min_x); + } + else + { + touch->x = touch->width * ( touch->min_x - ts.xp ) / (touch->min_x-touch->max_x); + } - if (touch->max_y > touch->min_y) - { - touch->y = touch->height * ( ts.yp - touch->min_y ) / (touch->max_y-touch->min_y); - } - else - { - touch->y = touch->height * ( touch->min_y - ts.yp ) / (touch->min_y-touch->max_y); - } - } + if (touch->max_y > touch->min_y) + { + touch->y = touch->height * ( ts.yp - touch->min_y ) / (touch->max_y-touch->min_y); + } + else + { + touch->y = touch->height * ( touch->min_y - ts.yp ) / (touch->min_y-touch->max_y); + } + } - emouse.x = touch->x; - emouse.y = touch->y; - if (touch->first_down_report == RT_TRUE) - { - emouse.parent.type = RTGUI_EVENT_MOUSE_BUTTON; - emouse.button |= RTGUI_MOUSE_BUTTON_DOWN; - } - else - { - emouse.parent.type = RTGUI_EVENT_MOUSE_MOTION; - emouse.button = 0; - } - } - else - { - emouse.x = touch->x; - emouse.y = touch->y; - emouse.parent.type = RTGUI_EVENT_MOUSE_BUTTON; - emouse.button |= RTGUI_MOUSE_BUTTON_UP; - if ((touch->calibrating == RT_TRUE) && (touch->calibration_func != RT_NULL)) - { - /* callback function */ - touch->calibration_func(emouse.x, emouse.y); - } - } + emouse.x = touch->x; + emouse.y = touch->y; + if (touch->first_down_report == RT_TRUE) + { + emouse.parent.type = RTGUI_EVENT_MOUSE_BUTTON; + emouse.button |= RTGUI_MOUSE_BUTTON_DOWN; + } + else + { + emouse.parent.type = RTGUI_EVENT_MOUSE_MOTION; + emouse.button = 0; + } + } + else + { + emouse.x = touch->x; + emouse.y = touch->y; + emouse.parent.type = RTGUI_EVENT_MOUSE_BUTTON; + emouse.button |= RTGUI_MOUSE_BUTTON_UP; + if ((touch->calibrating == RT_TRUE) && (touch->calibration_func != RT_NULL)) + { + /* callback function */ + touch->calibration_func(emouse.x, emouse.y); + } + } - /* rt_kprintf("touch %s: ts.x: %d, ts.y: %d\n", updown? "down" : "up", - touch->x, touch->y); */ - - /* send event to server */ - if (touch->calibrating != RT_TRUE) - { - rtgui_server_post_event((&emouse.parent), sizeof(emouse)); - } + /* rt_kprintf("touch %s: ts.x: %d, ts.y: %d\n", updown? "down" : "up", + touch->x, touch->y); */ + + /* send event to server */ + if (touch->calibrating != RT_TRUE) + { + rtgui_server_post_event((&emouse.parent), sizeof(emouse)); + } } #else static void report_touch_input(int updown) { - struct rt_touch_event touch_event; + struct rt_touch_event touch_event; - if (updown) - { - ts.xp = ts.xp / ts.count; - ts.yp = ts.yp / ts.count; + if (updown) + { + ts.xp = ts.xp / ts.count; + ts.yp = ts.yp / ts.count; - if ((touch->calibrating == RT_TRUE) && (touch->calibration_func != RT_NULL)) - { - touch->x = ts.xp; - touch->y = ts.yp; - } - else - { - if (touch->max_x > touch->min_x) - { - touch->x = touch->width * ( ts.xp - touch->min_x ) / (touch->max_x-touch->min_x); - } - else - { - touch->x = touch->width * ( touch->min_x - ts.xp ) / (touch->min_x-touch->max_x); - } + if ((touch->calibrating == RT_TRUE) && (touch->calibration_func != RT_NULL)) + { + touch->x = ts.xp; + touch->y = ts.yp; + } + else + { + if (touch->max_x > touch->min_x) + { + touch->x = touch->width * ( ts.xp - touch->min_x ) / (touch->max_x-touch->min_x); + } + else + { + touch->x = touch->width * ( touch->min_x - ts.xp ) / (touch->min_x-touch->max_x); + } - if (touch->max_y > touch->min_y) - { - touch->y = touch->height * ( ts.yp - touch->min_y ) / (touch->max_y-touch->min_y); - } - else - { - touch->y = touch->height * ( touch->min_y - ts.yp ) / (touch->min_y-touch->max_y); - } - } + if (touch->max_y > touch->min_y) + { + touch->y = touch->height * ( ts.yp - touch->min_y ) / (touch->max_y-touch->min_y); + } + else + { + touch->y = touch->height * ( touch->min_y - ts.yp ) / (touch->min_y-touch->max_y); + } + } - touch_event.x = touch->x; - touch_event.y = touch->y; - touch_event.pressed = 1; + touch_event.x = touch->x; + touch_event.y = touch->y; + touch_event.pressed = 1; - if (touch->first_down_report == RT_TRUE) - { - if (touch->calibrating != RT_TRUE && touch->eventpost_func) - { - touch->eventpost_func(touch->eventpost_param, &touch_event); - } - } - } - else - { - touch_event.x = touch->x; - touch_event.y = touch->y; - touch_event.pressed = 0; - - if ((touch->calibrating == RT_TRUE) && (touch->calibration_func != RT_NULL)) - { - /* callback function */ - touch->calibration_func(touch_event.x, touch_event.y); - } + if (touch->first_down_report == RT_TRUE) + { + if (touch->calibrating != RT_TRUE && touch->eventpost_func) + { + touch->eventpost_func(touch->eventpost_param, &touch_event); + } + } + } + else + { + touch_event.x = touch->x; + touch_event.y = touch->y; + touch_event.pressed = 0; + + if ((touch->calibrating == RT_TRUE) && (touch->calibration_func != RT_NULL)) + { + /* callback function */ + touch->calibration_func(touch_event.x, touch_event.y); + } - if (touch->calibrating != RT_TRUE && touch->eventpost_func) - { - touch->eventpost_func(touch->eventpost_param, &touch_event); - } - } + if (touch->calibrating != RT_TRUE && touch->eventpost_func) + { + touch->eventpost_func(touch->eventpost_param, &touch_event); + } + } } #endif static void touch_timer_fire(void *parameter) { - rt_uint32_t data0; - rt_uint32_t data1; - int updown; + rt_uint32_t data0; + rt_uint32_t data1; + int updown; - data0 = ADCDAT0; - data1 = ADCDAT1; + data0 = ADCDAT0; + data1 = ADCDAT1; - updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN)); + updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN)); - if (updown) - { - if (ts.count != 0) - { - report_touch_input(updown); - } + if (updown) + { + if (ts.count != 0) + { + report_touch_input(updown); + } - ts.xp = 0; - ts.yp = 0; - ts.count = 0; + ts.xp = 0; + ts.yp = 0; + ts.count = 0; - ADCTSC = S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST; - ADCCON |= S3C2410_ADCCON_ENABLE_START; - } + ADCTSC = S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST; + ADCCON |= S3C2410_ADCCON_ENABLE_START; + } } static void s3c2410_adc_stylus_action(void) { - rt_uint32_t data0; - rt_uint32_t data1; + rt_uint32_t data0; + rt_uint32_t data1; - data0 = ADCDAT0; - data1 = ADCDAT1; - - ts.xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK; - ts.yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK; - ts.count ++; + data0 = ADCDAT0; + data1 = ADCDAT1; + + ts.xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK; + ts.yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK; + ts.count ++; - if (ts.count < (1<first_down_report) - { - report_touch_input(1); - ts.xp = 0; - ts.yp = 0; - ts.count = 0; - touch->first_down_report = 0; - } - /* start timer */ - rt_timer_start(touch->poll_timer); - ADCTSC = WAIT4INT(1); - } + if (ts.count < (1<first_down_report) + { + report_touch_input(1); + ts.xp = 0; + ts.yp = 0; + ts.count = 0; + touch->first_down_report = 0; + } + /* start timer */ + rt_timer_start(touch->poll_timer); + ADCTSC = WAIT4INT(1); + } - SUBSRCPND |= BIT_SUB_ADC; + SUBSRCPND |= BIT_SUB_ADC; } static void s3c2410_intc_stylus_updown(void) { - rt_uint32_t data0; - rt_uint32_t data1; - int updown; + rt_uint32_t data0; + rt_uint32_t data1; + int updown; - data0 = ADCDAT0; - data1 = ADCDAT1; + data0 = ADCDAT0; + data1 = ADCDAT1; - updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN)); + updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN)); - /* rt_kprintf("stylus: %s\n", updown? "down" : "up"); */ + /* rt_kprintf("stylus: %s\n", updown? "down" : "up"); */ - if (updown) - { - touch_timer_fire(0); - } - else - { - /* stop timer */ - rt_timer_stop(touch->poll_timer); - touch->first_down_report = RT_TRUE; - if (ts.xp >= 0 && ts.yp >= 0) - { - report_touch_input(updown); - } - ts.count = 0; - ADCTSC = WAIT4INT(0); - } + if (updown) + { + touch_timer_fire(0); + } + else + { + /* stop timer */ + rt_timer_stop(touch->poll_timer); + touch->first_down_report = RT_TRUE; + if (ts.xp >= 0 && ts.yp >= 0) + { + report_touch_input(updown); + } + ts.count = 0; + ADCTSC = WAIT4INT(0); + } - SUBSRCPND |= BIT_SUB_TC; + SUBSRCPND |= BIT_SUB_TC; } static void rt_touch_handler(int irqno, void *param) { - if (SUBSRCPND & BIT_SUB_ADC) - { - /* INT_SUB_ADC */ - s3c2410_adc_stylus_action(); - } + if (SUBSRCPND & BIT_SUB_ADC) + { + /* INT_SUB_ADC */ + s3c2410_adc_stylus_action(); + } - if (SUBSRCPND & BIT_SUB_TC) - { - /* INT_SUB_TC */ - s3c2410_intc_stylus_updown(); - } + if (SUBSRCPND & BIT_SUB_TC) + { + /* INT_SUB_TC */ + s3c2410_intc_stylus_updown(); + } - /* clear interrupt */ - INTPND |= (1ul << INTADC); + /* clear interrupt */ + INTPND |= (1ul << INTADC); } /* RT-Thread Device Interface */ static rt_err_t rtgui_touch_init(rt_device_t dev) { - /* init touch screen structure */ - rt_memset(&ts, 0, sizeof(struct s3c2410ts)); + /* init touch screen structure */ + rt_memset(&ts, 0, sizeof(struct s3c2410ts)); - ts.delay = 50000; - ts.presc = 9; - ts.shift = 2; - ts.count = 0; - ts.xp = ts.yp = 0; + ts.delay = 50000; + ts.presc = 9; + ts.shift = 2; + ts.count = 0; + ts.xp = ts.yp = 0; - ADCCON = S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(ts.presc); - ADCDLY = ts.delay; + ADCCON = S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(ts.presc); + ADCDLY = ts.delay; - ADCTSC = WAIT4INT(0); + ADCTSC = WAIT4INT(0); - rt_hw_interrupt_install(INTADC, rt_touch_handler, RT_NULL , "INTADC"); - rt_hw_interrupt_umask(INTADC); + rt_hw_interrupt_install(INTADC, rt_touch_handler, RT_NULL , "INTADC"); + rt_hw_interrupt_umask(INTADC); - /* clear interrupt */ - INTPND |= (1ul << INTADC); + /* clear interrupt */ + INTPND |= (1ul << INTADC); - SUBSRCPND |= BIT_SUB_TC; - SUBSRCPND |= BIT_SUB_ADC; + SUBSRCPND |= BIT_SUB_TC; + SUBSRCPND |= BIT_SUB_ADC; - /* install interrupt handler */ - INTSUBMSK &= ~BIT_SUB_ADC; - INTSUBMSK &= ~BIT_SUB_TC; + /* install interrupt handler */ + INTSUBMSK &= ~BIT_SUB_ADC; + INTSUBMSK &= ~BIT_SUB_TC; - touch->first_down_report = RT_TRUE; + touch->first_down_report = RT_TRUE; - return RT_EOK; + return RT_EOK; } static rt_err_t rtgui_touch_control(rt_device_t dev, int cmd, void *args) { - switch (cmd) - { - case RT_TOUCH_CALIBRATION: - touch->calibrating = RT_TRUE; - touch->calibration_func = (rt_touch_calibration_func_t)args; - break; + switch (cmd) + { + case RT_TOUCH_CALIBRATION: + touch->calibrating = RT_TRUE; + touch->calibration_func = (rt_touch_calibration_func_t)args; + break; - case RT_TOUCH_NORMAL: - touch->calibrating = RT_FALSE; - break; + case RT_TOUCH_NORMAL: + touch->calibrating = RT_FALSE; + break; - case RT_TOUCH_CALIBRATION_DATA: - { - struct calibration_data *data; + case RT_TOUCH_CALIBRATION_DATA: + { + struct calibration_data *data; - data = (struct calibration_data *)args; + data = (struct calibration_data *)args; - /* update */ - touch->min_x = data->min_x; - touch->max_x = data->max_x; - touch->min_y = data->min_y; - touch->max_y = data->max_y; + /* update */ + touch->min_x = data->min_x; + touch->max_x = data->max_x; + touch->min_y = data->min_y; + touch->max_y = data->max_y; - /* - rt_kprintf("min_x = %d, max_x = %d, min_y = %d, max_y = %d\n", - touch->min_x, touch->max_x, touch->min_y, touch->max_y); - */ - } - break; + /* + rt_kprintf("min_x = %d, max_x = %d, min_y = %d, max_y = %d\n", + touch->min_x, touch->max_x, touch->min_y, touch->max_y); + */ + } + break; - case RT_TOUCH_EVENTPOST: - touch->eventpost_func = (rt_touch_eventpost_func_t)args; - break; + case RT_TOUCH_EVENTPOST: + touch->eventpost_func = (rt_touch_eventpost_func_t)args; + break; - case RT_TOUCH_EVENTPOST_PARAM: - touch->eventpost_param = args; - break; - } + case RT_TOUCH_EVENTPOST_PARAM: + touch->eventpost_param = args; + break; + } - return RT_EOK; + return RT_EOK; } int rtgui_touch_hw_init(void) { - rt_err_t result = RT_FALSE; - rt_device_t device = RT_NULL; - struct rt_device_graphic_info info; + rt_err_t result = RT_FALSE; + rt_device_t device = RT_NULL; + struct rt_device_graphic_info info; - touch = (struct rtgui_touch_device *)rt_malloc(sizeof(struct rtgui_touch_device)); - if (touch == RT_NULL) - return -RT_ERROR; /* no memory yet */ + touch = (struct rtgui_touch_device *)rt_malloc(sizeof(struct rtgui_touch_device)); + if (touch == RT_NULL) + return -RT_ERROR; /* no memory yet */ - /* clear device structure */ - rt_memset(&(touch->parent), 0, sizeof(struct rt_device)); - touch->calibrating = RT_FALSE; - touch->min_x = X_MIN; - touch->max_x = X_MAX; - touch->min_y = Y_MIN; - touch->max_y = Y_MAX; - touch->eventpost_func = RT_NULL; - touch->eventpost_param = RT_NULL; + /* clear device structure */ + rt_memset(&(touch->parent), 0, sizeof(struct rt_device)); + touch->calibrating = RT_FALSE; + touch->min_x = X_MIN; + touch->max_x = X_MAX; + touch->min_y = Y_MIN; + touch->max_y = Y_MAX; + touch->eventpost_func = RT_NULL; + touch->eventpost_param = RT_NULL; - /* init device structure */ - touch->parent.type = RT_Device_Class_Unknown; - touch->parent.init = rtgui_touch_init; - touch->parent.control = rtgui_touch_control; - touch->parent.user_data = RT_NULL; + /* init device structure */ + touch->parent.type = RT_Device_Class_Unknown; + touch->parent.init = rtgui_touch_init; + touch->parent.control = rtgui_touch_control; + touch->parent.user_data = RT_NULL; - device = rt_device_find("lcd"); - if (device == RT_NULL) - { - rt_kprintf("No lcd found\n"); - return -RT_ERROR; /* no this device */ - } + device = rt_device_find("lcd"); + if (device == RT_NULL) + { + rt_kprintf("No lcd found\n"); + return -RT_ERROR; /* no this device */ + } - /* get graphic device info */ - result = rt_device_control(device, RTGRAPHIC_CTRL_GET_INFO, &info); - if (result != RT_EOK) - { - /* get device information failed */ - rt_kprintf("Get graphic device info failed\n"); - return -RT_ERROR; - } + /* get graphic device info */ + result = rt_device_control(device, RTGRAPHIC_CTRL_GET_INFO, &info); + if (result != RT_EOK) + { + /* get device information failed */ + rt_kprintf("Get graphic device info failed\n"); + return -RT_ERROR; + } - touch->width = info.width; - touch->height = info.height; - - /* create 1/8 second timer */ - touch->poll_timer = rt_timer_create("touch", touch_timer_fire, RT_NULL, - RT_TICK_PER_SECOND/8, RT_TIMER_FLAG_PERIODIC); + touch->width = info.width; + touch->height = info.height; + + /* create 1/8 second timer */ + touch->poll_timer = rt_timer_create("touch", touch_timer_fire, RT_NULL, + RT_TICK_PER_SECOND/8, RT_TIMER_FLAG_PERIODIC); - /* register touch device to RT-Thread */ - rt_device_register(&(touch->parent), "touch", RT_DEVICE_FLAG_RDWR); + /* register touch device to RT-Thread */ + rt_device_register(&(touch->parent), "touch", RT_DEVICE_FLAG_RDWR); - return RT_EOK; + return RT_EOK; } INIT_PREV_EXPORT(rtgui_touch_hw_init); diff --git a/bsp/mini2440/drivers/touch.h b/bsp/mini2440/drivers/touch.h index c0e1238148..19d10bf36d 100644 --- a/bsp/mini2440/drivers/touch.h +++ b/bsp/mini2440/drivers/touch.h @@ -3,23 +3,23 @@ #include -#define RT_TOUCH_NORMAL 0 -#define RT_TOUCH_CALIBRATION_DATA 1 -#define RT_TOUCH_CALIBRATION 2 +#define RT_TOUCH_NORMAL 0 +#define RT_TOUCH_CALIBRATION_DATA 1 +#define RT_TOUCH_CALIBRATION 2 #define RT_TOUCH_EVENTPOST 3 #define RT_TOUCH_EVENTPOST_PARAM 4 struct calibration_data { - rt_uint16_t min_x, max_x; - rt_uint16_t min_y, max_y; + rt_uint16_t min_x, max_x; + rt_uint16_t min_y, max_y; }; struct rt_touch_event { - rt_uint16_t x; - rt_uint16_t y; - int pressed; + rt_uint16_t x; + rt_uint16_t y; + int pressed; }; typedef void (*rt_touch_calibration_func_t)(rt_uint16_t x, rt_uint16_t y); From fb8c7829a8a861f9837912ecf926899f48349967 Mon Sep 17 00:00:00 2001 From: bigmagic Date: Thu, 16 Apr 2020 16:10:57 +0800 Subject: [PATCH 04/27] add raspi4 bsp --- bsp/raspberry-pi/raspi4/.config | 455 ++++++++++++++++++ bsp/raspberry-pi/raspi4/Kconfig | 29 ++ bsp/raspberry-pi/raspi4/README.md | 100 ++++ bsp/raspberry-pi/raspi4/SConscript | 14 + bsp/raspberry-pi/raspi4/SConstruct | 30 ++ .../raspi4/applications/SConscript | 9 + bsp/raspberry-pi/raspi4/applications/main.c | 19 + bsp/raspberry-pi/raspi4/driver/Kconfig | 97 ++++ bsp/raspberry-pi/raspi4/driver/SConscript | 9 + bsp/raspberry-pi/raspi4/driver/board.c | 98 ++++ bsp/raspberry-pi/raspi4/driver/board.h | 25 + bsp/raspberry-pi/raspi4/driver/drv_gpio.c | 117 +++++ bsp/raspberry-pi/raspi4/driver/drv_gpio.h | 79 +++ bsp/raspberry-pi/raspi4/driver/drv_uart.c | 158 ++++++ bsp/raspberry-pi/raspi4/driver/drv_uart.h | 84 ++++ bsp/raspberry-pi/raspi4/driver/iomap.h | 13 + bsp/raspberry-pi/raspi4/link.lds | 153 ++++++ bsp/raspberry-pi/raspi4/rtconfig.h | 179 +++++++ bsp/raspberry-pi/raspi4/rtconfig.py | 51 ++ libcpu/aarch64/SConscript | 3 + libcpu/aarch64/common/SConscript | 24 + libcpu/aarch64/{cortex-a53 => common}/armv8.h | 0 libcpu/aarch64/{cortex-a53 => common}/cache.S | 0 .../{cortex-a53 => common}/context_gcc.S | 0 libcpu/aarch64/{cortex-a53 => common}/cp15.h | 0 libcpu/aarch64/{cortex-a53 => common}/cpu.c | 0 .../aarch64/{cortex-a53 => common}/cpu_gcc.S | 0 libcpu/aarch64/common/gic/SConscript | 24 + libcpu/aarch64/common/gic/gic_pl400.c | 368 ++++++++++++++ libcpu/aarch64/common/gic/gic_pl400.h | 35 ++ libcpu/aarch64/{cortex-a53 => common}/mmu.c | 0 libcpu/aarch64/{cortex-a53 => common}/mmu.h | 0 .../{cortex-a53 => common}/startup_gcc.S | 0 .../{cortex-a53 => common}/vector_gcc.S | 0 libcpu/aarch64/cortex-a53/SConscript | 15 +- libcpu/aarch64/cortex-a53/interrupt.h | 6 +- libcpu/aarch64/cortex-a57/SConscript | 13 + libcpu/aarch64/cortex-a57/entry_point.S | 111 +++++ libcpu/aarch64/cortex-a57/interrupt.c | 73 +++ libcpu/aarch64/cortex-a57/interrupt.h | 27 ++ libcpu/aarch64/cortex-a57/stack.c | 90 ++++ libcpu/aarch64/cortex-a57/trap.c | 98 ++++ 42 files changed, 2593 insertions(+), 13 deletions(-) create mode 100644 bsp/raspberry-pi/raspi4/.config create mode 100644 bsp/raspberry-pi/raspi4/Kconfig create mode 100644 bsp/raspberry-pi/raspi4/README.md create mode 100644 bsp/raspberry-pi/raspi4/SConscript create mode 100644 bsp/raspberry-pi/raspi4/SConstruct create mode 100644 bsp/raspberry-pi/raspi4/applications/SConscript create mode 100644 bsp/raspberry-pi/raspi4/applications/main.c create mode 100644 bsp/raspberry-pi/raspi4/driver/Kconfig create mode 100644 bsp/raspberry-pi/raspi4/driver/SConscript create mode 100644 bsp/raspberry-pi/raspi4/driver/board.c create mode 100644 bsp/raspberry-pi/raspi4/driver/board.h create mode 100644 bsp/raspberry-pi/raspi4/driver/drv_gpio.c create mode 100644 bsp/raspberry-pi/raspi4/driver/drv_gpio.h create mode 100644 bsp/raspberry-pi/raspi4/driver/drv_uart.c create mode 100644 bsp/raspberry-pi/raspi4/driver/drv_uart.h create mode 100644 bsp/raspberry-pi/raspi4/driver/iomap.h create mode 100644 bsp/raspberry-pi/raspi4/link.lds create mode 100644 bsp/raspberry-pi/raspi4/rtconfig.h create mode 100644 bsp/raspberry-pi/raspi4/rtconfig.py create mode 100644 libcpu/aarch64/common/SConscript rename libcpu/aarch64/{cortex-a53 => common}/armv8.h (100%) rename libcpu/aarch64/{cortex-a53 => common}/cache.S (100%) rename libcpu/aarch64/{cortex-a53 => common}/context_gcc.S (100%) rename libcpu/aarch64/{cortex-a53 => common}/cp15.h (100%) rename libcpu/aarch64/{cortex-a53 => common}/cpu.c (100%) rename libcpu/aarch64/{cortex-a53 => common}/cpu_gcc.S (100%) create mode 100644 libcpu/aarch64/common/gic/SConscript create mode 100644 libcpu/aarch64/common/gic/gic_pl400.c create mode 100644 libcpu/aarch64/common/gic/gic_pl400.h rename libcpu/aarch64/{cortex-a53 => common}/mmu.c (100%) rename libcpu/aarch64/{cortex-a53 => common}/mmu.h (100%) rename libcpu/aarch64/{cortex-a53 => common}/startup_gcc.S (100%) rename libcpu/aarch64/{cortex-a53 => common}/vector_gcc.S (100%) create mode 100644 libcpu/aarch64/cortex-a57/SConscript create mode 100644 libcpu/aarch64/cortex-a57/entry_point.S create mode 100644 libcpu/aarch64/cortex-a57/interrupt.c create mode 100644 libcpu/aarch64/cortex-a57/interrupt.h create mode 100644 libcpu/aarch64/cortex-a57/stack.c create mode 100644 libcpu/aarch64/cortex-a57/trap.c diff --git a/bsp/raspberry-pi/raspi4/.config b/bsp/raspberry-pi/raspi4/.config new file mode 100644 index 0000000000..e300d0217b --- /dev/null +++ b/bsp/raspberry-pi/raspi4/.config @@ -0,0 +1,455 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Project Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=100 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=2048 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=2048 +CONFIG_RT_DEBUG=y +# CONFIG_RT_DEBUG_COLOR is not set +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +# CONFIG_RT_USING_MEMHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMTRACE is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart" +CONFIG_RT_VER_NUM=0x40003 +CONFIG_ARCH_CPU_64BIT=y +# CONFIG_RT_USING_CPU_FFS is not set +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 + +# +# C++ features +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Command shell +# +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_CMD_SIZE=80 +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_USING_MSH_DEFAULT=y +# CONFIG_FINSH_USING_MSH_ONLY is not set +CONFIG_FINSH_ARG_MAX=10 + +# +# Device virtual file system +# +CONFIG_RT_USING_DFS=y +CONFIG_DFS_USING_WORKDIR=y +CONFIG_DFS_FILESYSTEMS_MAX=2 +CONFIG_DFS_FILESYSTEM_TYPES_MAX=2 +CONFIG_DFS_FD_MAX=16 +# CONFIG_RT_USING_DFS_MNTTABLE is not set +# CONFIG_RT_USING_DFS_ELMFAT is not set +CONFIG_RT_USING_DFS_DEVFS=y +# CONFIG_RT_USING_DFS_ROMFS is not set +# CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_UFFS is not set +# CONFIG_RT_USING_DFS_JFFS2 is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_PIPE_BUFSZ=512 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +CONFIG_RT_USING_LIBC=y +# CONFIG_RT_USING_PTHREADS is not set +CONFIG_RT_USING_POSIX=y +# CONFIG_RT_USING_POSIX_MMAP is not set +# CONFIG_RT_USING_POSIX_TERMIOS is not set +# CONFIG_RT_USING_POSIX_AIO is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LIBMODBUS is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOTHUB is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_libsodium is not set +# CONFIG_PKG_USING_TINYCRYPT is not set + +# +# language packages +# +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set + +# +# multimedia packages +# +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set + +# +# system packages +# +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_CMSIS is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set + +# +# peripheral libraries and drivers +# +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_TOUCH_DRIVERS is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set + +# +# miscellaneous packages +# +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_UKAL is not set + +# +# Privated Packages of RealThread +# +# CONFIG_PKG_USING_CODEC is not set +# CONFIG_PKG_USING_PLAYER is not set +# CONFIG_PKG_USING_MPLAYER is not set +# CONFIG_PKG_USING_PERSIMMON_SRC is not set +# CONFIG_PKG_USING_JS_PERSIMMON is not set +# CONFIG_PKG_USING_JERRYSCRIPT_WIN32 is not set + +# +# Network Utilities +# +# CONFIG_PKG_USING_WICED is not set +# CONFIG_PKG_USING_CLOUDSDK is not set +# CONFIG_PKG_USING_POWER_MANAGER is not set +# CONFIG_PKG_USING_RT_OTA is not set +# CONFIG_PKG_USING_RDBD_SRC is not set +# CONFIG_PKG_USING_RTINSIGHT is not set +# CONFIG_PKG_USING_SMARTCONFIG is not set +# CONFIG_PKG_USING_RTX is not set +# CONFIG_RT_USING_TESTCASE is not set +# CONFIG_PKG_USING_NGHTTP2 is not set +# CONFIG_PKG_USING_AVS is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_STS is not set +# CONFIG_PKG_USING_DLMS is not set +# CONFIG_PKG_USING_AUDIO_FRAMEWORK is not set +# CONFIG_PKG_USING_ZBAR is not set +CONFIG_BCM2711_SOC=y +# CONFIG_BSP_SUPPORT_FPU is not set + +# +# Hardware Drivers Config +# + +# +# BCM Peripheral Drivers +# +CONFIG_BSP_USING_UART=y +CONFIG_RT_USING_UART0=y +CONFIG_BSP_USING_GIC=y +CONFIG_BSP_USING_GIC400=y +# CONFIG_BSP_USING_GIC500 is not set +CONFIG_BSP_USING_PIN=y +CONFIG_BSP_USING_CORETIMER=y +# CONFIG_BSP_USING_SYSTIMER is not set +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_RTC is not set +# CONFIG_BSP_USING_SDIO is not set + +# +# Board Peripheral Drivers +# +# CONFIG_BSP_USING_HDMI is not set diff --git a/bsp/raspberry-pi/raspi4/Kconfig b/bsp/raspberry-pi/raspi4/Kconfig new file mode 100644 index 0000000000..e71ed3d54b --- /dev/null +++ b/bsp/raspberry-pi/raspi4/Kconfig @@ -0,0 +1,29 @@ +mainmenu "RT-Thread Project Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" + +config BCM2711_SOC + bool + select ARCH_ARM_CORTEX_A57 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + select ARCH_CPU_64BIT + default y + +source "driver/Kconfig" diff --git a/bsp/raspberry-pi/raspi4/README.md b/bsp/raspberry-pi/raspi4/README.md new file mode 100644 index 0000000000..28e00f96c0 --- /dev/null +++ b/bsp/raspberry-pi/raspi4/README.md @@ -0,0 +1,100 @@ +# Raspberry PI 3-64板级支持包说明 + +## 1. 简介 + +树莓派由注册于英国的慈善组织“Raspberry Pi 基金会”开发,莓派3有三个发行版本: + +* B : 4核 Broadcom BCM2837 (ARMv8-A) 1.2GHz,双核VideoCore IV GPU,1GB内存,100 Base-T Ethernet +* B+: 4核 Broadcom BCM2837B0 Cortex-A53 (ARMv8) 1.4GHz, 1GB LPDDR2 SDRAM, GigaE over USB 2.0 +* A+: 4核 Broadcom BCM2837B0 Cortex-A53 (ARMv8) 1.4GHz, 512MB LPDDR2 SDRAM + +这份RT-Thread BSP是针对 Raspberry Pi 3 64位模式的一份移植,树莓派价格便宜, 使用者甚众,是研究和运行RT-Thread的可选平台之一。 + + +## 2. 编译说明 + +### 2.1 Window上的环境搭建 + +Windows环境下推荐使用[env工具][1]进行编译。 + +首先下载Linux上的gcc工具,版本为gcc-arm-8.3选择aarch64-elf就可以。 + +将推荐将gcc解压到`\env\tools\gnu_gcc\arm_gcc`目录下。 + +接着修改`bsp\raspberry-pi\raspi3-64\rtconfig.py` + +修改路径: + +``` +EXEC_PATH = r'E:/env_released_1.1.2/env/tools/gnu_gcc/arm_gcc/gcc-arm-8.3-2019.03-i686-mingw32-aarch64-elf/bin' +``` + +然后在`bsp\raspberry-pi\raspi3-64\`下输入scons编译即可。 + +### 2.2 Linux上的环境搭建 + +Linux下推荐使用[gcc工具][2]。Linux版本下gcc版本可采用`gcc-arm-8.3-2019.03-x86_64-aarch64-elf`。 + +直接进入`bsp\raspberry-pi\raspi3-64`,输入scons编译即可。 + + +## 3. 执行 + +### 3.1 下载[raspbian镜像][3],生成可以运行的raspbian SD卡 + +Windows下,去[etcher.io][4]下载etcher,这是个可以烧写img的工具 + +解开下载的镜像文件, linux下使用如下的命令 + +``` +unzip 2018-06-27-raspbian-stretch-lite.zip +``` + +准备一张空SD卡,linux环境下,插入电脑并执行 + +``` +sudo dd if=2018-06-27-raspbian-stretch-lite.img of=/dev/xxx bs=32M conv=fsync +``` + +**注意: /dev/xxx 要换成真实环境中的SD卡所在设置,千万不要弄错。** + +Windows环境下,执行etcher选择解压后的2018-06-27-raspbian-stretch-lite.img文件和SD卡就可以开始烧写了。 + +最后把kernel8.img放入SD boot分区,删除其它 kernel*.img。 + +### 3.2 准备好串口线 + +目前版本是使用raspi3的 GPIO 14, GPIO 15来作路口输出,连线情况如下图所示(图片中的板子是pi2,GPIO引脚是一样的): + +![raspi2](figures/raspi_uart.png) + +串口参数: 115200 8N1 ,硬件和软件流控为关。 + +按上面的方法做好SD卡后,插入树莓派,通电可以在串口上看到如下所示的输出信息: + +```text + heap: 0x00020b20 - 0x00400000 + + \ | / +- RT - Thread Operating System + / | \ 3.1.0 build Aug 23 2019 + 2006 - 2019 Copyright by rt-thread team +Hello RT-Thread! +msh > +``` + +## 4. 支持情况 + +| 驱动 | 支持情况 | 备注 | +| ------ | ---- | :------: | +| UART | 支持 | UART0| + +## 5. 联系人信息 + +维护人:[bernard][5] + +[1]: https://www.rt-thread.org/page/download.html +[2]: https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads +[3]: https://downloads.raspberrypi.org/raspbian_lite_latest +[4]: https://etcher.io +[5]: https://github.com/BernardXiong diff --git a/bsp/raspberry-pi/raspi4/SConscript b/bsp/raspberry-pi/raspi4/SConscript new file mode 100644 index 0000000000..c7ef7659ec --- /dev/null +++ b/bsp/raspberry-pi/raspi4/SConscript @@ -0,0 +1,14 @@ +# for module compiling +import os +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/raspberry-pi/raspi4/SConstruct b/bsp/raspberry-pi/raspi4/SConstruct new file mode 100644 index 0000000000..93f349aab8 --- /dev/null +++ b/bsp/raspberry-pi/raspi4/SConstruct @@ -0,0 +1,30 @@ +import os +import sys +import rtconfig + +from rtconfig import RTT_ROOT + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +from building import * + +TARGET = 'rtthread.' + rtconfig.TARGET_EXT + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) +env['ASCOM'] = env['ASPPCOM'] + +Export('RTT_ROOT') +Export('rtconfig') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu = False) + +# make a building +DoBuilding(TARGET, objs) + diff --git a/bsp/raspberry-pi/raspi4/applications/SConscript b/bsp/raspberry-pi/raspi4/applications/SConscript new file mode 100644 index 0000000000..533df8ac31 --- /dev/null +++ b/bsp/raspberry-pi/raspi4/applications/SConscript @@ -0,0 +1,9 @@ +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') + Glob('*.cpp') +CPPPATH = [cwd, str(Dir('#'))] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/raspberry-pi/raspi4/applications/main.c b/bsp/raspberry-pi/raspi4/applications/main.c new file mode 100644 index 0000000000..9664e67d01 --- /dev/null +++ b/bsp/raspberry-pi/raspi4/applications/main.c @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-16 bigmagic first version + */ + +#include +#include +#include + +int main(int argc, char** argv) +{ + rt_kprintf("Hi, this is RT-Thread!!\n"); + return 0; +} diff --git a/bsp/raspberry-pi/raspi4/driver/Kconfig b/bsp/raspberry-pi/raspi4/driver/Kconfig new file mode 100644 index 0000000000..208b4b4300 --- /dev/null +++ b/bsp/raspberry-pi/raspi4/driver/Kconfig @@ -0,0 +1,97 @@ + +config BSP_SUPPORT_FPU + bool "Using Float" + default n + +menu "Hardware Drivers Config" + menu "BCM Peripheral Drivers" + menuconfig BSP_USING_UART + bool "Using UART" + select RT_USING_SERIAL + default y + + if BSP_USING_UART + config RT_USING_UART0 + bool "Enabel UART 0" + default y + endif + + menuconfig BSP_USING_GIC + bool "Enable GIC" + select RT_USING_GIC + default y + if BSP_USING_GIC + config BSP_USING_GIC400 + bool "Enable GIC400" + default y + config BSP_USING_GIC500 + bool "Enable GIC500" + default n + endif + + config BSP_USING_PIN + bool "Using PIN" + select RT_USING_PIN + default y + + config BSP_USING_CORETIMER + bool "Using core timer" + select RT_USING_CORETIMER + default y + + menuconfig BSP_USING_SYSTIMER + bool "Enable SYSTIMER" + select BSP_USING_SYSTIMER + default n + + if BSP_USING_SYSTIMER + config RT_USING_SYSTIMER1 + bool "Enable sys timer1" + default n + config RT_USING_SYSTIMER3 + bool "Enable sys timer3" + default n + endif + + config BSP_USING_WDT + bool "Enable WDT" + select RT_USING_WDT + default n + + menuconfig BSP_USING_RTC + bool "Enable RTC" + select RT_USING_RTC + default n + + if BSP_USING_RTC + config BSP_USING_ALARM + bool "Enable Alarm" + select RT_USING_ALARM + default n + endif + + menuconfig BSP_USING_SDIO + bool "Enable SDIO" + select RT_USING_SDIO + default n + + if BSP_USING_SDIO + config BSP_USING_SDIO0 + bool "Enable SDIO0" + select RT_USING_SDIO + default n + endif + endmenu + + menu "Board Peripheral Drivers" + menuconfig BSP_USING_HDMI + bool "Enable HDMI" + default n + + if BSP_USING_HDMI + config BSP_USING_HDMI_DISPLAY + bool "HDMI DISPLAY" + default n + endif + endmenu +endmenu diff --git a/bsp/raspberry-pi/raspi4/driver/SConscript b/bsp/raspberry-pi/raspi4/driver/SConscript new file mode 100644 index 0000000000..533df8ac31 --- /dev/null +++ b/bsp/raspberry-pi/raspi4/driver/SConscript @@ -0,0 +1,9 @@ +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') + Glob('*.cpp') +CPPPATH = [cwd, str(Dir('#'))] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/raspberry-pi/raspi4/driver/board.c b/bsp/raspberry-pi/raspi4/driver/board.c new file mode 100644 index 0000000000..9716755b72 --- /dev/null +++ b/bsp/raspberry-pi/raspi4/driver/board.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-16 bigmagic first version + */ + +#include +#include + +#include "board.h" +#include "drv_uart.h" + +#include "cp15.h" +#include "mmu.h" + +static rt_uint64_t timerStep; +// 0x40, 0x44, 0x48, 0x4c: Core 0~3 Timers interrupt control +#define CORE0_TIMER_IRQ_CTRL HWREG32(0xFF800040) +#define TIMER_IRQ 30 +#define NON_SECURE_TIMER_IRQ (1 << 1) + +int rt_hw_get_gtimer_frq(void); +void rt_hw_set_gtimer_val(rt_uint64_t value); +int rt_hw_get_gtimer_val(void); +int rt_hw_get_cntpct_val(void); +void rt_hw_gtimer_enable(void); + +void core0_timer_enable_interrupt_controller() +{ + CORE0_TIMER_IRQ_CTRL |= NON_SECURE_TIMER_IRQ; +} + +void rt_hw_timer_isr(int vector, void *parameter) +{ + rt_hw_set_gtimer_val(timerStep); + rt_tick_increase(); +} + +void rt_hw_timer_init(void) +{ + rt_hw_interrupt_install(TIMER_IRQ, rt_hw_timer_isr, RT_NULL, "tick"); + rt_hw_interrupt_umask(TIMER_IRQ); + __ISB(); + timerStep = rt_hw_get_gtimer_frq(); + __DSB(); + timerStep /= RT_TICK_PER_SECOND; + + rt_hw_gtimer_enable(); + rt_hw_set_gtimer_val(timerStep); + core0_timer_enable_interrupt_controller(); +} + +void idle_wfi(void) +{ + asm volatile ("wfi"); +} + +/** + * Initialize the Hardware related stuffs. Called from rtthread_startup() + * after interrupt disabled. + */ +void rt_hw_board_init(void) +{ + mmu_init(); + armv8_map(0, 0, 0x6400000, MEM_ATTR_MEMORY); + armv8_map(0xFE200000, 0xFE200000, 0x200000, MEM_ATTR_IO);//uart gpio + armv8_map(0xFF800000, 0xFF800000, 0x200000, MEM_ATTR_IO);//gic timer + mmu_enable(); + + /* initialize hardware interrupt */ + rt_hw_interrupt_init(); // in libcpu/interrupt.c. Set some data structures, no operation on device + rt_hw_vector_init(); // in libcpu/interrupt.c. == rt_cpu_vector_set_base((rt_ubase_t)&system_vectors); + + /* initialize timer for os tick */ + rt_hw_timer_init(); + rt_thread_idle_sethook(idle_wfi); + + /* initialize uart */ + rt_hw_uart_init(); // driver/drv_uart.c +#ifdef RT_USING_CONSOLE + /* set console device */ + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); +#endif /* RT_USING_CONSOLE */ + +#ifdef RT_USING_HEAP + /* initialize memory system */ + rt_kprintf("heap: 0x%08x - 0x%08x\n", RT_HW_HEAP_BEGIN, RT_HW_HEAP_END); + rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END); +#endif + +#ifdef RT_USING_COMPONENTS_INIT + rt_components_board_init(); +#endif +} \ No newline at end of file diff --git a/bsp/raspberry-pi/raspi4/driver/board.h b/bsp/raspberry-pi/raspi4/driver/board.h new file mode 100644 index 0000000000..66805464f2 --- /dev/null +++ b/bsp/raspberry-pi/raspi4/driver/board.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-16 bigmagic first version + */ + +#ifndef BOARD_H__ +#define BOARD_H__ + +#include + +extern unsigned char __bss_start; +extern unsigned char __bss_end; + +#define RT_HW_HEAP_BEGIN (void*)&__bss_end +#define RT_HW_HEAP_END (void*)(RT_HW_HEAP_BEGIN + 64 * 1024 * 1024) + +void rt_hw_board_init(void); + +#endif + diff --git a/bsp/raspberry-pi/raspi4/driver/drv_gpio.c b/bsp/raspberry-pi/raspi4/driver/drv_gpio.c new file mode 100644 index 0000000000..4317a358e0 --- /dev/null +++ b/bsp/raspberry-pi/raspi4/driver/drv_gpio.c @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-16 bigmagic first version + */ + +#include "drv_gpio.h" + +#ifdef BSP_USING_PIN + +static void raspi_pin_mode(struct rt_device *dev, rt_base_t pin, rt_base_t mode) +{ + uint32_t fselnum = pin / 10; + uint32_t fselrest = pin % 10; + + uint32_t gpfsel = 0; + gpfsel &= ~((uint32_t)(0x07 << (fselrest * 3))); + gpfsel |= (uint32_t)(mode << (fselrest * 3)); + + switch (fselnum) + { + case 0: + GPIO_REG_GPFSEL0(GPIO_BASE) = gpfsel; + break; + case 1: + GPIO_REG_GPFSEL1(GPIO_BASE) = gpfsel; + break; + case 2: + GPIO_REG_GPFSEL2(GPIO_BASE) = gpfsel; + break; + case 3: + GPIO_REG_GPFSEL3(GPIO_BASE) = gpfsel; + break; + case 4: + GPIO_REG_GPFSEL4(GPIO_BASE) = gpfsel; + break; + case 5: + GPIO_REG_GPFSEL5(GPIO_BASE) = gpfsel; + break; + default: + break; + } +} + +static void raspi_pin_write(struct rt_device *dev, rt_base_t pin, rt_base_t value) +{ + uint32_t num = pin / 32; + + if(num == 0) + { + if(value == 0) + { + GPIO_REG_GPSET0(GPIO_BASE) = 1 << (pin % 32); + } + else + { + GPIO_REG_GPCLR0(GPIO_BASE) = 1 << (pin % 32); + } + } + else + { + if(value == 0) + { + GPIO_REG_GPSET1(GPIO_BASE) = 1 << (pin % 32); + } + else + { + GPIO_REG_GPCLR1(GPIO_BASE) = 1 << (pin % 32); + } + + } +} + +static int raspi_pin_read(struct rt_device *device, rt_base_t pin) +{ + return 0; +} + +static rt_err_t raspi_pin_attach_irq(struct rt_device *device, rt_int32_t pin, rt_uint32_t mode, void (*hdr)(void *args), void *args) +{ + return RT_EOK; +} + +static rt_err_t raspi_pin_detach_irq(struct rt_device *device, rt_int32_t pin) +{ + return RT_EOK; +} + +rt_err_t raspi_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled) +{ + return RT_EOK; +} + +static const struct rt_pin_ops ops = +{ + raspi_pin_mode, + raspi_pin_write, + raspi_pin_read, + raspi_pin_attach_irq, + raspi_pin_detach_irq, + raspi_pin_irq_enable, +}; +#endif + +int rt_hw_gpio_init(void) +{ +#ifdef BSP_USING_PIN + rt_device_pin_register("gpio", &ops, RT_NULL); +#endif + + return 0; +} +INIT_DEVICE_EXPORT(rt_hw_gpio_init); diff --git a/bsp/raspberry-pi/raspi4/driver/drv_gpio.h b/bsp/raspberry-pi/raspi4/driver/drv_gpio.h new file mode 100644 index 0000000000..ebc9452cec --- /dev/null +++ b/bsp/raspberry-pi/raspi4/driver/drv_gpio.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-16 bigmagic first version + */ + +#ifndef __DRV_GPIO_H__ +#define __DRV_GPIO_H__ + +#include +#include + +#include "board.h" +#include "interrupt.h" + +#define GPIO_BASE (0xFE000000 + 0x00200000) + +#define GPIO_REG_GPFSEL0(BASE) HWREG32(BASE + 0x00) +#define GPIO_REG_GPFSEL1(BASE) HWREG32(BASE + 0x04) +#define GPIO_REG_GPFSEL2(BASE) HWREG32(BASE + 0x08) +#define GPIO_REG_GPFSEL3(BASE) HWREG32(BASE + 0x0C) +#define GPIO_REG_GPFSEL4(BASE) HWREG32(BASE + 0x10) +#define GPIO_REG_GPFSEL5(BASE) HWREG32(BASE + 0x14) +#define GPIO_REG_REV0(BASE) HWREG32(BASE + 0x18) +#define GPIO_REG_GPSET0(BASE) HWREG32(BASE + 0x1C) +#define GPIO_REG_GPSET1(BASE) HWREG32(BASE + 0x20) +#define GPIO_REG_REV1(BASE) HWREG32(BASE + 0x24) +#define GPIO_REG_GPCLR0(BASE) HWREG32(BASE + 0x28) +#define GPIO_REG_GPCLR1(BASE) HWREG32(BASE + 0x2C) +#define GPIO_REG_REV2(BASE) HWREG32(BASE + 0x30) +#define GPIO_REG_GPLEV0(BASE) HWREG32(BASE + 0x34) +#define GPIO_REG_GPLEV1(BASE) HWREG32(BASE + 0x38) +#define GPIO_REG_REV3(BASE) HWREG32(BASE + 0x3C) +#define GPIO_REG_GPEDS0(BASE) HWREG32(BASE + 0x40) +#define GPIO_REG_GPEDS1(BASE) HWREG32(BASE + 0x44) +#define GPIO_REG_REV4(BASE) HWREG32(BASE + 0x48) +#define GPIO_REG_GPREN0(BASE) HWREG32(BASE + 0x4C) +#define GPIO_REG_GPREN1(BASE) HWREG32(BASE + 0x50) +#define GPIO_REG_REV5(BASE) HWREG32(BASE + 0x54) +#define GPIO_REG_GPFEN0(BASE) HWREG32(BASE + 0x58) +#define GPIO_REG_GPFEN1(BASE) HWREG32(BASE + 0x5C) +#define GPIO_REG_REV6(BASE) HWREG32(BASE + 0x60) +#define GPIO_REG_GPHEN0(BASE) HWREG32(BASE + 0x64) +#define GPIO_REG_GPHEN1(BASE) HWREG32(BASE + 0x68) +#define GPIO_REG_REV7(BASE) HWREG32(BASE + 0x6C) +#define GPIO_REG_GPLEN0(BASE) HWREG32(BASE + 0x70) +#define GPIO_REG_GPLEN1(BASE) HWREG32(BASE + 0x74) +#define GPIO_REG_REV8(BASE) HWREG32(BASE + 0x78) +#define GPIO_REG_GPAREN0(BASE) HWREG32(BASE + 0x7C) +#define GPIO_REG_GPAREN1(BASE) HWREG32(BASE + 0x80) +#define GPIO_REG_REV11(BASE) HWREG32(BASE + 0x84) +#define GPIO_REG_GPAFEN0(BASE) HWREG32(BASE + 0x88) +#define GPIO_REG_GPAFEN1(BASE) HWREG32(BASE + 0x8C) +#define GPIO_REG_REV10(BASE) HWREG32(BASE + 0x90) +#define GPIO_REG_GPPUD(BASE) HWREG32(BASE + 0x94) +#define GPIO_REG_GPPUDCLK0(BASE) HWREG32(BASE + 0x98) +#define GPIO_REG_GPPUDCLK1(BASE) HWREG32(BASE + 0x9C) +#define GPIO_REG_REV9(BASE) HWREG32(BASE + 0xA0) +#define GPIO_REG_TEST(BASE) HWREG32(BASE + 0xA4) + +typedef enum { + INPUT = 0b000, + OUTPUT = 0b001, + ALT0 = 0b100, + ALT1 = 0b101, + ALT2 = 0b110, + ALT3 = 0b111, + ALT4 = 0b011, + ALT5 = 0b010 +} GPIO_FUNC; + + +int rt_hw_gpio_init(void); + +#endif /* __DRV_GPIO_H__ */ diff --git a/bsp/raspberry-pi/raspi4/driver/drv_uart.c b/bsp/raspberry-pi/raspi4/driver/drv_uart.c new file mode 100644 index 0000000000..a7ac1b5892 --- /dev/null +++ b/bsp/raspberry-pi/raspi4/driver/drv_uart.c @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-16 bigmagic first version + */ + +#include +#include +#include + +#include "board.h" +#include "drv_uart.h" +#include "drv_gpio.h" + +#define UART0_BASE (0xFE000000 + 0x00201000) +#define PL011_BASE UART0_BASE +#define IRQ_PL011 (121 + 32) + +#define UART_REFERENCE_CLOCK 48000000 + +struct hw_uart_device +{ + rt_ubase_t hw_base; + rt_uint32_t irqno; +}; + +static rt_err_t uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg) +{ + struct hw_uart_device *uart; + uint32_t bauddiv = (UART_REFERENCE_CLOCK / cfg->baud_rate)* 1000 / 16; + uint32_t ibrd = bauddiv / 1000; + + RT_ASSERT(serial != RT_NULL); + uart = (struct hw_uart_device *)serial->parent.user_data; + if(uart->hw_base == PL011_BASE) + { + uint32_t gpfsel = 0; + + gpfsel &= ~((uint32_t)(0x07 << (4 * 3))); + gpfsel |= (uint32_t)(ALT0 << (4 * 3)); + GPIO_REG_GPFSEL1(GPIO_BASE) = gpfsel; + + gpfsel &= ~((uint32_t)(0x07 << (5 * 3))); + gpfsel |= (uint32_t)(ALT0 << (5 * 3)); + GPIO_REG_GPFSEL1(GPIO_BASE) = gpfsel; + + PL011_REG_CR(uart->hw_base) = 0;/*Clear UART setting*/ + PL011_REG_LCRH(uart->hw_base) = 0;/*disable FIFO*/ + PL011_REG_IBRD(uart->hw_base) = ibrd; + PL011_REG_FBRD(uart->hw_base) = (((bauddiv - ibrd * 1000) * 64 + 500) / 1000); + PL011_REG_LCRH(uart->hw_base) = PL011_LCRH_WLEN_8;/*FIFO*/ + PL011_REG_CR(uart->hw_base) = PL011_CR_UARTEN | PL011_CR_TXE | PL011_CR_RXE;/*art enable, TX/RX enable*/ + } + + return RT_EOK; +} + +static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg) +{ + struct hw_uart_device *uart; + + RT_ASSERT(serial != RT_NULL); + uart = (struct hw_uart_device *)serial->parent.user_data; + + switch (cmd) + { + case RT_DEVICE_CTRL_CLR_INT: + /* disable rx irq */ + PL011_REG_IMSC(uart->hw_base) &= ~((uint32_t)PL011_IMSC_RXIM); + rt_hw_interrupt_mask(uart->irqno); + break; + + case RT_DEVICE_CTRL_SET_INT: + /* enable rx irq */ + PL011_REG_IMSC(uart->hw_base) |= PL011_IMSC_RXIM; + rt_hw_interrupt_umask(uart->irqno); + break; + } + + return RT_EOK; +} + +static int uart_putc(struct rt_serial_device *serial, char c) +{ + struct hw_uart_device *uart; + + RT_ASSERT(serial != RT_NULL); + uart = (struct hw_uart_device *)serial->parent.user_data; + + while ((PL011_REG_FR(uart->hw_base) & PL011_FR_TXFF)); + PL011_REG_DR(uart->hw_base) = (uint8_t)c; + + return 1; +} + +static int uart_getc(struct rt_serial_device *serial) +{ + int ch = -1; + struct hw_uart_device *uart; + + RT_ASSERT(serial != RT_NULL); + uart = (struct hw_uart_device *)serial->parent.user_data; + + if((PL011_REG_FR(uart->hw_base) & PL011_FR_RXFE) == 0) + { + ch = PL011_REG_DR(uart->hw_base) & 0xff; + } + + return ch; +} + +static const struct rt_uart_ops _uart_ops = +{ + uart_configure, + uart_control, + uart_putc, + uart_getc, +}; + +static void rt_hw_uart_isr(int irqno, void *param) +{ + struct rt_serial_device *serial = (struct rt_serial_device*)param; + rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); + PL011_REG_ICR(UART0_BASE) = PL011_INTERRUPT_RECEIVE; +} + + +/* UART device driver structure */ +static struct hw_uart_device _uart0_device = +{ + PL011_BASE, + IRQ_PL011, +}; + +static struct rt_serial_device _serial0; + +int rt_hw_uart_init(void) +{ + struct hw_uart_device *uart; + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + + uart = &_uart0_device; + + _serial0.ops = &_uart_ops; + _serial0.config = config; + + /* register UART1 device */ + rt_hw_serial_register(&_serial0, "uart", + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, + uart); + rt_hw_interrupt_install(uart->irqno, rt_hw_uart_isr, &_serial0, "uart"); + + return 0; +} diff --git a/bsp/raspberry-pi/raspi4/driver/drv_uart.h b/bsp/raspberry-pi/raspi4/driver/drv_uart.h new file mode 100644 index 0000000000..4f23d7b46e --- /dev/null +++ b/bsp/raspberry-pi/raspi4/driver/drv_uart.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-16 bigmagic first version + */ + +#ifndef DRV_UART_H__ +#define DRV_UART_H__ + +// register's bit +#define PL011_FR_RI (1 << 8) +#define PL011_FR_TXFE (1 << 7) +#define PL011_FR_RXFF (1 << 6) +#define PL011_FR_TXFF (1 << 5) +#define PL011_FR_RXFE (1 << 4) +#define PL011_FR_BUSY (1 << 3) +#define PL011_FR_DCD (1 << 2) +#define PL011_FR_DSR (1 << 1) +#define PL011_FR_CTS (1 << 0) + +#define PL011_LCRH_SPS (1 << 7) +#define PL011_LCRH_WLEN_8 (3 << 5) +#define PL011_LCRH_WLEN_7 (2 << 5) +#define PL011_LCRH_WLEN_6 (1 << 5) +#define PL011_LCRH_WLEN_5 (0 << 5) +#define PL011_LCRH_FEN (1 << 4) +#define PL011_LCRH_STP2 (1 << 3) +#define PL011_LCRH_EPS (1 << 2) +#define PL011_LCRH_PEN (1 << 1) +#define PL011_LCRH_BRK (1 << 0) + +#define PL011_CR_CTSEN (1 << 15) +#define PL011_CR_RTSEN (1 << 14) +#define PL011_CR_RTS (1 << 11) +#define PL011_CR_DTR (1 << 10) +#define PL011_CR_RXE (1 << 9) +#define PL011_CR_TXE (1 << 8) +#define PL011_CR_LBE (1 << 7) +#define PL011_CR_SIRLP (1 << 2) +#define PL011_CR_SIREN (1 << 1) +#define PL011_CR_UARTEN (1 << 0) + +#define PL011_IMSC_TXIM (1 << 5) +#define PL011_IMSC_RXIM (1 << 4) + +#define PL011_INTERRUPT_OVERRUN_ERROR (1 << 10) +#define PL011_INTERRUPT_BREAK_ERROR (1 << 9) +#define PL011_INTERRUPT_PARITY_ERROR (1 << 8) +#define PL011_INTERRUPT_FRAMING_ERROR (1 << 7) +#define PL011_INTERRUPT_RECEIVE_TIMEOUT (1 << 6) +#define PL011_INTERRUPT_TRANSMIT (1 << 5) +#define PL011_INTERRUPT_RECEIVE (1 << 4) +#define PL011_INTERRUPT_nUARTCTS (1 << 1) + +#define PL011_REG_DR(BASE) HWREG32(BASE + 0x00) +#define PL011_REG_RSRECR(BASE) HWREG32(BASE + 0x04) +#define PL011_REG_RESERVED0(BASE) HWREG32(BASE + 0x08) +#define PL011_REG_FR(BASE) HWREG32(BASE + 0x18) +#define PL011_REG_RESERVED1(BASE) HWREG32(BASE + 0x1C) +#define PL011_REG_ILPR(BASE) HWREG32(BASE + 0x20) +#define PL011_REG_IBRD(BASE) HWREG32(BASE + 0x24) +#define PL011_REG_FBRD(BASE) HWREG32(BASE + 0x28) +#define PL011_REG_LCRH(BASE) HWREG32(BASE + 0x2C) +#define PL011_REG_CR(BASE) HWREG32(BASE + 0x30) +#define PL011_REG_IFLS(BASE) HWREG32(BASE + 0x34) +#define PL011_REG_IMSC(BASE) HWREG32(BASE + 0x38) +#define PL011_REG_RIS(BASE) HWREG32(BASE + 0x3C) +#define PL011_REG_MIS(BASE) HWREG32(BASE + 0x40) +#define PL011_REG_ICR(BASE) HWREG32(BASE + 0x44) +#define PL011_REG_DMACR(BASE) HWREG32(BASE + 0x48) +#define PL011_REG_RESERVED2(BASE) HWREG32(BASE + 0x4C) +#define PL011_REG_ITCR(BASE) HWREG32(BASE + 0x80) +#define PL011_REG_ITIP(BASE) HWREG32(BASE + 0x84) +#define PL011_REG_ITOP(BASE) HWREG32(BASE + 0x88) +#define PL011_REG_TDR(BASE) HWREG32(BASE + 0x8C) + +int rt_hw_uart_init(void); + +#endif /* DRV_UART_H__ */ + diff --git a/bsp/raspberry-pi/raspi4/driver/iomap.h b/bsp/raspberry-pi/raspi4/driver/iomap.h new file mode 100644 index 0000000000..00fc2025d9 --- /dev/null +++ b/bsp/raspberry-pi/raspi4/driver/iomap.h @@ -0,0 +1,13 @@ +#ifndef __RASPI4_H__ +#define __RASPI4_H__ + +#define INTC_BASE 0xff800000 +#define GIC_V2_DISTRIBUTOR_BASE (INTC_BASE + 0x00041000) +#define GIC_V2_CPU_INTERFACE_BASE (INTC_BASE + 0x00042000) +#define GIC_V2_HYPERVISOR_BASE (INTC_BASE + 0x00044000) +#define GIC_V2_VIRTUAL_CPU_BASE (INTC_BASE + 0x00046000) + +#define GIC_PL400_DISTRIBUTOR_PPTR GIC_V2_DISTRIBUTOR_BASE +#define GIC_PL400_CONTROLLER_PPTR GIC_V2_CPU_INTERFACE_BASE + +#endif \ No newline at end of file diff --git a/bsp/raspberry-pi/raspi4/link.lds b/bsp/raspberry-pi/raspi4/link.lds new file mode 100644 index 0000000000..b7b2dcc32c --- /dev/null +++ b/bsp/raspberry-pi/raspi4/link.lds @@ -0,0 +1,153 @@ +/* + * File : link.lds + * COPYRIGHT (C) 2017, RT-Thread Development Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Change Logs: + * 2017-5-30 bernard first version + */ + +/* _EL1_STACK_SIZE = DEFINED(_EL1_STACK_SIZE) ? _EL1_STACK_SIZE : 0x20000; */ + +SECTIONS +{ + . = 0x80000; + . = ALIGN(4096); + .text : + { + KEEP(*(.text.entrypoint)) /* The entry point */ + *(.vectors) + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + *(COMMON) + + /* section information for finsh shell */ + . = ALIGN(16); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + . = ALIGN(16); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + . = ALIGN(16); + + /* section information for initial. */ + . = ALIGN(16); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + . = ALIGN(16); + + . = ALIGN(16); + _etext = .; + } + + .eh_frame_hdr : + { + *(.eh_frame_hdr) + *(.eh_frame_entry) + } + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } + + . = ALIGN(16); + .data : + { + *(.data) + *(.data.*) + + *(.data1) + *(.data1.*) + + . = ALIGN(16); + _gp = ABSOLUTE(.); /* Base of small data */ + + *(.sdata) + *(.sdata.*) + } + + . = ALIGN(16); + .ctors : + { + PROVIDE(__ctors_start__ = .); + KEEP(*(SORT(.ctors.*))) + KEEP(*(.ctors)) + PROVIDE(__ctors_end__ = .); + } + + .dtors : + { + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + } + + . = ALIGN(16); + .bss : + { + PROVIDE(__bss_start = .); + *(.bss) + *(.bss.*) + *(.dynbss) + + PROVIDE(__bss_end = .); + } + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} + +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/bsp/raspberry-pi/raspi4/rtconfig.h b/bsp/raspberry-pi/raspi4/rtconfig.h new file mode 100644 index 0000000000..049e117559 --- /dev/null +++ b/bsp/raspberry-pi/raspi4/rtconfig.h @@ -0,0 +1,179 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Project Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 4 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 100 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 2048 +#define RT_USING_TIMER_SOFT +#define RT_TIMER_THREAD_PRIO 4 +#define RT_TIMER_THREAD_STACK_SIZE 2048 +#define RT_DEBUG + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart" +#define RT_VER_NUM 0x40003 +#define ARCH_CPU_64BIT + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 + +/* C++ features */ + + +/* Command shell */ + +#define RT_USING_FINSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_USING_DESCRIPTION +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_CMD_SIZE 80 +#define FINSH_USING_MSH +#define FINSH_USING_MSH_DEFAULT +#define FINSH_ARG_MAX 10 + +/* Device virtual file system */ + +#define RT_USING_DFS +#define DFS_USING_WORKDIR +#define DFS_FILESYSTEMS_MAX 2 +#define DFS_FILESYSTEM_TYPES_MAX 2 +#define DFS_FD_MAX 16 +#define RT_USING_DFS_DEVFS + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_PIPE_BUFSZ 512 +#define RT_USING_SERIAL +#define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN + +/* Using USB */ + + +/* POSIX layer and C standard library */ + +#define RT_USING_LIBC +#define RT_USING_POSIX + +/* Network */ + +/* Socket abstraction layer */ + + +/* Network interface device */ + + +/* light weight TCP/IP stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + + +/* multimedia packages */ + + +/* tools packages */ + + +/* system packages */ + + +/* peripheral libraries and drivers */ + + +/* miscellaneous packages */ + + +/* samples: kernel and components samples */ + + +/* Privated Packages of RealThread */ + + +/* Network Utilities */ + +#define BCM2711_SOC + +/* Hardware Drivers Config */ + +/* BCM Peripheral Drivers */ + +#define BSP_USING_UART +#define RT_USING_UART0 +#define BSP_USING_GIC +#define BSP_USING_GIC400 +#define BSP_USING_PIN +#define BSP_USING_CORETIMER + +/* Board Peripheral Drivers */ + + +#endif diff --git a/bsp/raspberry-pi/raspi4/rtconfig.py b/bsp/raspberry-pi/raspi4/rtconfig.py new file mode 100644 index 0000000000..228ec0176a --- /dev/null +++ b/bsp/raspberry-pi/raspi4/rtconfig.py @@ -0,0 +1,51 @@ +import os + +# toolchains options +ARCH ='aarch64' +CPU ='cortex-a57' +CROSS_TOOL ='gcc' + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = r'../../..' + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') + +PLATFORM = 'gcc' +EXEC_PATH = r'/opt/gcc-arm-8.3-2019.03-x86_64-aarch64-elf/bin/' + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + # PREFIX = 'arm-none-eabi-' + PREFIX = 'aarch64-elf-' + CC = PREFIX + 'gcc' + CXX = PREFIX + 'g++' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -march=armv8-a -mtune=cortex-a57' + CFLAGS = DEVICE + ' -Wall' + AFLAGS = ' -c' + ' -x assembler-with-cpp -D__ASSEMBLY__' + LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,system_vectors -T link.lds' + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + +DUMP_ACTION = OBJDUMP + ' -D -S $TARGET > rtt.asm\n' +POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' diff --git a/libcpu/aarch64/SConscript b/libcpu/aarch64/SConscript index 453afe4b3e..5fca2b473b 100644 --- a/libcpu/aarch64/SConscript +++ b/libcpu/aarch64/SConscript @@ -9,6 +9,9 @@ cwd = GetCurrentDir() group = [] list = os.listdir(cwd) +# add common code files +group = group + SConscript(os.path.join('common', 'SConscript')) + # cpu porting code files if rtconfig.CPU != 'common': group = group + SConscript(os.path.join(rtconfig.CPU, 'SConscript')) diff --git a/libcpu/aarch64/common/SConscript b/libcpu/aarch64/common/SConscript new file mode 100644 index 0000000000..72fb8e26c3 --- /dev/null +++ b/libcpu/aarch64/common/SConscript @@ -0,0 +1,24 @@ +# RT-Thread building script for component + +from building import * + +Import('rtconfig') + +cwd = GetCurrentDir() +src = Glob('*.c') + Glob('*.cpp') + Glob('*.S') +CPPPATH = [cwd] + +group = DefineGroup('common', src, depend = [''], CPPPATH = CPPPATH) + +# build for sub-directory +list = os.listdir(cwd) +objs = [] + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) +group = group + objs + + +Return('group') diff --git a/libcpu/aarch64/cortex-a53/armv8.h b/libcpu/aarch64/common/armv8.h similarity index 100% rename from libcpu/aarch64/cortex-a53/armv8.h rename to libcpu/aarch64/common/armv8.h diff --git a/libcpu/aarch64/cortex-a53/cache.S b/libcpu/aarch64/common/cache.S similarity index 100% rename from libcpu/aarch64/cortex-a53/cache.S rename to libcpu/aarch64/common/cache.S diff --git a/libcpu/aarch64/cortex-a53/context_gcc.S b/libcpu/aarch64/common/context_gcc.S similarity index 100% rename from libcpu/aarch64/cortex-a53/context_gcc.S rename to libcpu/aarch64/common/context_gcc.S diff --git a/libcpu/aarch64/cortex-a53/cp15.h b/libcpu/aarch64/common/cp15.h similarity index 100% rename from libcpu/aarch64/cortex-a53/cp15.h rename to libcpu/aarch64/common/cp15.h diff --git a/libcpu/aarch64/cortex-a53/cpu.c b/libcpu/aarch64/common/cpu.c similarity index 100% rename from libcpu/aarch64/cortex-a53/cpu.c rename to libcpu/aarch64/common/cpu.c diff --git a/libcpu/aarch64/cortex-a53/cpu_gcc.S b/libcpu/aarch64/common/cpu_gcc.S similarity index 100% rename from libcpu/aarch64/cortex-a53/cpu_gcc.S rename to libcpu/aarch64/common/cpu_gcc.S diff --git a/libcpu/aarch64/common/gic/SConscript b/libcpu/aarch64/common/gic/SConscript new file mode 100644 index 0000000000..b114ba7678 --- /dev/null +++ b/libcpu/aarch64/common/gic/SConscript @@ -0,0 +1,24 @@ +# RT-Thread building script for component + +from building import * + +cwd = GetCurrentDir() +CPPPATH = [cwd] + +gic400_group = Split(''' +gic_pl400.c +''') + +gic500_group = Split(''' +gic_pl500.c +''') + +src = () +if GetDepend('BSP_USING_GIC400'): + src = gic400_group +if GetDepend('BSP_USING_GIC500'): + src = gic500_group + +group = DefineGroup('gic', src, depend = ['BSP_USING_GIC'], CPPPATH = CPPPATH) + +Return('group') diff --git a/libcpu/aarch64/common/gic/gic_pl400.c b/libcpu/aarch64/common/gic/gic_pl400.c new file mode 100644 index 0000000000..eb35c5b2a4 --- /dev/null +++ b/libcpu/aarch64/common/gic/gic_pl400.c @@ -0,0 +1,368 @@ +/* + * Copyright 2014, General Dynamics C4 Systems + * + * This software may be distributed and modified according to the terms of + * the GNU General Public License version 2. Note that NO WARRANTY is provided. + * See "LICENSE_GPLv2.txt" for details. + * + * @TAG(GD_GPL) + */ + +#include "gic_pl400.h" +#include "iomap.h" + +#define BIT(n) (1ul<<(n)) +#define MASK(n) (BIT(n)-1ul) + +/* Setters/getters helpers */ +#define IRQ_REG(IRQ) ((IRQ) / 32) +#define IRQ_BIT(IRQ) BIT((IRQ) % 32) +#define IRQ_MASK MASK(10) +#define IS_IRQ_VALID(X) (((X)&IRQ_MASK) < SPECIAL_IRQ_START) + +#define CPU(X) (1<<(X)) +#define TARGET_CPU_ALLINT(CPU) ( \ + ( ((CPU)&0xff)<<0 ) |\ + ( ((CPU)&0xff)<<8 ) |\ + ( ((CPU)&0xff)<<16 ) |\ + ( ((CPU)&0xff)<<24 ) \ + ) +#define TARGET_CPU0_ALLINT TARGET_CPU_ALLINT(CPU(0)) + + +#define IRQ_SET_ALL 0xffffffff; + +/* Special IRQ's */ +#define SPECIAL_IRQ_START 1020 +#define IRQ_NONE 1023 + +/* Memory map for GIC distributor */ +struct gic_dist_map { + uint32_t enable; /* 0x000 */ + uint32_t ic_type; /* 0x004 */ + uint32_t dist_ident; /* 0x008 */ + uint32_t res1[29]; /* [0x00C, 0x080) */ + + uint32_t group[32]; /* [0x080, 0x100) */ + + uint32_t enable_set[32]; /* [0x100, 0x180) */ + uint32_t enable_clr[32]; /* [0x180, 0x200) */ + uint32_t pending_set[32]; /* [0x200, 0x280) */ + uint32_t pending_clr[32]; /* [0x280, 0x300) */ + uint32_t active[32]; /* [0x300, 0x380) */ + uint32_t active_clr[32]; /* [0x380, 0x400) */ + + uint32_t priority[255]; /* [0x400, 0x7FC) */ + uint32_t res2; /* 0x7FC */ + + uint32_t targets[255]; /* [0x800, 0xBFC) */ + uint32_t res3; /* 0xBFC */ + + uint32_t config[64]; /* [0xC00, 0xD00) */ + + uint32_t ppi_status; /* [0xD00, 0xD04) */ + uint32_t spi_status[15]; /* [0xD04, 0xD40) */ + uint32_t res4[112]; /* [0xD40, 0xF00) */ + + uint32_t sgi_control; /* 0xF00 */ + uint32_t res5[3]; /* [0xF04, 0xF10) */ + uint32_t sgi_pending_clr[4]; /* [0xF10, 0xF20) */ + uint32_t sgi_pending_set[4]; /* [0xF20, 0xF30) */ + uint32_t res10[40]; /* [0xF30, 0xFD0) */ + + uint32_t periph_id[8]; /* [0xFD0, 0xFF0) */ + uint32_t component_id[4]; /* [0xFF0, 0xFFF] */ +}; + + +/* Memory map for GIC cpu interface */ +struct gic_cpu_iface_map { + uint32_t icontrol; /* 0x000 */ + uint32_t pri_msk_c; /* 0x004 */ + uint32_t bp_c; /* 0x008 */ + uint32_t int_ack; /* 0x00C */ + uint32_t eoi; /* 0x010 */ + uint32_t run_priority; /* 0x014 */ + uint32_t hi_pend; /* 0x018 */ + uint32_t ns_alias_bp_c; /* 0x01C */ + uint32_t ns_alias_ack; /* 0x020 GIC_PL400 only */ + uint32_t ns_alias_eoi; /* 0x024 GIC_PL400 only */ + uint32_t ns_alias_hi_pend; /* 0x028 GIC_PL400 only */ + + uint32_t res1[41]; /* [0x02C, 0x0D0) */ + uint32_t active_priority[4]; /* [0x0D0, 0xC0] GIC_PL400 only */ + uint32_t ns_active_priority[4]; /* [0xE0,0xF0] GIC_PL400 only */ + uint32_t res4[3]; /* [0xF0, 0xFC] */ + + uint32_t cpu_if_ident; /* 0x0FC */ + uint32_t deactive; /* [0x1000] */ +}; + +volatile struct gic_dist_map *gic_dist = + (volatile struct gic_dist_map*)(GIC_PL400_DISTRIBUTOR_PPTR); + +volatile struct gic_cpu_iface_map *gic_cpuiface = + (volatile struct gic_cpu_iface_map*)(GIC_PL400_CONTROLLER_PPTR); + +/* Helpers */ +static inline int +is_irq_pending(irq_t irq) +{ + int word = irq / 32; + int bit = irq & 0x1f; + return !!(gic_dist->pending_set[word] & BIT(bit)); +} + +static inline int +is_irq_active(irq_t irq) +{ + int word = irq / 32; + int bit = irq & 0x1f; + return !!(gic_dist->active[word] & BIT(bit)); +} + +static inline int +is_irq_enabled(irq_t irq) +{ + int word = irq / 32; + int bit = irq & 0x1f; + return !!(gic_dist->enable_set[word] & BIT(bit)); +} + +static inline int +is_irq_edge_triggered(irq_t irq) +{ + int word = irq / 16; + int bit = ((irq & 0xf) * 2); + return !!(gic_dist->config[word] & BIT(bit + 1)); +} + +static inline int +is_irq_1_N(irq_t irq) +{ + int word = irq / 16; + int bit = ((irq & 0xf) * 2); + return !!(gic_dist->config[word] & BIT(bit + 0)); +} + +static inline int +is_irq_N_N(irq_t irq) +{ + return !(is_irq_1_N(irq)); +} + +static inline void +dist_pending_clr(irq_t irq) +{ + int word = irq / 32; + int bit = irq & 0x1f; + /* Using |= here is detrimental to your health */ + gic_dist->pending_clr[word] = BIT(bit); +} + +static inline void +dist_pending_set(irq_t irq) +{ + int word = irq / 32; + int bit = irq & 0x1f; + gic_dist->pending_set[word] = BIT(bit); +} + +static inline void +dist_enable_clr(irq_t irq) +{ + int word = irq / 32; + int bit = irq & 0x1f; + /* Using |= here is detrimental to your health */ + gic_dist->enable_clr[word] = BIT(bit); +} + +static inline void +dist_enable_set(irq_t irq) +{ + int word = irq / 32; + int bit = irq & 0x1f; + gic_dist->enable_set[word] = BIT(bit); +} + +/** + DONT_TRANSLATE + */ +static void dist_init(void) +{ + int i; + int nirqs = 32 * ((gic_dist->ic_type & 0x1f) + 1); + gic_dist->enable = 0; + +#if 0 + /* configure to group 0 for security */ + for (i = 0; i < nirqs; i += 32) { + gic_dist->group[i / 32] = 0xffffffff; + } +#endif + + for (i = 0; i < nirqs; i += 32) { + /* disable */ + gic_dist->enable_clr[i / 32] = IRQ_SET_ALL; + /* clear pending */ + gic_dist->pending_clr[i / 32] = IRQ_SET_ALL; + } + + /* reset interrupts priority */ + for (i = 32; i < nirqs; i += 4) { + gic_dist->priority[i / 4] = 0x0; + } + + /* + * reset int target to cpu 0 + * (Should really query which processor we're running on and use that) + */ + for (i = 0; i < nirqs; i += 4) { + gic_dist->targets[i / 4] = TARGET_CPU0_ALLINT; + } + + /* level-triggered, 1-N */ + for (i = 64; i < nirqs; i += 32) { + gic_dist->config[i / 32] = 0; + //gic_dist->config[i / 32] = 0x55555555; + } + /* enable the int controller */ + gic_dist->enable = 1; +} + +/** + DONT_TRANSLATE + */ +static void cpu_iface_init(void) +{ + uint32_t i; + + /* For non-Exynos4, the registers are banked per CPU, need to clear them */ + gic_dist->enable_clr[0] = IRQ_SET_ALL; + gic_dist->pending_clr[0] = IRQ_SET_ALL; + gic_dist->priority[0] = 0x00; + /* put everything in group 0 */ + + /* clear any software generated interrupts */ + for (i = 0; i < 16; i += 4) { + gic_dist->sgi_pending_clr[i / 4] = IRQ_SET_ALL; + } + + gic_cpuiface->icontrol = 0; + gic_cpuiface->pri_msk_c = 0x000000f0; + gic_cpuiface->bp_c = 0x00000003; + + while (((i = gic_cpuiface->int_ack) & IRQ_MASK) != IRQ_NONE) { + gic_cpuiface->eoi = i; + } + gic_cpuiface->icontrol = 0x1; +} + +/** + DONT_TRANSLATE + */ +void initIRQController(void) +{ + dist_init(); + cpu_iface_init(); +} + + + +/* + * The only sane way to get an GIC IRQ number that can be properly + * ACKED later is through the int_ack register. Unfortunately, reading + * this register changes the interrupt state to pending so future + * reads will not return the same value For this reason, we have a + * global variable to store the IRQ number. + */ +static uint32_t active_irq = IRQ_NONE; + +/** + DONT_TRANSLATE + */ +interrupt_t +getActiveIRQ(void) +{ + uint32_t irq; + if (!IS_IRQ_VALID(active_irq)) { + active_irq = gic_cpuiface->int_ack; + } + + if (IS_IRQ_VALID(active_irq)) { + irq = active_irq & IRQ_MASK; + } else { + irq = 1023; + } + + return irq; +} + +/* + * GIC has 4 states: pending->active(+pending)->inactive + * seL4 expects two states: active->inactive. + * We ignore the active state in GIC to conform + */ +/** + DONT_TRANSLATE + */ +bool_t +isIRQPending(void) +{ + return IS_IRQ_VALID(gic_cpuiface->hi_pend); +} + + +/** + DONT_TRANSLATE + */ +void +maskInterrupt(bool_t disable, interrupt_t irq) +{ + if (disable) { + dist_enable_clr(irq); + } else { + dist_enable_set(irq); + } +} + +/** + DONT_TRANSLATE + */ +void +ackInterrupt(irq_t irq) +{ + if (!(IS_IRQ_VALID(active_irq) && (active_irq & IRQ_MASK) == irq)) { + return; + } + if (is_irq_edge_triggered(irq)) { + dist_pending_clr(irq); + } + gic_cpuiface->eoi = active_irq; + active_irq = IRQ_NONE; +} + +void +handleSpuriousIRQ(void) +{ +} + +void rt_hw_interrupt_mask(int vector) +{ + maskInterrupt(1, vector); +} + +void rt_hw_interrupt_umask(int vector) +{ + maskInterrupt(0, vector); +} + +int rt_hw_interrupt_get_irq(void) +{ + return getActiveIRQ(); +} + +void rt_hw_interrupt_ack(int fiq_irq) +{ + return ackInterrupt(fiq_irq); +} diff --git a/libcpu/aarch64/common/gic/gic_pl400.h b/libcpu/aarch64/common/gic/gic_pl400.h new file mode 100644 index 0000000000..a43583bd7c --- /dev/null +++ b/libcpu/aarch64/common/gic/gic_pl400.h @@ -0,0 +1,35 @@ + +#ifndef __ARCH_MACHINE_GIC_PL400_H +#define __ARCH_MACHINE_GIC_PL400_H + +#include + +typedef uint16_t interrupt_t; +typedef uint16_t irq_t; +typedef uint64_t bool_t; + +/** MODIFIES: [*] */ +interrupt_t getActiveIRQ(void); +/** MODIFIES: [*] */ +interrupt_t getPendingIRQ(void); +/** MODIFIES: [*] */ +bool_t isIRQPending(void); +/** MODIFIES: [*] */ +void maskInterrupt(bool_t disable, interrupt_t irq); +/** MODIFIES: [*] */ +void ackInterrupt(irq_t irq); +/** MODIFIES: [*] */ +static inline void setInterruptMode(irq_t irq, bool_t levelTrigger, bool_t polarityLow) { } + +/** MODIFIES: [*] */ +void initIRQController(void); + +void handleSpuriousIRQ(void); + +void rt_hw_interrupt_umask(int vector); + +int rt_hw_interrupt_get_irq(void); + +void rt_hw_interrupt_ack(int fiq_irq); +#endif /* !__ARCH_MACHINE_GIC400_H */ + diff --git a/libcpu/aarch64/cortex-a53/mmu.c b/libcpu/aarch64/common/mmu.c similarity index 100% rename from libcpu/aarch64/cortex-a53/mmu.c rename to libcpu/aarch64/common/mmu.c diff --git a/libcpu/aarch64/cortex-a53/mmu.h b/libcpu/aarch64/common/mmu.h similarity index 100% rename from libcpu/aarch64/cortex-a53/mmu.h rename to libcpu/aarch64/common/mmu.h diff --git a/libcpu/aarch64/cortex-a53/startup_gcc.S b/libcpu/aarch64/common/startup_gcc.S similarity index 100% rename from libcpu/aarch64/cortex-a53/startup_gcc.S rename to libcpu/aarch64/common/startup_gcc.S diff --git a/libcpu/aarch64/cortex-a53/vector_gcc.S b/libcpu/aarch64/common/vector_gcc.S similarity index 100% rename from libcpu/aarch64/cortex-a53/vector_gcc.S rename to libcpu/aarch64/common/vector_gcc.S diff --git a/libcpu/aarch64/cortex-a53/SConscript b/libcpu/aarch64/cortex-a53/SConscript index 75e170a0cf..c6a4817802 100644 --- a/libcpu/aarch64/cortex-a53/SConscript +++ b/libcpu/aarch64/cortex-a53/SConscript @@ -1,16 +1,13 @@ +# RT-Thread building script for component + from building import * +Import('rtconfig') + cwd = GetCurrentDir() -src = Glob('*.c') + Glob('*.cpp') -asm_src = Split(''' -context_gcc.S -vector_gcc.S -entry_point.S -cpu_gcc.S -cache.S -''') +src = Glob('*.c') + Glob('*.cpp') + Glob('*.S') CPPPATH = [cwd] -group = DefineGroup('cpu', src + asm_src, depend = [''], CPPPATH = CPPPATH) +group = DefineGroup('common', src, depend = [''], CPPPATH = CPPPATH) Return('group') diff --git a/libcpu/aarch64/cortex-a53/interrupt.h b/libcpu/aarch64/cortex-a53/interrupt.h index 3533d3818c..8e741ed4e6 100644 --- a/libcpu/aarch64/cortex-a53/interrupt.h +++ b/libcpu/aarch64/cortex-a53/interrupt.h @@ -1,11 +1,11 @@ - /* * Copyright (c) 2006-2020, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: - * Date Author Notes + * Date Author Notes + * 2020-04-16 bigmagic first version */ #ifndef __INTERRUPT_H__ @@ -19,8 +19,6 @@ #define INT_IRQ 0x00 #define INT_FIQ 0x01 -//void rt_hw_vector_init(void); - void rt_hw_interrupt_init(void); void rt_hw_interrupt_mask(int vector); void rt_hw_interrupt_umask(int vector); diff --git a/libcpu/aarch64/cortex-a57/SConscript b/libcpu/aarch64/cortex-a57/SConscript new file mode 100644 index 0000000000..c6a4817802 --- /dev/null +++ b/libcpu/aarch64/cortex-a57/SConscript @@ -0,0 +1,13 @@ +# RT-Thread building script for component + +from building import * + +Import('rtconfig') + +cwd = GetCurrentDir() +src = Glob('*.c') + Glob('*.cpp') + Glob('*.S') +CPPPATH = [cwd] + +group = DefineGroup('common', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/libcpu/aarch64/cortex-a57/entry_point.S b/libcpu/aarch64/cortex-a57/entry_point.S new file mode 100644 index 0000000000..6d2c69226b --- /dev/null +++ b/libcpu/aarch64/cortex-a57/entry_point.S @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Date Author Notes + * 2020-01-15 bigmagic the first version + */ + +.section ".text.entrypoint" + +.set EL1_stack, __el1_stack + +.global _start + +// This symbol is set to 0x80000 in ld script. That is the address that raspi3's firmware +// loads 'kernel8.img' file in. +_start: + // read cpu id, stop slave cores + mrs x1, mpidr_el1 // MPIDR_EL1: Multi-Processor Affinity Register + and x1, x1, #3 + cbz x1, .L__cpu_0 // .L prefix is the local label in ELF + + // cpu id > 0, stop + // cpu id == 0 will also goto here after returned from entry() if possible +.L__current_cpu_idle: + wfe + b .L__current_cpu_idle + +.L__cpu_0: // cpu id == 0 + + // set stack before our code + + /* Define stack pointer for current exception level */ + // ldr x2, =EL1_stack + // mov sp, x2 + + ldr x1, =_start + + // set up EL1 + mrs x0, CurrentEL // CurrentEL Register. bit 2, 3. Others reserved + and x0, x0, #12 // clear reserved bits + + // running at EL3? + cmp x0, #12 // 1100b. So, EL3 + bne .L__not_in_el3 // 11? !EL3 -> 5: + + // should never be executed, just for completeness. (EL3) + mov x2, #0x5b1 + msr scr_el3, x2 // SCR_ELn Secure Configuration Register + mov x2, #0x3c9 + msr spsr_el3, x2 // SPSR_ELn. Saved Program Status Register. 1111001001 + adr x2, .L__not_in_el3 + msr elr_el3, x2 + eret // Exception Return: from EL3, continue from .L__not_in_el3 + + // running at EL2 or EL1 +.L__not_in_el3: + cmp x0, #4 // 0x04 0100 EL1 + beq .L__in_el1 // EL1 -> 5: + + // in EL2 + msr sp_el1, x1 // Set sp of EL1 to _start + + // enable CNTP for EL1 + mrs x0, cnthctl_el2 // Counter-timer Hypervisor Control register + orr x0, x0, #3 + msr cnthctl_el2, x0 + msr cntvoff_el2, xzr + + // enable AArch64 in EL1 + mov x0, #(1 << 31) // AArch64 + orr x0, x0, #(1 << 1) // SWIO hardwired on Pi3 + msr hcr_el2, x0 + mrs x0, hcr_el2 + + // change execution level to EL1 + mov x2, #0x3c4 + msr spsr_el2, x2 // 1111000100 + adr x2, .L__in_el1 + msr elr_el2, x2 + eret // exception return. from EL2. continue from .L__in_el1 + +.L__in_el1: + mov sp, x1 // in EL1. Set sp to _start + + // Set CPACR_EL1 (Architecture Feature Access Control Register) to avoid trap from SIMD or float point instruction + mov x1, #0x00300000 // Don't trap any SIMD/FP instructions in both EL0 and EL1 + msr cpacr_el1, x1 + + mrs x1, sctlr_el1 + orr x1, x1, #(1 << 12) + bic x1, x1, #(3 << 3) + bic x1, x1, #(1 << 1) + msr sctlr_el1, x1 + + // clear bss + ldr x1, =__bss_start + ldr w2, =__bss_size + +.L__clean_bss_loop: + cbz w2, .L__jump_to_entry + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, .L__clean_bss_loop + + // jump to C code, should not return +.L__jump_to_entry: + bl entry + // for failsafe, halt this core too + b .L__current_cpu_idle diff --git a/libcpu/aarch64/cortex-a57/interrupt.c b/libcpu/aarch64/cortex-a57/interrupt.c new file mode 100644 index 0000000000..d770259d61 --- /dev/null +++ b/libcpu/aarch64/cortex-a57/interrupt.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-16 bigmagic first version + */ + +#include +#include +#include +#include +#include + +#define MAX_HANDLERS 256 + +#ifdef RT_USING_SMP +#define rt_interrupt_nest rt_cpu_self()->irq_nest +#else +extern volatile rt_uint8_t rt_interrupt_nest; +#endif + +extern int system_vectors; + +/* exception and interrupt handler table */ +struct rt_irq_desc isr_table[MAX_HANDLERS]; + +rt_ubase_t rt_interrupt_from_thread; +rt_ubase_t rt_interrupt_to_thread; +rt_ubase_t rt_thread_switch_interrupt_flag; + +void rt_hw_vector_init(void) +{ + rt_hw_set_current_vbar((rt_ubase_t)&system_vectors); // cpu_gcc.S +} + +/** + * This function will initialize hardware interrupt + */ +void rt_hw_interrupt_init(void) +{ + initIRQController(); +} + +/** + * This function will install a interrupt service routine to a interrupt. + * @param vector the interrupt number + * @param new_handler the interrupt service routine to be installed + * @param old_handler the old interrupt service routine + */ +rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler, + void *param, const char *name) +{ + rt_isr_handler_t old_handler = RT_NULL; + + if (vector < MAX_HANDLERS) + { + old_handler = isr_table[vector].handler; + + if (handler != RT_NULL) + { +#ifdef RT_USING_INTERRUPT_INFO + rt_strncpy(isr_table[vector].name, name, RT_NAME_MAX); +#endif /* RT_USING_INTERRUPT_INFO */ + isr_table[vector].handler = handler; + isr_table[vector].param = param; + } + } + + return old_handler; +} \ No newline at end of file diff --git a/libcpu/aarch64/cortex-a57/interrupt.h b/libcpu/aarch64/cortex-a57/interrupt.h new file mode 100644 index 0000000000..0d2d4867c7 --- /dev/null +++ b/libcpu/aarch64/cortex-a57/interrupt.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-16 bigmagic first version + */ + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#include +#include + +#define INT_IRQ 0x00 +#define INT_FIQ 0x01 + +void rt_hw_interrupt_init(void); +void rt_hw_interrupt_mask(int vector); +void rt_hw_interrupt_umask(int vector); + +rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler, + void *param, const char *name); + +#endif diff --git a/libcpu/aarch64/cortex-a57/stack.c b/libcpu/aarch64/cortex-a57/stack.c new file mode 100644 index 0000000000..68222c2c67 --- /dev/null +++ b/libcpu/aarch64/cortex-a57/stack.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2006-2019, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2011-09-23 Bernard the first version + * 2011-10-05 Bernard add thumb mode + */ +#include +#include + +#include + +#define INITIAL_SPSR_EL3 (PSTATE_EL3 | SP_EL0) +#define INITIAL_SPSR_EL2 (PSTATE_EL2 | SP_EL0) +#define INITIAL_SPSR_EL1 (PSTATE_EL1 | SP_EL0) + +/** + * This function will initialize thread stack + * + * @param tentry the entry of thread + * @param parameter the parameter of entry + * @param stack_addr the beginning stack address + * @param texit the function will be called when thread exit + * + * @return stack address + */ +rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, + rt_uint8_t *stack_addr, void *texit) +{ + rt_ubase_t *stk; + rt_ubase_t current_el; + + stk = (rt_ubase_t*)stack_addr; + + *(--stk) = ( rt_ubase_t ) 11; /* X1 */ + *(--stk) = ( rt_ubase_t ) parameter; /* X0 */ + *(--stk) = ( rt_ubase_t ) 33; /* X3 */ + *(--stk) = ( rt_ubase_t ) 22; /* X2 */ + *(--stk) = ( rt_ubase_t ) 55; /* X5 */ + *(--stk) = ( rt_ubase_t ) 44; /* X4 */ + *(--stk) = ( rt_ubase_t ) 77; /* X7 */ + *(--stk) = ( rt_ubase_t ) 66; /* X6 */ + *(--stk) = ( rt_ubase_t ) 99; /* X9 */ + *(--stk) = ( rt_ubase_t ) 88; /* X8 */ + *(--stk) = ( rt_ubase_t ) 11; /* X11 */ + *(--stk) = ( rt_ubase_t ) 10; /* X10 */ + *(--stk) = ( rt_ubase_t ) 13; /* X13 */ + *(--stk) = ( rt_ubase_t ) 12; /* X12 */ + *(--stk) = ( rt_ubase_t ) 15; /* X15 */ + *(--stk) = ( rt_ubase_t ) 14; /* X14 */ + *(--stk) = ( rt_ubase_t ) 17; /* X17 */ + *(--stk) = ( rt_ubase_t ) 16; /* X16 */ + *(--stk) = ( rt_ubase_t ) 19; /* X19 */ + *(--stk) = ( rt_ubase_t ) 18; /* X18 */ + *(--stk) = ( rt_ubase_t ) 21; /* X21 */ + *(--stk) = ( rt_ubase_t ) 20; /* X20 */ + *(--stk) = ( rt_ubase_t ) 23; /* X23 */ + *(--stk) = ( rt_ubase_t ) 22; /* X22 */ + *(--stk) = ( rt_ubase_t ) 25; /* X25 */ + *(--stk) = ( rt_ubase_t ) 24; /* X24 */ + *(--stk) = ( rt_ubase_t ) 27; /* X27 */ + *(--stk) = ( rt_ubase_t ) 26; /* X26 */ + *(--stk) = ( rt_ubase_t ) 29; /* X29 */ + *(--stk) = ( rt_ubase_t ) 28; /* X28 */ + *(--stk) = ( rt_ubase_t ) 0; /* XZR - has no effect, used so there are an even number of registers. */ + *(--stk) = ( rt_ubase_t ) texit; /* X30 - procedure call link register. */ + + current_el = rt_hw_get_current_el(); + + if(current_el == 3) + { + *(--stk) = INITIAL_SPSR_EL3; + } + else if(current_el == 2) + { + *(--stk) = INITIAL_SPSR_EL2; + } + else + { + *(--stk) = INITIAL_SPSR_EL1; + } + + *(--stk) = ( rt_ubase_t ) tentry; /* Exception return address. */ + + /* return task's current stack address */ + return (rt_uint8_t *)stk; +} diff --git a/libcpu/aarch64/cortex-a57/trap.c b/libcpu/aarch64/cortex-a57/trap.c new file mode 100644 index 0000000000..d93aa18fd6 --- /dev/null +++ b/libcpu/aarch64/cortex-a57/trap.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Date Author Notes + * 2018-10-06 ZhaoXiaowei the first version + */ + +#include +#include + +#include "interrupt.h" +#include "armv8.h" + +extern struct rt_thread *rt_current_thread; +#ifdef RT_USING_FINSH +extern long list_thread(void); +#endif + +/** + * this function will show registers of CPU + * + * @param regs the registers point + */ +void rt_hw_show_register(struct rt_hw_exp_stack *regs) +{ + rt_kprintf("Execption:\n"); + rt_kprintf("r00:0x%16.16lx r01:0x%16.16lx r02:0x%16.16lx r03:0x%16.16lx\n", regs->x0, regs->x1, regs->x2, regs->x3); + rt_kprintf("r04:0x%16.16lx r05:0x%16.16lx r06:0x%16.16lx r07:0x%16.16lx\n", regs->x4, regs->x5, regs->x6, regs->x7); + rt_kprintf("r08:0x%16.16lx r09:0x%16.16lx r10:0x%16.16lx r11:0x%16.16lx\n", regs->x8, regs->x9, regs->x10, regs->x11); + rt_kprintf("r12:0x%16.16lx r13:0x%16.16lx r14:0x%16.16lx r15:0x%16.16lx\n", regs->x12, regs->x13, regs->x14, regs->x15); + rt_kprintf("r16:0x%16.16lx r17:0x%16.16lx r18:0x%16.16lx r19:0x%16.16lx\n", regs->x16, regs->x17, regs->x18, regs->x19); + rt_kprintf("r20:0x%16.16lx r21:0x%16.16lx r22:0x%16.16lx r23:0x%16.16lx\n", regs->x20, regs->x21, regs->x22, regs->x23); + rt_kprintf("r24:0x%16.16lx r25:0x%16.16lx r26:0x%16.16lx r27:0x%16.16lx\n", regs->x24, regs->x25, regs->x26, regs->x27); + rt_kprintf("r28:0x%16.16lx r29:0x%16.16lx r30:0x%16.16lx\n", regs->x28, regs->x29, regs->x30); + rt_kprintf("spsr:0x%16.16lx\n", regs->spsr); + rt_kprintf("return pc:0x%16.16lx\n", regs->pc); +} + +/** + * When comes across an instruction which it cannot handle, + * it takes the undefined instruction trap. + * + * @param regs system registers + * + * @note never invoke this function in application + */ +void rt_hw_trap_error(struct rt_hw_exp_stack *regs) +{ + rt_kprintf("error exception:\n"); + rt_hw_show_register(regs); +#ifdef RT_USING_FINSH + list_thread(); +#endif + rt_hw_cpu_shutdown(); +} + +#define GIC_ACK_INTID_MASK 0x000003ff + +int rt_hw_interrupt_get_irq(void); +void rt_hw_interrupt_ack(int fiq_irq); + +void rt_hw_trap_irq(void) +{ + void *param; + int ir; + rt_isr_handler_t isr_func; + extern struct rt_irq_desc isr_table[]; + + ir = rt_hw_interrupt_get_irq(); + if (ir == 1023) + { + /* Spurious interrupt */ + return; + } + + /* get interrupt service routine */ + isr_func = isr_table[ir].handler; +#ifdef RT_USING_INTERRUPT_INFO + isr_table[ir].counter++; +#endif + if (isr_func) + { + /* Interrupt for myself. */ + param = isr_table[ir].param; + /* turn to interrupt service routine */ + isr_func(ir, param); + } + + /* end of interrupt */ + rt_hw_interrupt_ack(ir); + +} + +void rt_hw_trap_fiq(void) +{ +} From a120c914bb003646010d1d385be36b5260284132 Mon Sep 17 00:00:00 2001 From: bigmagic Date: Thu, 16 Apr 2020 16:42:07 +0800 Subject: [PATCH 05/27] add bsp/raspi4 readme --- bsp/raspberry-pi/raspi3-64/README.md | 2 +- bsp/raspberry-pi/raspi4/Kconfig | 2 +- bsp/raspberry-pi/raspi4/README.md | 89 ++++++++----------- bsp/raspberry-pi/raspi4/rtconfig.py | 2 +- .../{cortex-a57 => cortex-a72}/SConscript | 0 .../{cortex-a57 => cortex-a72}/entry_point.S | 0 .../{cortex-a57 => cortex-a72}/interrupt.c | 0 .../{cortex-a57 => cortex-a72}/interrupt.h | 0 .../{cortex-a57 => cortex-a72}/stack.c | 0 .../aarch64/{cortex-a57 => cortex-a72}/trap.c | 0 10 files changed, 38 insertions(+), 57 deletions(-) rename libcpu/aarch64/{cortex-a57 => cortex-a72}/SConscript (100%) rename libcpu/aarch64/{cortex-a57 => cortex-a72}/entry_point.S (100%) rename libcpu/aarch64/{cortex-a57 => cortex-a72}/interrupt.c (100%) rename libcpu/aarch64/{cortex-a57 => cortex-a72}/interrupt.h (100%) rename libcpu/aarch64/{cortex-a57 => cortex-a72}/stack.c (100%) rename libcpu/aarch64/{cortex-a57 => cortex-a72}/trap.c (100%) diff --git a/bsp/raspberry-pi/raspi3-64/README.md b/bsp/raspberry-pi/raspi3-64/README.md index 28e00f96c0..576b13ed0e 100644 --- a/bsp/raspberry-pi/raspi3-64/README.md +++ b/bsp/raspberry-pi/raspi3-64/README.md @@ -17,7 +17,7 @@ Windows环境下推荐使用[env工具][1]进行编译。 -首先下载Linux上的gcc工具,版本为gcc-arm-8.3选择aarch64-elf就可以。 +首先下载windows上的aarch64的gcc交叉编译工具,版本为gcc-arm-8.3选择aarch64-elf就可以。 将推荐将gcc解压到`\env\tools\gnu_gcc\arm_gcc`目录下。 diff --git a/bsp/raspberry-pi/raspi4/Kconfig b/bsp/raspberry-pi/raspi4/Kconfig index e71ed3d54b..075a5d81aa 100644 --- a/bsp/raspberry-pi/raspi4/Kconfig +++ b/bsp/raspberry-pi/raspi4/Kconfig @@ -20,7 +20,7 @@ source "$PKGS_DIR/Kconfig" config BCM2711_SOC bool - select ARCH_ARM_CORTEX_A57 + select ARCH_ARM_CORTEX_A72 select RT_USING_COMPONENTS_INIT select RT_USING_USER_MAIN select ARCH_CPU_64BIT diff --git a/bsp/raspberry-pi/raspi4/README.md b/bsp/raspberry-pi/raspi4/README.md index 28e00f96c0..1e7411894e 100644 --- a/bsp/raspberry-pi/raspi4/README.md +++ b/bsp/raspberry-pi/raspi4/README.md @@ -1,86 +1,67 @@ -# Raspberry PI 3-64板级支持包说明 +# Raspberry PI 4板级支持包说明 ## 1. 简介 -树莓派由注册于英国的慈善组织“Raspberry Pi 基金会”开发,莓派3有三个发行版本: +树莓派4B的核心处理器为博通BCM2711(四核1.5GHz,Cortex A72架构,树莓派3是四核A53)。LPDDR4内存,由5V/3A USB-C供电或GPIO 5V。 -* B : 4核 Broadcom BCM2837 (ARMv8-A) 1.2GHz,双核VideoCore IV GPU,1GB内存,100 Base-T Ethernet -* B+: 4核 Broadcom BCM2837B0 Cortex-A53 (ARMv8) 1.4GHz, 1GB LPDDR2 SDRAM, GigaE over USB 2.0 -* A+: 4核 Broadcom BCM2837B0 Cortex-A53 (ARMv8) 1.4GHz, 512MB LPDDR2 SDRAM +外设支持上,引入了双频Wi-Fi,蓝牙5.0,千兆网卡,MIPI CSI相机接口,两个USB口,40个扩展帧。 -这份RT-Thread BSP是针对 Raspberry Pi 3 64位模式的一份移植,树莓派价格便宜, 使用者甚众,是研究和运行RT-Thread的可选平台之一。 +这份RT-Thread BSP是针对 Raspberry Pi 4的一份移植,树莓派价格便宜, 使用者甚众,是研究和运行RT-Thread的可选平台之一。 ## 2. 编译说明 -### 2.1 Window上的环境搭建 - -Windows环境下推荐使用[env工具][1]进行编译。 - -首先下载Linux上的gcc工具,版本为gcc-arm-8.3选择aarch64-elf就可以。 - -将推荐将gcc解压到`\env\tools\gnu_gcc\arm_gcc`目录下。 - -接着修改`bsp\raspberry-pi\raspi3-64\rtconfig.py` - -修改路径: - -``` -EXEC_PATH = r'E:/env_released_1.1.2/env/tools/gnu_gcc/arm_gcc/gcc-arm-8.3-2019.03-i686-mingw32-aarch64-elf/bin' -``` - -然后在`bsp\raspberry-pi\raspi3-64\`下输入scons编译即可。 - -### 2.2 Linux上的环境搭建 - Linux下推荐使用[gcc工具][2]。Linux版本下gcc版本可采用`gcc-arm-8.3-2019.03-x86_64-aarch64-elf`。 -直接进入`bsp\raspberry-pi\raspi3-64`,输入scons编译即可。 +将工具链解压到指定目录,并修改当前bsp下的`EXEC_PATH`为自定义gcc目录。 + +``` +PLATFORM = 'gcc' +EXEC_PATH = r'/opt/gcc-arm-8.3-2019.03-x86_64-aarch64-elf/bin/' +``` + +直接进入`bsp\raspberry-pi\raspi4`,输入scons编译即可。 ## 3. 执行 -### 3.1 下载[raspbian镜像][3],生成可以运行的raspbian SD卡 +### 3.1 下载**Raspberry Pi Imager**,生成可以运行的raspbian SD卡 -Windows下,去[etcher.io][4]下载etcher,这是个可以烧写img的工具 +首先下载镜像 -解开下载的镜像文件, linux下使用如下的命令 - -``` -unzip 2018-06-27-raspbian-stretch-lite.zip -``` - -准备一张空SD卡,linux环境下,插入电脑并执行 - -``` -sudo dd if=2018-06-27-raspbian-stretch-lite.img of=/dev/xxx bs=32M conv=fsync -``` - -**注意: /dev/xxx 要换成真实环境中的SD卡所在设置,千万不要弄错。** - -Windows环境下,执行etcher选择解压后的2018-06-27-raspbian-stretch-lite.img文件和SD卡就可以开始烧写了。 - -最后把kernel8.img放入SD boot分区,删除其它 kernel*.img。 +* [Raspberry Pi Imager for Ubuntu](https://downloads.raspberrypi.org/imager/imager_amd64.deb) +* [Raspberry Pi Imager for Windows](https://downloads.raspberrypi.org/imager/imager.exe) +* [Raspberry Pi Imager for macOS](https://downloads.raspberrypi.org/imager/imager.dmg) ### 3.2 准备好串口线 -目前版本是使用raspi3的 GPIO 14, GPIO 15来作路口输出,连线情况如下图所示(图片中的板子是pi2,GPIO引脚是一样的): +目前版本是使用raspi4的 GPIO 14, GPIO 15来作路口输出,连线情况如下图所示: -![raspi2](figures/raspi_uart.png) +![raspi2](../raspi3-32/figures/raspberrypi-console.png) 串口参数: 115200 8N1 ,硬件和软件流控为关。 -按上面的方法做好SD卡后,插入树莓派,通电可以在串口上看到如下所示的输出信息: +### 3.3 程序下载 + +当编译生成了rtthread.bin文件后,我们可以将该文件放到sd卡上,并修改sd卡中的`config.txt`文件如下: + +``` +enable_uart=1 +arm_64bit=1 +kernel=rtthread.bin +``` + +按上面的方法做好SD卡后,插入树莓派4,通电可以在串口上看到如下所示的输出信息: ```text - heap: 0x00020b20 - 0x00400000 +heap: 0x000c9350 - 0x040c9350 \ | / - RT - Thread Operating System - / | \ 3.1.0 build Aug 23 2019 - 2006 - 2019 Copyright by rt-thread team -Hello RT-Thread! -msh > + / | \ 4.0.3 build Apr 16 2020 + 2006 - 2020 Copyright by rt-thread team +Hi, this is RT-Thread!! +msh /> ``` ## 4. 支持情况 diff --git a/bsp/raspberry-pi/raspi4/rtconfig.py b/bsp/raspberry-pi/raspi4/rtconfig.py index 228ec0176a..9265b016be 100644 --- a/bsp/raspberry-pi/raspi4/rtconfig.py +++ b/bsp/raspberry-pi/raspi4/rtconfig.py @@ -2,7 +2,7 @@ import os # toolchains options ARCH ='aarch64' -CPU ='cortex-a57' +CPU ='cortex-a72' CROSS_TOOL ='gcc' if os.getenv('RTT_ROOT'): diff --git a/libcpu/aarch64/cortex-a57/SConscript b/libcpu/aarch64/cortex-a72/SConscript similarity index 100% rename from libcpu/aarch64/cortex-a57/SConscript rename to libcpu/aarch64/cortex-a72/SConscript diff --git a/libcpu/aarch64/cortex-a57/entry_point.S b/libcpu/aarch64/cortex-a72/entry_point.S similarity index 100% rename from libcpu/aarch64/cortex-a57/entry_point.S rename to libcpu/aarch64/cortex-a72/entry_point.S diff --git a/libcpu/aarch64/cortex-a57/interrupt.c b/libcpu/aarch64/cortex-a72/interrupt.c similarity index 100% rename from libcpu/aarch64/cortex-a57/interrupt.c rename to libcpu/aarch64/cortex-a72/interrupt.c diff --git a/libcpu/aarch64/cortex-a57/interrupt.h b/libcpu/aarch64/cortex-a72/interrupt.h similarity index 100% rename from libcpu/aarch64/cortex-a57/interrupt.h rename to libcpu/aarch64/cortex-a72/interrupt.h diff --git a/libcpu/aarch64/cortex-a57/stack.c b/libcpu/aarch64/cortex-a72/stack.c similarity index 100% rename from libcpu/aarch64/cortex-a57/stack.c rename to libcpu/aarch64/cortex-a72/stack.c diff --git a/libcpu/aarch64/cortex-a57/trap.c b/libcpu/aarch64/cortex-a72/trap.c similarity index 100% rename from libcpu/aarch64/cortex-a57/trap.c rename to libcpu/aarch64/cortex-a72/trap.c From 709e0d5799a57e9904d856fd94a935bd1deb153d Mon Sep 17 00:00:00 2001 From: bigmagic Date: Thu, 16 Apr 2020 18:48:27 +0800 Subject: [PATCH 06/27] add bsp/raspi4 gicv2 --- bsp/raspberry-pi/raspi4/driver/board.c | 7 +- bsp/raspberry-pi/raspi4/driver/iomap.h | 1 + bsp/raspberry-pi/raspi4/rtconfig.py | 2 +- libcpu/aarch64/common/gic/gic_pl400.c | 578 ++++++++++--------------- libcpu/aarch64/common/gic/gic_pl400.h | 76 ++-- libcpu/aarch64/cortex-a72/interrupt.c | 50 ++- 6 files changed, 340 insertions(+), 374 deletions(-) diff --git a/bsp/raspberry-pi/raspi4/driver/board.c b/bsp/raspberry-pi/raspi4/driver/board.c index 9716755b72..46d629a35d 100644 --- a/bsp/raspberry-pi/raspi4/driver/board.c +++ b/bsp/raspberry-pi/raspi4/driver/board.c @@ -75,10 +75,6 @@ void rt_hw_board_init(void) rt_hw_interrupt_init(); // in libcpu/interrupt.c. Set some data structures, no operation on device rt_hw_vector_init(); // in libcpu/interrupt.c. == rt_cpu_vector_set_base((rt_ubase_t)&system_vectors); - /* initialize timer for os tick */ - rt_hw_timer_init(); - rt_thread_idle_sethook(idle_wfi); - /* initialize uart */ rt_hw_uart_init(); // driver/drv_uart.c #ifdef RT_USING_CONSOLE @@ -91,6 +87,9 @@ void rt_hw_board_init(void) rt_kprintf("heap: 0x%08x - 0x%08x\n", RT_HW_HEAP_BEGIN, RT_HW_HEAP_END); rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END); #endif + /* initialize timer for os tick */ + rt_hw_timer_init(); + rt_thread_idle_sethook(idle_wfi); #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); diff --git a/bsp/raspberry-pi/raspi4/driver/iomap.h b/bsp/raspberry-pi/raspi4/driver/iomap.h index 00fc2025d9..675cd147e3 100644 --- a/bsp/raspberry-pi/raspi4/driver/iomap.h +++ b/bsp/raspberry-pi/raspi4/driver/iomap.h @@ -1,6 +1,7 @@ #ifndef __RASPI4_H__ #define __RASPI4_H__ +#define ARM_GIC_NR_IRQS 512 #define INTC_BASE 0xff800000 #define GIC_V2_DISTRIBUTOR_BASE (INTC_BASE + 0x00041000) #define GIC_V2_CPU_INTERFACE_BASE (INTC_BASE + 0x00042000) diff --git a/bsp/raspberry-pi/raspi4/rtconfig.py b/bsp/raspberry-pi/raspi4/rtconfig.py index 9265b016be..a1dd168d3d 100644 --- a/bsp/raspberry-pi/raspi4/rtconfig.py +++ b/bsp/raspberry-pi/raspi4/rtconfig.py @@ -32,7 +32,7 @@ if PLATFORM == 'gcc': OBJDUMP = PREFIX + 'objdump' OBJCPY = PREFIX + 'objcopy' - DEVICE = ' -march=armv8-a -mtune=cortex-a57' + DEVICE = ' -march=armv8-a -mtune=cortex-a72' CFLAGS = DEVICE + ' -Wall' AFLAGS = ' -c' + ' -x assembler-with-cpp -D__ASSEMBLY__' LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,system_vectors -T link.lds' diff --git a/libcpu/aarch64/common/gic/gic_pl400.c b/libcpu/aarch64/common/gic/gic_pl400.c index eb35c5b2a4..4d003a9dcd 100644 --- a/libcpu/aarch64/common/gic/gic_pl400.c +++ b/libcpu/aarch64/common/gic/gic_pl400.c @@ -1,368 +1,262 @@ /* - * Copyright 2014, General Dynamics C4 Systems + * Copyright (c) 2006-2018, RT-Thread Development Team * - * This software may be distributed and modified according to the terms of - * the GNU General Public License version 2. Note that NO WARRANTY is provided. - * See "LICENSE_GPLv2.txt" for details. + * SPDX-License-Identifier: Apache-2.0 * - * @TAG(GD_GPL) + * Change Logs: + * Date Author Notes + * 2013-07-20 Bernard first version + * 2014-04-03 Grissiom many enhancements + * 2018-11-22 Jesven add rt_hw_ipi_send() + * add rt_hw_ipi_handler_install() */ +#include #include "gic_pl400.h" +#include "cp15.h" #include "iomap.h" -#define BIT(n) (1ul<<(n)) -#define MASK(n) (BIT(n)-1ul) +#define ARM_GIC_MAX_NR 1 +struct arm_gic +{ + rt_uint32_t offset; /* the first interrupt index in the vector table */ -/* Setters/getters helpers */ -#define IRQ_REG(IRQ) ((IRQ) / 32) -#define IRQ_BIT(IRQ) BIT((IRQ) % 32) -#define IRQ_MASK MASK(10) -#define IS_IRQ_VALID(X) (((X)&IRQ_MASK) < SPECIAL_IRQ_START) - -#define CPU(X) (1<<(X)) -#define TARGET_CPU_ALLINT(CPU) ( \ - ( ((CPU)&0xff)<<0 ) |\ - ( ((CPU)&0xff)<<8 ) |\ - ( ((CPU)&0xff)<<16 ) |\ - ( ((CPU)&0xff)<<24 ) \ - ) -#define TARGET_CPU0_ALLINT TARGET_CPU_ALLINT(CPU(0)) - - -#define IRQ_SET_ALL 0xffffffff; - -/* Special IRQ's */ -#define SPECIAL_IRQ_START 1020 -#define IRQ_NONE 1023 - -/* Memory map for GIC distributor */ -struct gic_dist_map { - uint32_t enable; /* 0x000 */ - uint32_t ic_type; /* 0x004 */ - uint32_t dist_ident; /* 0x008 */ - uint32_t res1[29]; /* [0x00C, 0x080) */ - - uint32_t group[32]; /* [0x080, 0x100) */ - - uint32_t enable_set[32]; /* [0x100, 0x180) */ - uint32_t enable_clr[32]; /* [0x180, 0x200) */ - uint32_t pending_set[32]; /* [0x200, 0x280) */ - uint32_t pending_clr[32]; /* [0x280, 0x300) */ - uint32_t active[32]; /* [0x300, 0x380) */ - uint32_t active_clr[32]; /* [0x380, 0x400) */ - - uint32_t priority[255]; /* [0x400, 0x7FC) */ - uint32_t res2; /* 0x7FC */ - - uint32_t targets[255]; /* [0x800, 0xBFC) */ - uint32_t res3; /* 0xBFC */ - - uint32_t config[64]; /* [0xC00, 0xD00) */ - - uint32_t ppi_status; /* [0xD00, 0xD04) */ - uint32_t spi_status[15]; /* [0xD04, 0xD40) */ - uint32_t res4[112]; /* [0xD40, 0xF00) */ - - uint32_t sgi_control; /* 0xF00 */ - uint32_t res5[3]; /* [0xF04, 0xF10) */ - uint32_t sgi_pending_clr[4]; /* [0xF10, 0xF20) */ - uint32_t sgi_pending_set[4]; /* [0xF20, 0xF30) */ - uint32_t res10[40]; /* [0xF30, 0xFD0) */ - - uint32_t periph_id[8]; /* [0xFD0, 0xFF0) */ - uint32_t component_id[4]; /* [0xFF0, 0xFFF] */ + rt_uint32_t dist_hw_base; /* the base address of the gic distributor */ + rt_uint32_t cpu_hw_base; /* the base addrees of the gic cpu interface */ }; +/* 'ARM_GIC_MAX_NR' is the number of cores */ +static struct arm_gic _gic_table[ARM_GIC_MAX_NR]; -/* Memory map for GIC cpu interface */ -struct gic_cpu_iface_map { - uint32_t icontrol; /* 0x000 */ - uint32_t pri_msk_c; /* 0x004 */ - uint32_t bp_c; /* 0x008 */ - uint32_t int_ack; /* 0x00C */ - uint32_t eoi; /* 0x010 */ - uint32_t run_priority; /* 0x014 */ - uint32_t hi_pend; /* 0x018 */ - uint32_t ns_alias_bp_c; /* 0x01C */ - uint32_t ns_alias_ack; /* 0x020 GIC_PL400 only */ - uint32_t ns_alias_eoi; /* 0x024 GIC_PL400 only */ - uint32_t ns_alias_hi_pend; /* 0x028 GIC_PL400 only */ +static unsigned int _gic_max_irq; - uint32_t res1[41]; /* [0x02C, 0x0D0) */ - uint32_t active_priority[4]; /* [0x0D0, 0xC0] GIC_PL400 only */ - uint32_t ns_active_priority[4]; /* [0xE0,0xF0] GIC_PL400 only */ - uint32_t res4[3]; /* [0xF0, 0xFC] */ - - uint32_t cpu_if_ident; /* 0x0FC */ - uint32_t deactive; /* [0x1000] */ -}; - -volatile struct gic_dist_map *gic_dist = - (volatile struct gic_dist_map*)(GIC_PL400_DISTRIBUTOR_PPTR); - -volatile struct gic_cpu_iface_map *gic_cpuiface = - (volatile struct gic_cpu_iface_map*)(GIC_PL400_CONTROLLER_PPTR); - -/* Helpers */ -static inline int -is_irq_pending(irq_t irq) +int arm_gic_get_active_irq(rt_uint32_t index) { - int word = irq / 32; - int bit = irq & 0x1f; - return !!(gic_dist->pending_set[word] & BIT(bit)); -} + int irq; -static inline int -is_irq_active(irq_t irq) -{ - int word = irq / 32; - int bit = irq & 0x1f; - return !!(gic_dist->active[word] & BIT(bit)); -} - -static inline int -is_irq_enabled(irq_t irq) -{ - int word = irq / 32; - int bit = irq & 0x1f; - return !!(gic_dist->enable_set[word] & BIT(bit)); -} - -static inline int -is_irq_edge_triggered(irq_t irq) -{ - int word = irq / 16; - int bit = ((irq & 0xf) * 2); - return !!(gic_dist->config[word] & BIT(bit + 1)); -} - -static inline int -is_irq_1_N(irq_t irq) -{ - int word = irq / 16; - int bit = ((irq & 0xf) * 2); - return !!(gic_dist->config[word] & BIT(bit + 0)); -} - -static inline int -is_irq_N_N(irq_t irq) -{ - return !(is_irq_1_N(irq)); -} - -static inline void -dist_pending_clr(irq_t irq) -{ - int word = irq / 32; - int bit = irq & 0x1f; - /* Using |= here is detrimental to your health */ - gic_dist->pending_clr[word] = BIT(bit); -} - -static inline void -dist_pending_set(irq_t irq) -{ - int word = irq / 32; - int bit = irq & 0x1f; - gic_dist->pending_set[word] = BIT(bit); -} - -static inline void -dist_enable_clr(irq_t irq) -{ - int word = irq / 32; - int bit = irq & 0x1f; - /* Using |= here is detrimental to your health */ - gic_dist->enable_clr[word] = BIT(bit); -} - -static inline void -dist_enable_set(irq_t irq) -{ - int word = irq / 32; - int bit = irq & 0x1f; - gic_dist->enable_set[word] = BIT(bit); -} - -/** - DONT_TRANSLATE - */ -static void dist_init(void) -{ - int i; - int nirqs = 32 * ((gic_dist->ic_type & 0x1f) + 1); - gic_dist->enable = 0; - -#if 0 - /* configure to group 0 for security */ - for (i = 0; i < nirqs; i += 32) { - gic_dist->group[i / 32] = 0xffffffff; - } -#endif - - for (i = 0; i < nirqs; i += 32) { - /* disable */ - gic_dist->enable_clr[i / 32] = IRQ_SET_ALL; - /* clear pending */ - gic_dist->pending_clr[i / 32] = IRQ_SET_ALL; - } - - /* reset interrupts priority */ - for (i = 32; i < nirqs; i += 4) { - gic_dist->priority[i / 4] = 0x0; - } - - /* - * reset int target to cpu 0 - * (Should really query which processor we're running on and use that) - */ - for (i = 0; i < nirqs; i += 4) { - gic_dist->targets[i / 4] = TARGET_CPU0_ALLINT; - } - - /* level-triggered, 1-N */ - for (i = 64; i < nirqs; i += 32) { - gic_dist->config[i / 32] = 0; - //gic_dist->config[i / 32] = 0x55555555; - } - /* enable the int controller */ - gic_dist->enable = 1; -} - -/** - DONT_TRANSLATE - */ -static void cpu_iface_init(void) -{ - uint32_t i; - - /* For non-Exynos4, the registers are banked per CPU, need to clear them */ - gic_dist->enable_clr[0] = IRQ_SET_ALL; - gic_dist->pending_clr[0] = IRQ_SET_ALL; - gic_dist->priority[0] = 0x00; - /* put everything in group 0 */ - - /* clear any software generated interrupts */ - for (i = 0; i < 16; i += 4) { - gic_dist->sgi_pending_clr[i / 4] = IRQ_SET_ALL; - } - - gic_cpuiface->icontrol = 0; - gic_cpuiface->pri_msk_c = 0x000000f0; - gic_cpuiface->bp_c = 0x00000003; - - while (((i = gic_cpuiface->int_ack) & IRQ_MASK) != IRQ_NONE) { - gic_cpuiface->eoi = i; - } - gic_cpuiface->icontrol = 0x1; -} - -/** - DONT_TRANSLATE - */ -void initIRQController(void) -{ - dist_init(); - cpu_iface_init(); -} - - - -/* - * The only sane way to get an GIC IRQ number that can be properly - * ACKED later is through the int_ack register. Unfortunately, reading - * this register changes the interrupt state to pending so future - * reads will not return the same value For this reason, we have a - * global variable to store the IRQ number. - */ -static uint32_t active_irq = IRQ_NONE; - -/** - DONT_TRANSLATE - */ -interrupt_t -getActiveIRQ(void) -{ - uint32_t irq; - if (!IS_IRQ_VALID(active_irq)) { - active_irq = gic_cpuiface->int_ack; - } - - if (IS_IRQ_VALID(active_irq)) { - irq = active_irq & IRQ_MASK; - } else { - irq = 1023; - } + RT_ASSERT(index < ARM_GIC_MAX_NR); + irq = GIC_CPU_INTACK(_gic_table[index].cpu_hw_base); + irq += _gic_table[index].offset; return irq; } -/* - * GIC has 4 states: pending->active(+pending)->inactive - * seL4 expects two states: active->inactive. - * We ignore the active state in GIC to conform - */ -/** - DONT_TRANSLATE - */ -bool_t -isIRQPending(void) +void arm_gic_ack(rt_uint32_t index, int irq) { - return IS_IRQ_VALID(gic_cpuiface->hi_pend); + rt_uint32_t mask = 1 << (irq % 32); + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0); + + GIC_DIST_ENABLE_CLEAR(_gic_table[index].dist_hw_base, irq) = mask; + GIC_CPU_EOI(_gic_table[index].cpu_hw_base) = irq; + GIC_DIST_ENABLE_SET(_gic_table[index].dist_hw_base, irq) = mask; } - -/** - DONT_TRANSLATE - */ -void -maskInterrupt(bool_t disable, interrupt_t irq) +void arm_gic_mask(rt_uint32_t index, int irq) { - if (disable) { - dist_enable_clr(irq); - } else { - dist_enable_set(irq); + rt_uint32_t mask = 1 << (irq % 32); + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0); + + GIC_DIST_ENABLE_CLEAR(_gic_table[index].dist_hw_base, irq) = mask; +} + +void arm_gic_clear_pending(rt_uint32_t index, int irq) +{ + rt_uint32_t mask = 1 << (irq % 32); + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0); + + GIC_DIST_PENDING_CLEAR(_gic_table[index].dist_hw_base, irq) = mask; +} + +void arm_gic_clear_active(rt_uint32_t index, int irq) +{ + rt_uint32_t mask = 1 << (irq % 32); + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0); + + GIC_DIST_ACTIVE_CLEAR(_gic_table[index].dist_hw_base, irq) = mask; +} + +/* Set up the cpu mask for the specific interrupt */ +void arm_gic_set_cpu(rt_uint32_t index, int irq, unsigned int cpumask) +{ + rt_uint32_t old_tgt; + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0); + + old_tgt = GIC_DIST_TARGET(_gic_table[index].dist_hw_base, irq); + + old_tgt &= ~(0x0FFUL << ((irq % 4)*8)); + old_tgt |= cpumask << ((irq % 4)*8); + + GIC_DIST_TARGET(_gic_table[index].dist_hw_base, irq) = old_tgt; +} + +void arm_gic_umask(rt_uint32_t index, int irq) +{ + rt_uint32_t mask = 1 << (irq % 32); + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0); + + GIC_DIST_ENABLE_SET(_gic_table[index].dist_hw_base, irq) = mask; +} + +void arm_gic_dump_type(rt_uint32_t index) +{ + unsigned int gic_type; + + gic_type = GIC_DIST_TYPE(_gic_table[index].dist_hw_base); + rt_kprintf("GICv%d on %p, max IRQs: %d, %s security extension(%08x)\n", + (GIC_DIST_ICPIDR2(_gic_table[index].dist_hw_base) >> 4) & 0xf, + _gic_table[index].dist_hw_base, + _gic_max_irq, + gic_type & (1 << 10) ? "has" : "no", + gic_type); +} + +void arm_gic_dump(rt_uint32_t index) +{ + unsigned int i, k; + + k = GIC_CPU_HIGHPRI(_gic_table[index].cpu_hw_base); + rt_kprintf("--- high pending priority: %d(%08x)\n", k, k); + rt_kprintf("--- hw mask ---\n"); + for (i = 0; i < _gic_max_irq / 32; i++) + { + rt_kprintf("0x%08x, ", + GIC_DIST_ENABLE_SET(_gic_table[index].dist_hw_base, + i * 32)); + } + rt_kprintf("\n--- hw pending ---\n"); + for (i = 0; i < _gic_max_irq / 32; i++) + { + rt_kprintf("0x%08x, ", + GIC_DIST_PENDING_SET(_gic_table[index].dist_hw_base, + i * 32)); + } + rt_kprintf("\n--- hw active ---\n"); + for (i = 0; i < _gic_max_irq / 32; i++) + { + rt_kprintf("0x%08x, ", + GIC_DIST_ACTIVE_SET(_gic_table[index].dist_hw_base, + i * 32)); + } + rt_kprintf("\n"); +} +#ifdef RT_USING_FINSH +#include +FINSH_FUNCTION_EXPORT_ALIAS(arm_gic_dump, gic, show gic status); +#endif + +int arm_gic_dist_init(rt_uint32_t index, rt_uint32_t dist_base, int irq_start) +{ + unsigned int gic_type, i; + rt_uint32_t cpumask = 1 << 0; + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + _gic_table[index].dist_hw_base = dist_base; + _gic_table[index].offset = irq_start; + + /* Find out how many interrupts are supported. */ + gic_type = GIC_DIST_TYPE(dist_base); + _gic_max_irq = ((gic_type & 0x1f) + 1) * 32; + + /* + * The GIC only supports up to 1020 interrupt sources. + * Limit this to either the architected maximum, or the + * platform maximum. + */ + if (_gic_max_irq > 1020) + _gic_max_irq = 1020; + if (_gic_max_irq > ARM_GIC_NR_IRQS) /* the platform maximum interrupts */ + _gic_max_irq = ARM_GIC_NR_IRQS; + + cpumask |= cpumask << 8; + cpumask |= cpumask << 16; + cpumask |= cpumask << 24; + + GIC_DIST_CTRL(dist_base) = 0x0; + + /* Set all global interrupts to be level triggered, active low. */ + for (i = 32; i < _gic_max_irq; i += 16) + GIC_DIST_CONFIG(dist_base, i) = 0x0; + + /* Set all global interrupts to this CPU only. */ + for (i = 32; i < _gic_max_irq; i += 4) + GIC_DIST_TARGET(dist_base, i) = cpumask; + + /* Set priority on all interrupts. */ + for (i = 0; i < _gic_max_irq; i += 4) + GIC_DIST_PRI(dist_base, i) = 0xa0a0a0a0; + + /* Disable all interrupts. */ + for (i = 0; i < _gic_max_irq; i += 32) + GIC_DIST_ENABLE_CLEAR(dist_base, i) = 0xffffffff; + +#if 0 + /* All interrupts defaults to IGROUP1(IRQ). */ + for (i = 0; i < _gic_max_irq; i += 32) + GIC_DIST_IGROUP(dist_base, i) = 0xffffffff; +#endif + for (i = 0; i < _gic_max_irq; i += 32) + GIC_DIST_IGROUP(dist_base, i) = 0; + + /* Enable group0 and group1 interrupt forwarding. */ + GIC_DIST_CTRL(dist_base) = 0x01; + + return 0; +} + +int arm_gic_cpu_init(rt_uint32_t index, rt_uint32_t cpu_base) +{ + RT_ASSERT(index < ARM_GIC_MAX_NR); + + _gic_table[index].cpu_hw_base = cpu_base; + + GIC_CPU_PRIMASK(cpu_base) = 0xf0; + GIC_CPU_BINPOINT(cpu_base) = 0x7; + /* Enable CPU interrupt */ + GIC_CPU_CTRL(cpu_base) = 0x01; + + return 0; +} + +void arm_gic_set_group(rt_uint32_t index, int vector, int group) +{ + /* As for GICv2, there are only group0 and group1. */ + RT_ASSERT(group <= 1); + RT_ASSERT(vector < _gic_max_irq); + + if (group == 0) + { + GIC_DIST_IGROUP(_gic_table[index].dist_hw_base, + vector) &= ~(1 << (vector % 32)); + } + else if (group == 1) + { + GIC_DIST_IGROUP(_gic_table[index].dist_hw_base, + vector) |= (1 << (vector % 32)); } } -/** - DONT_TRANSLATE - */ -void -ackInterrupt(irq_t irq) -{ - if (!(IS_IRQ_VALID(active_irq) && (active_irq & IRQ_MASK) == irq)) { - return; - } - if (is_irq_edge_triggered(irq)) { - dist_pending_clr(irq); - } - gic_cpuiface->eoi = active_irq; - active_irq = IRQ_NONE; -} - -void -handleSpuriousIRQ(void) -{ -} - -void rt_hw_interrupt_mask(int vector) -{ - maskInterrupt(1, vector); -} - -void rt_hw_interrupt_umask(int vector) -{ - maskInterrupt(0, vector); -} - -int rt_hw_interrupt_get_irq(void) -{ - return getActiveIRQ(); -} - -void rt_hw_interrupt_ack(int fiq_irq) -{ - return ackInterrupt(fiq_irq); -} diff --git a/libcpu/aarch64/common/gic/gic_pl400.h b/libcpu/aarch64/common/gic/gic_pl400.h index a43583bd7c..fa20846ea2 100644 --- a/libcpu/aarch64/common/gic/gic_pl400.h +++ b/libcpu/aarch64/common/gic/gic_pl400.h @@ -1,35 +1,61 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2013-07-20 Bernard first version + */ -#ifndef __ARCH_MACHINE_GIC_PL400_H -#define __ARCH_MACHINE_GIC_PL400_H +#ifndef __GIC_PL400_H__ +#define __GIC_PL400_H__ -#include +#include +#include -typedef uint16_t interrupt_t; -typedef uint16_t irq_t; -typedef uint64_t bool_t; +#define __REG32(x) (*((volatile unsigned int*)((rt_uint64_t)x))) -/** MODIFIES: [*] */ -interrupt_t getActiveIRQ(void); -/** MODIFIES: [*] */ -interrupt_t getPendingIRQ(void); -/** MODIFIES: [*] */ -bool_t isIRQPending(void); -/** MODIFIES: [*] */ -void maskInterrupt(bool_t disable, interrupt_t irq); -/** MODIFIES: [*] */ -void ackInterrupt(irq_t irq); -/** MODIFIES: [*] */ -static inline void setInterruptMode(irq_t irq, bool_t levelTrigger, bool_t polarityLow) { } +#define GIC_CPU_CTRL(hw_base) __REG32((hw_base) + 0x00) +#define GIC_CPU_PRIMASK(hw_base) __REG32((hw_base) + 0x04) +#define GIC_CPU_BINPOINT(hw_base) __REG32((hw_base) + 0x08) +#define GIC_CPU_INTACK(hw_base) __REG32((hw_base) + 0x0c) +#define GIC_CPU_EOI(hw_base) __REG32((hw_base) + 0x10) +#define GIC_CPU_RUNNINGPRI(hw_base) __REG32((hw_base) + 0x14) +#define GIC_CPU_HIGHPRI(hw_base) __REG32((hw_base) + 0x18) -/** MODIFIES: [*] */ -void initIRQController(void); +#define GIC_DIST_CTRL(hw_base) __REG32((hw_base) + 0x000) +#define GIC_DIST_TYPE(hw_base) __REG32((hw_base) + 0x004) +#define GIC_DIST_IGROUP(hw_base, n) __REG32((hw_base) + 0x080 + ((n)/32) * 4) +#define GIC_DIST_ENABLE_SET(hw_base, n) __REG32((hw_base) + 0x100 + ((n)/32) * 4) +#define GIC_DIST_ENABLE_CLEAR(hw_base, n) __REG32((hw_base) + 0x180 + ((n)/32) * 4) +#define GIC_DIST_PENDING_SET(hw_base, n) __REG32((hw_base) + 0x200 + ((n)/32) * 4) +#define GIC_DIST_PENDING_CLEAR(hw_base, n) __REG32((hw_base) + 0x280 + ((n)/32) * 4) +#define GIC_DIST_ACTIVE_SET(hw_base, n) __REG32((hw_base) + 0x300 + ((n)/32) * 4) +#define GIC_DIST_ACTIVE_CLEAR(hw_base, n) __REG32((hw_base) + 0x380 + ((n)/32) * 4) +#define GIC_DIST_PRI(hw_base, n) __REG32((hw_base) + 0x400 + ((n)/4) * 4) +#define GIC_DIST_TARGET(hw_base, n) __REG32((hw_base) + 0x800 + ((n)/4) * 4) +#define GIC_DIST_CONFIG(hw_base, n) __REG32((hw_base) + 0xc00 + ((n)/16) * 4) +#define GIC_DIST_SOFTINT(hw_base) __REG32((hw_base) + 0xf00) +#define GIC_DIST_CPENDSGI(hw_base, n) __REG32((hw_base) + 0xf10 + ((n)/4) * 4) +#define GIC_DIST_ICPIDR2(hw_base) __REG32((hw_base) + 0xfe8) -void handleSpuriousIRQ(void); +int arm_gic_dist_init(rt_uint32_t index, rt_uint32_t dist_base, int irq_start); +int arm_gic_cpu_init(rt_uint32_t index, rt_uint32_t cpu_base); -void rt_hw_interrupt_umask(int vector); +void arm_gic_mask(rt_uint32_t index, int irq); +void arm_gic_umask(rt_uint32_t index, int irq); +void arm_gic_set_cpu(rt_uint32_t index, int irq, unsigned int cpumask); +void arm_gic_set_group(rt_uint32_t index, int vector, int group); -int rt_hw_interrupt_get_irq(void); +int arm_gic_get_active_irq(rt_uint32_t index); +void arm_gic_ack(rt_uint32_t index, int irq); -void rt_hw_interrupt_ack(int fiq_irq); -#endif /* !__ARCH_MACHINE_GIC400_H */ +void arm_gic_clear_active(rt_uint32_t index, int irq); +void arm_gic_clear_pending(rt_uint32_t index, int irq); + +void arm_gic_dump_type(rt_uint32_t index); +void arm_gic_dump(rt_uint32_t index); + +#endif diff --git a/libcpu/aarch64/cortex-a72/interrupt.c b/libcpu/aarch64/cortex-a72/interrupt.c index d770259d61..6fec968dc2 100644 --- a/libcpu/aarch64/cortex-a72/interrupt.c +++ b/libcpu/aarch64/cortex-a72/interrupt.c @@ -13,8 +13,10 @@ #include #include #include +#include "iomap.h" #define MAX_HANDLERS 256 +#define GIC_ACK_INTID_MASK 0x000003ff #ifdef RT_USING_SMP #define rt_interrupt_nest rt_cpu_self()->irq_nest @@ -41,7 +43,15 @@ void rt_hw_vector_init(void) */ void rt_hw_interrupt_init(void) { - initIRQController(); + + rt_uint32_t gic_cpu_base = 0; + rt_uint32_t gic_dist_base = 0; + + /* initialize ARM GIC */ + gic_dist_base = GIC_PL400_DISTRIBUTOR_PPTR; + gic_cpu_base = GIC_PL400_CONTROLLER_PPTR; + arm_gic_dist_init(0, gic_dist_base, 0); + arm_gic_cpu_init(0, gic_cpu_base); } /** @@ -70,4 +80,40 @@ rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler, } return old_handler; -} \ No newline at end of file +} + +/** + * This function will mask a interrupt. + * @param vector the interrupt number + */ +void rt_hw_interrupt_mask(int vector) +{ + arm_gic_mask(0, vector); +} + +/** + * This function will un-mask a interrupt. + * @param vector the interrupt number + */ +void rt_hw_interrupt_umask(int vector) +{ + arm_gic_umask(0, vector); +} + +/** + * This function returns the active interrupt number. + * @param none + */ +int rt_hw_interrupt_get_irq(void) +{ + return arm_gic_get_active_irq(0) & GIC_ACK_INTID_MASK; +} + +/** + * This function acknowledges the interrupt. + * @param vector the interrupt number + */ +void rt_hw_interrupt_ack(int vector) +{ + arm_gic_ack(0, vector); +} From 8a965bce46293b5e8dacaba58dd65976f988c3a7 Mon Sep 17 00:00:00 2001 From: David Lin Date: Fri, 17 Apr 2020 17:09:57 +0800 Subject: [PATCH 07/27] Update kernel.h thead -> thread --- documentation/doxygen/kernel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/doxygen/kernel.h b/documentation/doxygen/kernel.h index b54144780b..527ce835f0 100644 --- a/documentation/doxygen/kernel.h +++ b/documentation/doxygen/kernel.h @@ -87,7 +87,7 @@ * priority would get the resource. * * RT-Thread operating systems supports event/fast event, mail box and message queue. - * - The event mechanism is used to awake a thead by setting one or more corresponding + * - The event mechanism is used to awake a thread by setting one or more corresponding * bit of a binary number when an event ocurs. * - The fast event supports event thread queue. Once a one bit event occurs, the corresponding * blocked thread can be found out timing accurately, then will be waked up. From 8e57dcb723071b37e09a06decddc16569ae79a77 Mon Sep 17 00:00:00 2001 From: David Lin Date: Fri, 17 Apr 2020 18:39:04 +0800 Subject: [PATCH 08/27] Update tcpsendpacket.c --- examples/network/tcpsendpacket.c | 37 +++++++++++++++++++------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/examples/network/tcpsendpacket.c b/examples/network/tcpsendpacket.c index 75134c19a2..462de6000d 100644 --- a/examples/network/tcpsendpacket.c +++ b/examples/network/tcpsendpacket.c @@ -1,7 +1,7 @@ #include -#include /* Ϊ˽Ҫnetdb.hͷļ */ -#include /* ʹBSD socketҪsocket.hͷļ */ +#include /* 为了解析主机名,需要包含netdb.h头文件 */ +#include /* 使用BSD socket,需要包含socket.h头文件 */ void tcp_senddata(const char *url, int port, int length) { @@ -10,45 +10,52 @@ void tcp_senddata(const char *url, int port, int length) struct sockaddr_in server_addr; rt_uint8_t *buffer_ptr; - /* ͨڲurlhostַ */ + /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */ host = gethostbyname(url); - /* һsocketSOCKET_STREAMTCP */ + /* 创建一个socket,类型是SOCKET_STREAM,TCP类型 */ if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { - /* socketʧ */ + /* 创建socket失败 */ rt_kprintf("Socket error\n"); return; } - /* ڴ */ + /* 申请内存 */ buffer_ptr = rt_malloc(length); - /* 췢 */ + if(RT_NULL == buffer_ptr) + { + /* 申请内存失败 */ + rt_kprintf("Not enough memory\n"); + return; + } + + /* 构造发送数据 */ for (index = 0; index < length; index ++) buffer_ptr[index] = index & 0xff; timeout = 100; - /* ÷ͳʱʱ100ms */ + /* 设置发送超时时间100ms */ setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)); - /* ʼԤӵķ˵ַ */ + /* 初始化预连接的服务端地址 */ server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr = *((struct in_addr *)host->h_addr); rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero)); - /* ӵ */ + /* 连接到服务端 */ err = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); rt_kprintf("TCP thread connect error code: %d\n", err); while (1) { - /* ݵsock */ + /* 发送数据到sock连接 */ result = send(sock, buffer_ptr, length, MSG_DONTWAIT); - if (result < 0) //ݷʹ + if (result < 0) //数据发送错误处理 { rt_kprintf("TCP thread send error: %d\n", result); closesocket(sock); - /* رӣ´ */ + /* 关闭连接,重新创建连接 */ rt_thread_delay(10); if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) @@ -59,7 +66,7 @@ void tcp_senddata(const char *url, int port, int length) } else if (result == 0) { - /* ӡsendֵΪ0ľϢ */ + /* 打印send函数返回值为0的警告信息 */ rt_kprintf("\n Send warning,send function return 0.\r\n"); } } @@ -67,7 +74,7 @@ void tcp_senddata(const char *url, int port, int length) #ifdef RT_USING_FINSH #include -/* tcpclientfinsh shell */ +/* 输出tcpclient函数到finsh shell中 */ FINSH_FUNCTION_EXPORT(tcp_senddata, send a packet through tcp connection); #endif From 993835b5ed834e1ab49e637bcac22019b9bc461b Mon Sep 17 00:00:00 2001 From: David Lin Date: Fri, 17 Apr 2020 18:44:15 +0800 Subject: [PATCH 09/27] Update tcpsendpacket.c --- examples/network/tcpsendpacket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/network/tcpsendpacket.c b/examples/network/tcpsendpacket.c index 462de6000d..47bb562506 100644 --- a/examples/network/tcpsendpacket.c +++ b/examples/network/tcpsendpacket.c @@ -25,7 +25,7 @@ void tcp_senddata(const char *url, int port, int length) if(RT_NULL == buffer_ptr) { /* 申请内存失败 */ - rt_kprintf("Not enough memory\n"); + rt_kprintf("No memory\n"); return; } From 90f41ef8a2a9e7f71343be12d2f73122e17b1fc2 Mon Sep 17 00:00:00 2001 From: David Lin Date: Fri, 17 Apr 2020 19:12:18 +0800 Subject: [PATCH 10/27] Update start_gcc.S --- libcpu/arm/s3c24x0/start_gcc.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcpu/arm/s3c24x0/start_gcc.S b/libcpu/arm/s3c24x0/start_gcc.S index 4adc458094..cc2b2f6310 100644 --- a/libcpu/arm/s3c24x0/start_gcc.S +++ b/libcpu/arm/s3c24x0/start_gcc.S @@ -191,7 +191,7 @@ reset: copy_loop: ldmia r0!, {r3-r10} /* copy from source address [r0] */ stmia r1!, {r3-r10} /* copy to target address [r1] */ - cmp r0, r2 /* until source end addreee [r2] */ + cmp r0, r2 /* until source end address [r2] */ ble copy_loop /* setup stack */ From 5e507448ee71499aa1fbaa1f273372318f569331 Mon Sep 17 00:00:00 2001 From: David Lin Date: Fri, 17 Apr 2020 19:18:52 +0800 Subject: [PATCH 11/27] Update start_gcc.S --- libcpu/arm/s3c44b0/start_gcc.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcpu/arm/s3c44b0/start_gcc.S b/libcpu/arm/s3c44b0/start_gcc.S index 65b3d422dd..4c448a344f 100644 --- a/libcpu/arm/s3c44b0/start_gcc.S +++ b/libcpu/arm/s3c44b0/start_gcc.S @@ -107,7 +107,7 @@ reset: copy_loop: ldmia r0!, {r3-r10} /* copy from source address [r0] */ stmia r1!, {r3-r10} /* copy to target address [r1] */ - cmp r0, r2 /* until source end addreee [r2] */ + cmp r0, r2 /* until source end address [r2] */ ble copy_loop #endif From ee4cabe69f90cd2bde042d7d8d114e420b09319f Mon Sep 17 00:00:00 2001 From: Huaqi Fang <578567190@qq.com> Date: Fri, 17 Apr 2020 21:07:29 +0800 Subject: [PATCH 12/27] [BSP][Nuclei] Add Nuclei RISC-V Processor support * Nuclei RISC-V Processor support is added both RV32 and RV64 * Nuclei RVSTAR BSP is added, UART driver is added * MSH works well in RVSTAR board --------------------------- Squashed commit of the following: commit b7368bc2ed725c42f9adc297d0e9cf3ed706a520 Author: Huaqi Fang <578567190@qq.com> Date: Fri Apr 17 14:38:54 2020 +0800 [BSP][Nuclei] Pretty source code Signed-off-by: Huaqi Fang <578567190@qq.com> commit 2c42a997f7b5d8aa53bdaf19ccb30596091a112d Author: Huaqi Fang <578567190@qq.com> Date: Thu Apr 16 15:51:03 2020 +0800 [libcpu] Remove ARCH_NUCLEI in libcpu kconfig Signed-off-by: Huaqi Fang <578567190@qq.com> commit 915ad4c076ff3d7cebda896537605e7f7939b7af Author: Huaqi Fang <578567190@qq.com> Date: Thu Apr 16 15:50:00 2020 +0800 [BSP][Nuclei] Remove ARCH_NUCLEI in bsp KConfig Signed-off-by: Huaqi Fang <578567190@qq.com> commit fe43869c79675a25669447d57ea5d77385e07ca5 Author: Huaqi Fang <578567190@qq.com> Date: Wed Apr 15 12:43:20 2020 +0800 [BSP][NUCLEI] Simply application main.c Remove previous complicated application of gd32vf103_rvstar Signed-off-by: Huaqi Fang <578567190@qq.com> commit 8fd31727bc7ff51c83a3c47840cff1bfb100c0ba Author: Huaqi Fang <578567190@qq.com> Date: Wed Apr 15 12:38:04 2020 +0800 [BSP][NUCLEI] Format application and board source code Signed-off-by: Huaqi Fang <578567190@qq.com> commit b432308b20cdf24dfcc1398511d1d83bce6a9df2 Author: Huaqi Fang <578567190@qq.com> Date: Wed Apr 15 11:58:28 2020 +0800 [BSP][Nuclei] Format source code of drivers of gd32vf103 Signed-off-by: Huaqi Fang <578567190@qq.com> commit 7366173d749d8a51ed8d48eca09007d27aee8ad8 Author: Huaqi Fang <578567190@qq.com> Date: Wed Apr 15 11:54:02 2020 +0800 [LIBCPU][NUCLEI] Optimize nuclei cpu portable code Signed-off-by: Huaqi Fang <578567190@qq.com> commit 8c2cd4745b7279a6721946d119441bbf7fd1a9c2 Author: Huaqi Fang <578567190@qq.com> Date: Tue Apr 14 15:45:42 2020 +0800 nuclei: Update README.md Signed-off-by: Huaqi Fang <578567190@qq.com> commit fa8a2f24ea5e4dbce714ffda16c1ce558e5b5ddb Author: Huaqi Fang <578567190@qq.com> Date: Tue Apr 14 14:06:54 2020 +0800 nuclei: Add gpio driver not tested Signed-off-by: Huaqi Fang <578567190@qq.com> commit 1be40bc50be43dfcdd105291bd24355498f9fef3 Author: Huaqi Fang <578567190@qq.com> Date: Thu Apr 9 14:55:22 2020 +0800 Nuclei: Update README.md Signed-off-by: Huaqi Fang <578567190@qq.com> commit 4c8beb204b7ee3e38c04e1f23a1f7e4ce48aa196 Author: Huaqi Fang <578567190@qq.com> Date: Thu Apr 9 10:20:25 2020 +0800 Nuclei: Change idle stack size from 256 to 396 bytes If changed to 396 bytes, then debug optimization level changed from O2 to O0, and the application can run successfully without stack overflow issue of tidle0 task warning: tidle0 stack is close to end of stack address. Signed-off-by: Huaqi Fang <578567190@qq.com> commit da2bcf5c56ef32b611405a8e591ecd3f1e598b11 Author: Huaqi Fang <578567190@qq.com> Date: Thu Apr 9 10:11:40 2020 +0800 nuclei: Remove unused kconfig Signed-off-by: Huaqi Fang <578567190@qq.com> commit 0b932c677a7934d60e70da141744790aec202ef6 Author: Huaqi Fang <578567190@qq.com> Date: Thu Apr 9 09:32:22 2020 +0800 nuclei: optimize drivers support Signed-off-by: Huaqi Fang <578567190@qq.com> commit 0431f6f01f6efab2900de552abede83639415431 Author: Huaqi Fang <578567190@qq.com> Date: Wed Apr 8 19:28:02 2020 +0800 tools: Update mkdist.py for nuclei bsp Signed-off-by: Huaqi Fang <578567190@qq.com> commit 0e1f502edfddff93a4a66c041be68560ef4828eb Author: Huaqi Fang <578567190@qq.com> Date: Wed Apr 8 18:46:58 2020 +0800 nuclei: optimize rvstar support directory Signed-off-by: Huaqi Fang <578567190@qq.com> commit 1131f6e6483d8f2fbafe07f4e598fc8f802ee85d Author: Huaqi Fang <578567190@qq.com> Date: Wed Apr 8 18:37:24 2020 +0800 nuclei: update kconfig Signed-off-by: Huaqi Fang <578567190@qq.com> commit ad81c1d3bf9d80d2b561c94e903e7ce4ca2c68c6 Author: Huaqi Fang <578567190@qq.com> Date: Wed Apr 8 15:43:00 2020 +0800 nuclei: Rename board name Signed-off-by: Huaqi Fang <578567190@qq.com> commit d780138a1abf5da5097cc89e6a428ebeae06f284 Author: Huaqi Fang <578567190@qq.com> Date: Tue Apr 7 09:36:19 2020 +0800 libcpu: Add Nuclei arch option in KConfig Signed-off-by: Huaqi Fang <578567190@qq.com> commit 60320d34b1d88315efe1b566fd6bc75c69851f06 Author: Huaqi Fang <578567190@qq.com> Date: Fri Apr 3 16:51:01 2020 +0800 nuclei: Update nuclei sdk of rt-thread support Signed-off-by: Huaqi Fang <578567190@qq.com> commit a042b806efe0ea3bc9dba80ebc7696e5941ba35f Author: Huaqi Fang <578567190@qq.com> Date: Fri Apr 3 11:34:09 2020 +0800 nuclei: modify application for not print anything Signed-off-by: Huaqi Fang <578567190@qq.com> commit 2a9603adcb584b29886a2b93ded2473f4e8bffb1 Author: Huaqi Fang <578567190@qq.com> Date: Fri Apr 3 11:31:01 2020 +0800 nuclei: Add .gitignore for nuclei bsp Signed-off-by: Huaqi Fang <578567190@qq.com> commit 34aaf6aebae75c3ee9d38cc17e6bdb826ed9e357 Author: Huaqi Fang <578567190@qq.com> Date: Fri Apr 3 11:28:06 2020 +0800 nuclei_sdk: update link script of rvstar to contain rt-thread needed sections /* section information for finsh shell */ . = ALIGN(4); __fsymtab_start = .; KEEP(*(FSymTab)) __fsymtab_end = .; . = ALIGN(4); __vsymtab_start = .; KEEP(*(VSymTab)) __vsymtab_end = .; /* section information for initial. */ . = ALIGN(4); __rt_init_start = .; KEEP(*(SORT(.rti_fn*))) __rt_init_end = .; The above code placed in rodata section Signed-off-by: Huaqi Fang <578567190@qq.com> commit 3451466e9d8da3c3c8a631be69f3c7a5e6220c21 Author: Huaqi Fang <578567190@qq.com> Date: Fri Apr 3 10:04:42 2020 +0800 bsp: Add initial commit of nuclei rvstar board bsp Signed-off-by: Huaqi Fang <578567190@qq.com> Signed-off-by: Huaqi Fang <578567190@qq.com> --- bsp/nuclei/.gitignore | 26 + bsp/nuclei/gd32vf103_rvstar/.config | 453 +++++++++++++++ bsp/nuclei/gd32vf103_rvstar/Kconfig | 28 + bsp/nuclei/gd32vf103_rvstar/README.md | 209 +++++++ bsp/nuclei/gd32vf103_rvstar/SConscript | 17 + bsp/nuclei/gd32vf103_rvstar/SConstruct | 85 +++ .../gd32vf103_rvstar/applications/SConscript | 11 + .../gd32vf103_rvstar/applications/main.c | 19 + bsp/nuclei/gd32vf103_rvstar/board/Kconfig | 47 ++ bsp/nuclei/gd32vf103_rvstar/board/SConscript | 11 + bsp/nuclei/gd32vf103_rvstar/board/board.c | 67 +++ bsp/nuclei/gd32vf103_rvstar/board/board.h | 21 + bsp/nuclei/gd32vf103_rvstar/rtconfig.h | 181 ++++++ bsp/nuclei/gd32vf103_rvstar/rtconfig.py | 58 ++ .../gd32vf103/HAL_Drivers/SConscript | 21 + .../gd32vf103/HAL_Drivers/drv_config.h | 26 + .../gd32vf103/HAL_Drivers/drv_gpio.c | 520 ++++++++++++++++++ .../gd32vf103/HAL_Drivers/drv_gpio.h | 51 ++ .../gd32vf103/HAL_Drivers/drv_usart.c | 347 ++++++++++++ .../gd32vf103/HAL_Drivers/drv_usart.h | 36 ++ libcpu/risc-v/SConscript | 3 +- libcpu/risc-v/nuclei/SConscript | 14 + libcpu/risc-v/nuclei/context_gcc.S | 188 +++++++ libcpu/risc-v/nuclei/cpuport.c | 259 +++++++++ libcpu/risc-v/nuclei/cpuport.h | 40 ++ libcpu/risc-v/nuclei/interrupt_gcc.S | 218 ++++++++ tools/mkdist.py | 7 + 27 files changed, 2962 insertions(+), 1 deletion(-) create mode 100644 bsp/nuclei/.gitignore create mode 100644 bsp/nuclei/gd32vf103_rvstar/.config create mode 100644 bsp/nuclei/gd32vf103_rvstar/Kconfig create mode 100644 bsp/nuclei/gd32vf103_rvstar/README.md create mode 100644 bsp/nuclei/gd32vf103_rvstar/SConscript create mode 100644 bsp/nuclei/gd32vf103_rvstar/SConstruct create mode 100644 bsp/nuclei/gd32vf103_rvstar/applications/SConscript create mode 100644 bsp/nuclei/gd32vf103_rvstar/applications/main.c create mode 100644 bsp/nuclei/gd32vf103_rvstar/board/Kconfig create mode 100644 bsp/nuclei/gd32vf103_rvstar/board/SConscript create mode 100644 bsp/nuclei/gd32vf103_rvstar/board/board.c create mode 100644 bsp/nuclei/gd32vf103_rvstar/board/board.h create mode 100644 bsp/nuclei/gd32vf103_rvstar/rtconfig.h create mode 100644 bsp/nuclei/gd32vf103_rvstar/rtconfig.py create mode 100644 bsp/nuclei/libraries/gd32vf103/HAL_Drivers/SConscript create mode 100644 bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_config.h create mode 100644 bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_gpio.c create mode 100644 bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_gpio.h create mode 100644 bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_usart.c create mode 100644 bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_usart.h create mode 100644 libcpu/risc-v/nuclei/SConscript create mode 100644 libcpu/risc-v/nuclei/context_gcc.S create mode 100644 libcpu/risc-v/nuclei/cpuport.c create mode 100644 libcpu/risc-v/nuclei/cpuport.h create mode 100644 libcpu/risc-v/nuclei/interrupt_gcc.S diff --git a/bsp/nuclei/.gitignore b/bsp/nuclei/.gitignore new file mode 100644 index 0000000000..975dcc6995 --- /dev/null +++ b/bsp/nuclei/.gitignore @@ -0,0 +1,26 @@ +*.i +*.o +*.d +*.elf +*.diss +*.map +*.bin +*.log +.vscode + +*.dump +*.verilog + +*.swp +*.swo + +prebuilt_tools/ +setup_config.sh +setup_config.bat + +tags +TAGS +TAG +CTAGS +Makefile.local +Makefile.global diff --git a/bsp/nuclei/gd32vf103_rvstar/.config b/bsp/nuclei/gd32vf103_rvstar/.config new file mode 100644 index 0000000000..c68135acc4 --- /dev/null +++ b/bsp/nuclei/gd32vf103_rvstar/.config @@ -0,0 +1,453 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=100 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=396 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=512 +CONFIG_RT_DEBUG=y +CONFIG_RT_DEBUG_COLOR=y +CONFIG_RT_DEBUG_INIT_CONFIG=y +CONFIG_RT_DEBUG_INIT=1 +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +# CONFIG_RT_USING_MEMHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMTRACE is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart4" +CONFIG_RT_VER_NUM=0x40003 +# CONFIG_RT_USING_CPU_FFS is not set +CONFIG_ARCH_RISCV=y +CONFIG_ARCH_RISCV32=y +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 + +# +# C++ features +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Command shell +# +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_CMD_SIZE=80 +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_USING_MSH_DEFAULT=y +# CONFIG_FINSH_USING_MSH_ONLY is not set +CONFIG_FINSH_ARG_MAX=10 + +# +# Device virtual file system +# +CONFIG_RT_USING_DFS=y +CONFIG_DFS_USING_WORKDIR=y +CONFIG_DFS_FILESYSTEMS_MAX=2 +CONFIG_DFS_FILESYSTEM_TYPES_MAX=2 +CONFIG_DFS_FD_MAX=16 +# CONFIG_RT_USING_DFS_MNTTABLE is not set +# CONFIG_RT_USING_DFS_ELMFAT is not set +CONFIG_RT_USING_DFS_DEVFS=y +# CONFIG_RT_USING_DFS_ROMFS is not set +# CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_UFFS is not set +# CONFIG_RT_USING_DFS_JFFS2 is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_PIPE_BUFSZ=512 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +CONFIG_RT_USING_LIBC=y +# CONFIG_RT_USING_PTHREADS is not set +CONFIG_RT_USING_POSIX=y +# CONFIG_RT_USING_POSIX_MMAP is not set +# CONFIG_RT_USING_POSIX_TERMIOS is not set +# CONFIG_RT_USING_POSIX_AIO is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LIBMODBUS is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOTHUB is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_libsodium is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set + +# +# language packages +# +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set + +# +# multimedia packages +# +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set + +# +# system packages +# +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_CMSIS is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set + +# +# peripheral libraries and drivers +# +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_TOUCH_DRIVERS is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +CONFIG_PKG_USING_NUCLEI_SDK=y +CONFIG_PKG_NUCLEI_SDK_PATH="/packages/peripherals/nuclei_sdk" +# CONFIG_PKG_USING_NUCLEI_SDK_V023 is not set +CONFIG_PKG_USING_NUCLEI_SDK_LATEST_VERSION=y +CONFIG_PKG_NUCLEI_SDK_VER="latest" + +# +# miscellaneous packages +# +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_UKAL is not set + +# +# Hardware Drivers Config +# +CONFIG_SOC_GD32VF103V=y + +# +# Onboard Peripheral Drivers +# +CONFIG_BSP_USING_UART_CONSOLE=y + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_UART=y +# CONFIG_BSP_USING_UART0 is not set +# CONFIG_BSP_USING_UART1 is not set +# CONFIG_BSP_USING_UART2 is not set +# CONFIG_BSP_USING_UART3 is not set +CONFIG_BSP_USING_UART4=y + +# +# Board extended module Drivers +# +CONFIG_SOC_GD32VF103=y diff --git a/bsp/nuclei/gd32vf103_rvstar/Kconfig b/bsp/nuclei/gd32vf103_rvstar/Kconfig new file mode 100644 index 0000000000..fb1ab0ffd5 --- /dev/null +++ b/bsp/nuclei/gd32vf103_rvstar/Kconfig @@ -0,0 +1,28 @@ +mainmenu "RT-Thread Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "board/Kconfig" + +config SOC_GD32VF103 + bool + select ARCH_RISCV32 + select PKG_USING_NUCLEI_SDK + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y diff --git a/bsp/nuclei/gd32vf103_rvstar/README.md b/bsp/nuclei/gd32vf103_rvstar/README.md new file mode 100644 index 0000000000..f9575aa2ee --- /dev/null +++ b/bsp/nuclei/gd32vf103_rvstar/README.md @@ -0,0 +1,209 @@ +# 芯来科技RVSTAR开发板 # + +## 简介 + +**RVSTAR开发板** 是由芯来科技公司推出的基于采用芯来科技RISC-V架构处理器芯片的GD32VF103的开发板。 + +更多关于 **RVSTAR开发板** 开发板的详细资料请参见 [RVSTAR开发板快速入门](https://www.rvmcu.com/quickstart-quickstart-index-u-RV_STAR.html) + +### 板载资源 + +| 硬件 | 描述 | +| --- | --- | +| 内核 | Nuclei N205 | +| 架构 | 32-bit RV32IMAC | +| 主频 | 108 MHz | + +## 工具安装 + +### 安装工具链 + +请根据[安装Nuclei RISC-V GCC Toolchain和OpenOCD](https://doc.nucleisys.com/nuclei_sdk/quickstart.html#setup-tools-and-environment) 来安装依赖的工具。 + +### 添加环境变量 + +将Nuclei RISC-V GCC Toolchain和OpenOCD的环境变量进行设置。 + +#### Windows + +假设工具安装在 **D:\Software\Nuclei**目录下, 则可以修改系统环境变量**PATH**, +将**D:\Software\Nuclei\gcc\bin;D:\Software\Nuclei\openocd\bin;**增加到**PATH**中。 + +或者在ENV工具命令行中运行 + +~~~cmd +set PATH=D:\Software\Nuclei\gcc\bin;D:\Software\Nuclei\openocd\bin;%PATH% +~~~ + +#### Linux + +假设工具安装在 **~/Software/Nuclei**目录下, 通过在Linux的``.bashrc``增加如下一行代码 +来添加环境变量。 + +~~~bash +export PATH=~/Software/Nuclei/gcc/bin:~/Software/Nuclei/openocd/bin:$PATH +~~~ + +或者在ENV工具命令行中运行 + +~~~bash +export PATH=~/Software/Nuclei/gcc/bin:~/Software/Nuclei/openocd/bin:$PATH +~~~ + +**注意**: 对应的RISC-V GCC和OPENOCD的路径请替换成自己安装的路径。 + +## 烧写及执行 + +### [驱动设置](https://doc.nucleisys.com/nuclei_board_labs/hw/hw.html#on-board-debugger-driver) + +### 编译程序 + +下载好[RT-Thread](https://github.com/RT-Thread/rt-thread)的代码和[ENV工具](https://www.rt-thread.org/document/site/tutorial/env-video/)以后。 + +按照ENV工具的教程, 在**rt-thread\bsp\nuclei\gd32vf103_rvstar**目录打开ENV工具命令行。 + +**注意**: 请确保Nuclei GCC和Nuclei OpenOCD的路径设置正确无误。 + +1. 运行 ``pkgs --update``来下载最新的依赖的**Nuclei SDK**开发包 +2. **可选**: 运行 ``menuconfig``来进行内核配置 +3. 运行 ``scons -c``清理之前的编译结果 +4. 运行 ``scons``来进行代码的编译 + +### 下载程序 + +在保证程序能够正常编译后, 在相同ENV终端执行``scons --run upload``进行代码的下载。 + +正常下载的输出如下: + +~~~ +scons: Reading SConscript files ... +Supported downloaded modes for board gd32vf103v_rvstar are flashxip, chosen downloaded mode is flashxip +Upload application rtthread.elf using openocd and gdb +riscv-nuclei-elf-gdb rtthread.elf -ex "set remotetimeout 240" -ex "target remote | openocd --pipe -f D:/workspace/Sourcecode/rt-thread/bsp/nuclei/gd32vf103_rvstar/packages/nuclei_sdk-latest/SoC/gd32vf103/Board/gd32vf103v_rvstar/openocd_gd32vf103.cfg" --batch -ex "monitor halt" -ex "monitor flash protect 0 0 last off" -ex "load" -ex "monitor resume" -ex "monitor shutdown" -ex "quit" +D:\Software\Nuclei\gcc\bin\riscv-nuclei-elf-gdb.exe: warning: Couldn't determine a path for the index cache directory. + +Nuclei OpenOCD, 64-bit Open On-Chip Debugger 0.10.0+dev-00014-g0eae03214 (2019-12-12-07:43) +Licensed under GNU GPL v2 +For bug reports, read + http://openocd.org/doc/doxygen/bugs.html +rt_thread_idle_entry (parameter=0x0) at D:\workspace\Sourcecode\rt-thread\src\idle.c:251 +251 if (idle_hook_list[i] != RT_NULL) +cleared protection for sectors 0 through 127 on flash bank 0 + +Loading section .init, size 0x264 lma 0x8000000 +Loading section .text, size 0x140de lma 0x8000280 +Loading section .rodata, size 0x37c0 lma 0x8014360 +Loading section .data, size 0x404 lma 0x8017b20 +Start address 0x800015c, load size 98054 +Transfer rate: 8 KB/sec, 10894 bytes/write. +shutdown command invoked +A debugging session is active. + + Inferior 1 [Remote target] will be detached. + +Quit anyway? (y or n) [answered Y; input not from terminal] +Remote communication error. Target disconnected.: Success. +~~~ + +下载程序之后, 连接串口(115200-N-8-1), 可以看到 RT-Thread 的输出信息: + +``` +initialize rti_board_start:0 done + + \ | / +- RT - Thread Operating System + / | \ 4.0.3 build Apr 9 2020 + 2006 - 2020 Copyright by rt-thread team +do components initialization. +initialize rti_board_end:0 done +initialize dfs_init:0 done +initialize libc_system_init:0 done +initialize finsh_system_init:0 done +msh /> +``` + +在串口终端(我这里使用的是TeraTerm)输入``ps``即可查看当前线程工作情况: + +~~~ +msh />ps +thread pri status sp stack size max used left tick error +-------- --- ------- ---------- ---------- ------ ---------- --- +thread01 19 suspend 0x00000158 0x0000018c 87% 0x00000005 000 +thread00 19 suspend 0x00000158 0x0000018c 87% 0x00000005 000 +tshell 20 running 0x00000258 0x00001000 18% 0x00000004 000 +tidle0 31 ready 0x000000a8 0x0000018c 59% 0x0000000e 000 +timer 4 suspend 0x000000f8 0x00000200 49% 0x00000009 000 +main 10 suspend 0x00000168 0x00000800 36% 0x00000006 000 +msh /> +~~~ + +### 调试程序 + +在保证程序编译成功后, 在相同ENV终端执行``scons --run debug``进行代码在命令行下进行GDB调试。 + +正常的调试输出如下: + +~~~ +scons: Reading SConscript files ... +Supported downloaded modes for board gd32vf103v_rvstar are flashxip, chosen downloaded mode is flashxip +Debug application rtthread.elf using openocd and gdb +riscv-nuclei-elf-gdb rtthread.elf -ex "set remotetimeout 240" -ex "target remote | openocd --pipe -f D:/workspace/Sourcecode/rt-thread/bsp/nuclei/gd32vf103_rvstar/packages/nuclei_sdk-latest/SoC/gd32vf103/Board/gd32vf103v_rvstar/openocd_gd32vf103.cfg" +D:\Software\Nuclei\gcc\bin\riscv-nuclei-elf-gdb.exe: warning: Couldn't determine a path for the index cache directory. +GNU gdb (GDB) 8.3.0.20190516-git +Copyright (C) 2019 Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. +Type "show copying" and "show warranty" for details. +This GDB was configured as "--host=i686-w64-mingw32 --target=riscv-nuclei-elf". +Type "show configuration" for configuration details. +For bug reporting instructions, please see: +. +Find the GDB manual and other documentation resources online at: + . + +For help, type "help". +Type "apropos word" to search for commands related to "word"... +Reading symbols from rtthread.elf... +Remote debugging using | openocd --pipe -f D:/workspace/Sourcecode/rt-thread/bsp/nuclei/gd32vf103_rvstar/packages/nuclei_sdk-latest/SoC/gd32vf103/Board/gd32vf103v_rvstar/openocd_gd32vf103.cfg Nuclei OpenOCD, 64-bit Open On-Chip Debugger 0.10.0+dev-00014-g0eae03214 (2019-12-12-07:43) +Licensed under GNU GPL v2 +For bug reports, read + http://openocd.org/doc/doxygen/bugs.html +rt_thread_idle_entry (parameter=0x0) at D:\workspace\Sourcecode\rt-thread\src\idle.c:249 +249 for (i = 0; i < RT_IDLE_HOOK_LIST_SIZE; i++) +(gdb) +(gdb) b main.c:35 +Breakpoint 1 at 0x8000290: file applications\main.c, line 35. +(gdb) c +Continuing. +Note: automatically using hardware breakpoints for read-only addresses. + +Breakpoint 1, thread_entry (parameter=0x0) at applications\main.c:35 +35 rt_thread_mdelay(500); +(gdb) +~~~ + +调试例子参见如下文档: + +* https://doc.nucleisys.com/nuclei_sdk/quickstart.html#debug-application + +为了更方便的进行调试, 也可以下载**Nuclei Studio**集成开发环境, 创建一个Debug Configuration, 选择编译好的 +ELF文件, 然后配置OPENOCD和GDB即可, OPENOCD配置文件路径为**bsp\nuclei\gd32vf103_rvstar\packages\nuclei_sdk-latest\SoC\gd32vf103\Board\gd32vf103v_rvstar\openocd_gd32vf103.cfg** + + +## 驱动支持情况 + +| 驱动 | 支持情况 | 备注 | +| ------ | ---- | :------: | +| UART | 支持 | RV-STAR板载串口是UART4 | + +**注:** + +- 适配RT-Thread的驱动框架的代码在 [../libraries/gd32vf103/HAL_Drivers](../libraries/gd32vf103/HAL_Drivers)目录下。 +- 如果有开发者想适配更多的驱动, 请在对应目录下增加驱动适配支持。 + +## 联系人信息 + +维护人: +- [fanghuaqi](https://github.com/fanghuaqi) + diff --git a/bsp/nuclei/gd32vf103_rvstar/SConscript b/bsp/nuclei/gd32vf103_rvstar/SConscript new file mode 100644 index 0000000000..014c428d0a --- /dev/null +++ b/bsp/nuclei/gd32vf103_rvstar/SConscript @@ -0,0 +1,17 @@ +# for module compiling +import os +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +ASFLAGS = ' -I' + cwd + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/nuclei/gd32vf103_rvstar/SConstruct b/bsp/nuclei/gd32vf103_rvstar/SConstruct new file mode 100644 index 0000000000..7adcd69070 --- /dev/null +++ b/bsp/nuclei/gd32vf103_rvstar/SConstruct @@ -0,0 +1,85 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +from building import * + +TARGET = 'rtthread.' + rtconfig.TARGET_EXT + +AddOption('--run', + dest = 'run', + type='string', + nargs=1, + action = 'store', + default = "", + help = 'Upload or debug application using openocd') + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) +env['ASCOM'] = env['ASPPCOM'] + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +GDB = rtconfig.GDB + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT) + +bsp_library_type = rtconfig.NUCLEI_SDK_SOC +rtconfig.BSP_LIBRARY_TYPE = bsp_library_type + +openocd_cfg = rtconfig.NUCLEI_SDK_OPENOCD_CFG.replace('\\', '/') + +# include hal drivers +hal_sconscript = os.path.join(libraries_path_prefix, bsp_library_type, 'HAL_Drivers', 'SConscript') + +if os.path.isfile(hal_sconscript): + objs.extend(SConscript(hal_sconscript)) + +# make a building +DoBuilding(TARGET, objs) + +# Run upload or debug if --run=upload or --upload=debug +run_target = GetOption('run') +SUPPORT_RUN_TARGETS = ["upload", "debug"] +if run_target in SUPPORT_RUN_TARGETS: + if os.path.isfile(TARGET): + if run_target == "upload": + upload_cmd = '{} {} -ex "set remotetimeout 240" \ + -ex "target remote | openocd --pipe -f {}" \ + --batch -ex "monitor halt" -ex "monitor flash protect 0 0 last off" -ex "load" \ + -ex "monitor resume" -ex "monitor shutdown" -ex "quit"'.format(GDB, TARGET, openocd_cfg) + print("Upload application {} using openocd and gdb".format(TARGET)) + print(upload_cmd) + os.system(upload_cmd) + elif run_target == "debug": + debug_cmd = '{} {} -ex "set remotetimeout 240" \ + -ex "target remote | openocd --pipe -f {}"'.format(GDB, TARGET, openocd_cfg) + print("Debug application {} using openocd and gdb".format(TARGET)) + print(debug_cmd) + os.system(debug_cmd) + else: + print(TARGET + ' not exist, please run scons first!!') + exit(0) diff --git a/bsp/nuclei/gd32vf103_rvstar/applications/SConscript b/bsp/nuclei/gd32vf103_rvstar/applications/SConscript new file mode 100644 index 0000000000..ef1c39fd83 --- /dev/null +++ b/bsp/nuclei/gd32vf103_rvstar/applications/SConscript @@ -0,0 +1,11 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd, ] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/nuclei/gd32vf103_rvstar/applications/main.c b/bsp/nuclei/gd32vf103_rvstar/applications/main.c new file mode 100644 index 0000000000..7da5f0da45 --- /dev/null +++ b/bsp/nuclei/gd32vf103_rvstar/applications/main.c @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-15 hqfang first version + */ + +#include +#include + +int main(int argc, char *argv[]) +{ + return RT_EOK; +} + +/******************** end of file *******************/ \ No newline at end of file diff --git a/bsp/nuclei/gd32vf103_rvstar/board/Kconfig b/bsp/nuclei/gd32vf103_rvstar/board/Kconfig new file mode 100644 index 0000000000..5165ac7629 --- /dev/null +++ b/bsp/nuclei/gd32vf103_rvstar/board/Kconfig @@ -0,0 +1,47 @@ +menu "Hardware Drivers Config" + +config SOC_GD32VF103V + bool + select SOC_SERIES_GD32VF103V + default y + +menu "Onboard Peripheral Drivers" + + config BSP_USING_UART_CONSOLE + bool "Enable UART CONSOLE" + select BSP_USING_UART + select BSP_USING_UART4 + default y +endmenu + +menu "On-chip Peripheral Drivers" + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART0 + bool "Enable UART0" + default n + config BSP_USING_UART1 + bool "Enable UART1" + default n + config BSP_USING_UART2 + bool "Enable UART2" + default n + config BSP_USING_UART3 + bool "Enable UART3" + default n + config BSP_USING_UART4 + bool "Enable UART4" + default n + endif + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/nuclei/gd32vf103_rvstar/board/SConscript b/bsp/nuclei/gd32vf103_rvstar/board/SConscript new file mode 100644 index 0000000000..148c99f42c --- /dev/null +++ b/bsp/nuclei/gd32vf103_rvstar/board/SConscript @@ -0,0 +1,11 @@ +# RT-Thread building script for component + +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/nuclei/gd32vf103_rvstar/board/board.c b/bsp/nuclei/gd32vf103_rvstar/board/board.c new file mode 100644 index 0000000000..7dad875006 --- /dev/null +++ b/bsp/nuclei/gd32vf103_rvstar/board/board.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-02 hqfang first version + * + */ + +#include +#include +#include "board.h" +#include "cpuport.h" + +#ifdef RT_USING_SERIAL + #include +#endif + +/** _end symbol defined in linker script of Nuclei SDK */ +extern void *_end; + +/** _heap_end symbol defined in linker script of Nuclei SDK */ +extern void *_heap_end; +#define HEAP_BEGIN &_end +#define HEAP_END &_heap_end + +/* + * - Implemented and defined in Nuclei SDK system_.c file + * - Required macro NUCLEI_BANNER set to 0 + */ +extern void _init(void); + +/** + * @brief Setup hardware board for rt-thread + * + */ +void rt_hw_board_init(void) +{ + /* OS Tick Configuration */ + rt_hw_ticksetup(); + +#ifdef RT_USING_HEAP + rt_system_heap_init((void *) HEAP_BEGIN, (void *) HEAP_END); +#endif + + _init(); // __libc_init_array is not used in RT-Thread + + /* USART driver initialization is open by default */ +#ifdef RT_USING_SERIAL + rt_hw_usart_init(); +#endif + + /* Set the shell console output device */ +#ifdef RT_USING_CONSOLE + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); +#endif + + /* Board underlying hardware initialization */ +#ifdef RT_USING_COMPONENTS_INIT + rt_components_board_init(); +#endif +} + +/******************** end of file *******************/ + diff --git a/bsp/nuclei/gd32vf103_rvstar/board/board.h b/bsp/nuclei/gd32vf103_rvstar/board/board.h new file mode 100644 index 0000000000..4e571e3ee2 --- /dev/null +++ b/bsp/nuclei/gd32vf103_rvstar/board/board.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-02 hqfang first version + * + */ + +#ifndef __BOARD__ +#define __BOARD__ + +#include "nuclei_sdk_hal.h" + +void rt_hw_board_init(void); + +#endif /* __BOARD__ */ + +/******************** end of file *******************/ diff --git a/bsp/nuclei/gd32vf103_rvstar/rtconfig.h b/bsp/nuclei/gd32vf103_rvstar/rtconfig.h new file mode 100644 index 0000000000..2498e39e9d --- /dev/null +++ b/bsp/nuclei/gd32vf103_rvstar/rtconfig.h @@ -0,0 +1,181 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 4 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 100 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 396 +#define RT_USING_TIMER_SOFT +#define RT_TIMER_THREAD_PRIO 4 +#define RT_TIMER_THREAD_STACK_SIZE 512 +#define RT_DEBUG +#define RT_DEBUG_COLOR +#define RT_DEBUG_INIT_CONFIG +#define RT_DEBUG_INIT 1 + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart4" +#define RT_VER_NUM 0x40003 +#define ARCH_RISCV +#define ARCH_RISCV32 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 + +/* C++ features */ + + +/* Command shell */ + +#define RT_USING_FINSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_USING_DESCRIPTION +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_CMD_SIZE 80 +#define FINSH_USING_MSH +#define FINSH_USING_MSH_DEFAULT +#define FINSH_ARG_MAX 10 + +/* Device virtual file system */ + +#define RT_USING_DFS +#define DFS_USING_WORKDIR +#define DFS_FILESYSTEMS_MAX 2 +#define DFS_FILESYSTEM_TYPES_MAX 2 +#define DFS_FD_MAX 16 +#define RT_USING_DFS_DEVFS + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_PIPE_BUFSZ 512 +#define RT_USING_SERIAL +#define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN + +/* Using USB */ + + +/* POSIX layer and C standard library */ + +#define RT_USING_LIBC +#define RT_USING_POSIX + +/* Network */ + +/* Socket abstraction layer */ + + +/* Network interface device */ + + +/* light weight TCP/IP stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + + +/* multimedia packages */ + + +/* tools packages */ + + +/* system packages */ + + +/* peripheral libraries and drivers */ + +#define PKG_USING_NUCLEI_SDK +#define PKG_USING_NUCLEI_SDK_LATEST_VERSION + +/* miscellaneous packages */ + + +/* samples: kernel and components samples */ + + +/* Hardware Drivers Config */ + +#define SOC_GD32VF103V + +/* Onboard Peripheral Drivers */ + +#define BSP_USING_UART_CONSOLE + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_UART +#define BSP_USING_UART4 + +/* Board extended module Drivers */ + +#define SOC_GD32VF103 + +#endif diff --git a/bsp/nuclei/gd32vf103_rvstar/rtconfig.py b/bsp/nuclei/gd32vf103_rvstar/rtconfig.py new file mode 100644 index 0000000000..8136b392f8 --- /dev/null +++ b/bsp/nuclei/gd32vf103_rvstar/rtconfig.py @@ -0,0 +1,58 @@ +import os + +# toolchains options +ARCH='risc-v' +CPU='nuclei' +CROSS_TOOL='gcc' + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') + +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = 'D:/Software/Nuclei/gcc/bin' +else: + print("CROSS_TOOL = {} not yet supported" % CROSS_TOOL) + +# if os.getenv('RTT_EXEC_PATH'): +# EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' +# Fixed configurations below +NUCLEI_SDK_SOC = "gd32vf103" +NUCLEI_SDK_BOARD = "gd32vf103v_rvstar" +NUCLEI_SDK_DOWNLOAD = "flashxip" +NUCLEI_SDK_CORE = "n205" + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'riscv-nuclei-elf-' + CC = PREFIX + 'gcc' + CXX = PREFIX + 'g++' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + LINK = PREFIX + 'gcc' + GDB = PREFIX + 'gdb' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + CFLAGS = ' -ffunction-sections -fdata-sections -fno-common ' + AFLAGS = CFLAGS + LFLAGS = ' --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections ' + LFLAGS += ' -Wl,-cref,-Map=rtthread.map' + LFLAGS += ' -u _isatty -u _write -u _sbrk -u _read -u _close -u _fstat -u _lseek ' + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -ggdb' + AFLAGS += ' -ggdb' + else: + CFLAGS += ' -O2 -Os' + + CXXFLAGS = CFLAGS + +DUMP_ACTION = OBJDUMP + ' -D -S $TARGET > rtt.asm\n' +POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' diff --git a/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/SConscript b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/SConscript new file mode 100644 index 0000000000..4761127102 --- /dev/null +++ b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/SConscript @@ -0,0 +1,21 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * + +cwd = GetCurrentDir() + +# add the general drivers. +src = Split(""" +""") + +if GetDepend(['RT_USING_PIN']): + src += ['drv_gpio.c'] + +if GetDepend(['RT_USING_SERIAL']): + src += ['drv_usart.c'] + +path = [cwd] + +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path) + +Return('group') diff --git a/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_config.h b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_config.h new file mode 100644 index 0000000000..bb24afa19e --- /dev/null +++ b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_config.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-08 hqfang first version + */ + +#ifndef __DRV_CONFIG_H__ +#define __DRV_CONFIG_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_gpio.c b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_gpio.c new file mode 100644 index 0000000000..75ab81f18e --- /dev/null +++ b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_gpio.c @@ -0,0 +1,520 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-09 hqfang first version + */ + +#include "drv_gpio.h" + +#ifdef RT_USING_PIN + +static const struct pin_index pins[] = +{ + + __GD32_PIN(0, A, 0), + __GD32_PIN(1, A, 1), + __GD32_PIN(2, A, 2), + __GD32_PIN(3, A, 3), + __GD32_PIN(4, A, 4), + __GD32_PIN(5, A, 5), + __GD32_PIN(6, A, 6), + __GD32_PIN(7, A, 7), + __GD32_PIN(8, A, 8), + __GD32_PIN(9, A, 9), + __GD32_PIN(10, A, 10), + __GD32_PIN(11, A, 11), + __GD32_PIN(12, A, 12), + __GD32_PIN(13, A, 13), + __GD32_PIN(14, A, 14), + __GD32_PIN(15, A, 15), + + __GD32_PIN(16, B, 0), + __GD32_PIN(17, B, 1), + __GD32_PIN(18, B, 2), + __GD32_PIN(19, B, 3), + __GD32_PIN(20, B, 4), + __GD32_PIN(21, B, 5), + __GD32_PIN(22, B, 6), + __GD32_PIN(23, B, 7), + __GD32_PIN(24, B, 8), + __GD32_PIN(25, B, 9), + __GD32_PIN(26, B, 10), + __GD32_PIN(27, B, 11), + __GD32_PIN(28, B, 12), + __GD32_PIN(29, B, 13), + __GD32_PIN(30, B, 14), + __GD32_PIN(31, B, 15), + + __GD32_PIN(32, C, 0), + __GD32_PIN(33, C, 1), + __GD32_PIN(34, C, 2), + __GD32_PIN(35, C, 3), + __GD32_PIN(36, C, 4), + __GD32_PIN(37, C, 5), + __GD32_PIN(38, C, 6), + __GD32_PIN(39, C, 7), + __GD32_PIN(40, C, 8), + __GD32_PIN(41, C, 9), + __GD32_PIN(42, C, 10), + __GD32_PIN(43, C, 11), + __GD32_PIN(44, C, 12), + __GD32_PIN(45, C, 13), + __GD32_PIN(46, C, 14), + __GD32_PIN(47, C, 15), + + __GD32_PIN(48, D, 0), + __GD32_PIN(49, D, 1), + __GD32_PIN(50, D, 2), + __GD32_PIN(51, D, 3), + __GD32_PIN(52, D, 4), + __GD32_PIN(53, D, 5), + __GD32_PIN(54, D, 6), + __GD32_PIN(55, D, 7), + __GD32_PIN(56, D, 8), + __GD32_PIN(57, D, 9), + __GD32_PIN(58, D, 10), + __GD32_PIN(59, D, 11), + __GD32_PIN(60, D, 12), + __GD32_PIN(61, D, 13), + __GD32_PIN(62, D, 14), + __GD32_PIN(63, D, 15), + + __GD32_PIN(64, E, 0), + __GD32_PIN(65, E, 1), + __GD32_PIN(66, E, 2), + __GD32_PIN(67, E, 3), + __GD32_PIN(68, E, 4), + __GD32_PIN(69, E, 5), + __GD32_PIN(70, E, 6), + __GD32_PIN(71, E, 7), + __GD32_PIN(72, E, 8), + __GD32_PIN(73, E, 9), + __GD32_PIN(74, E, 10), + __GD32_PIN(75, E, 11), + __GD32_PIN(76, E, 12), + __GD32_PIN(77, E, 13), + __GD32_PIN(78, E, 14), + __GD32_PIN(79, E, 15), +}; + +static const struct pin_irq_map pin_irq_map[] = +{ + {GPIO_PIN_0, EXTI0_IRQn}, + {GPIO_PIN_1, EXTI1_IRQn}, + {GPIO_PIN_2, EXTI2_IRQn}, + {GPIO_PIN_3, EXTI3_IRQn}, + {GPIO_PIN_4, EXTI4_IRQn}, + {GPIO_PIN_5, EXTI5_9_IRQn}, + {GPIO_PIN_6, EXTI5_9_IRQn}, + {GPIO_PIN_7, EXTI5_9_IRQn}, + {GPIO_PIN_8, EXTI5_9_IRQn}, + {GPIO_PIN_9, EXTI5_9_IRQn}, + {GPIO_PIN_10, EXTI10_15_IRQn}, + {GPIO_PIN_11, EXTI10_15_IRQn}, + {GPIO_PIN_12, EXTI10_15_IRQn}, + {GPIO_PIN_13, EXTI10_15_IRQn}, + {GPIO_PIN_14, EXTI10_15_IRQn}, + {GPIO_PIN_15, EXTI10_15_IRQn}, +}; + +static struct rt_pin_irq_hdr pin_irq_hdr_tab[] = +{ + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, +}; +static uint32_t pin_irq_enable_mask = 0; + +#define ITEM_NUM(items) sizeof(items) / sizeof(items[0]) +static const struct pin_index *get_pin(uint8_t pin) +{ + const struct pin_index *index; + + if (pin < ITEM_NUM(pins)) + { + index = &pins[pin]; + if (index->index == -1) + index = RT_NULL; + } + else + { + index = RT_NULL; + } + + return index; +}; + +static void gd32_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value) +{ + const struct pin_index *index; + + index = get_pin(pin); + if (index == RT_NULL) + { + return; + } + + gpio_bit_write(index->gpio, index->pin, (bit_status)value); +} + +static int gd32_pin_read(rt_device_t dev, rt_base_t pin) +{ + int value; + const struct pin_index *index; + + value = PIN_LOW; + + index = get_pin(pin); + if (index == RT_NULL) + { + return value; + } + + value = gpio_input_bit_get(index->gpio, index->pin); + + return value; +} + +static void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode) +{ + const struct pin_index *index; + rt_uint32_t pin_mode; + + index = get_pin(pin); + if (index == RT_NULL) + { + return; + } + + pin_mode = GPIO_MODE_OUT_PP; + + switch (mode) + { + case PIN_MODE_OUTPUT: + /* output setting */ + pin_mode = GPIO_MODE_OUT_PP; + break; + case PIN_MODE_OUTPUT_OD: + /* output setting: od. */ + pin_mode = GPIO_MODE_OUT_OD; + break; + case PIN_MODE_INPUT: + /* input setting: not pull. */ + pin_mode = GPIO_MODE_IN_FLOATING; + break; + case PIN_MODE_INPUT_PULLUP: + /* input setting: pull up. */ + pin_mode = GPIO_MODE_IPU; + break; + case PIN_MODE_INPUT_PULLDOWN: + /* input setting: pull down. */ + pin_mode = GPIO_MODE_IPD; + break; + default: + break; + } + + gpio_init(index->gpio, pin_mode, GPIO_OSPEED_50MHZ, index->pin); +} + +rt_inline rt_int32_t bit2bitno(rt_uint32_t bit) +{ + int i; + for (i = 0; i < 32; i++) + { + if ((0x01 << i) == bit) + { + return i; + } + } + return -1; +} + +rt_inline const struct pin_irq_map *get_pin_irq_map(uint32_t pinbit) +{ + rt_int32_t mapindex = bit2bitno(pinbit); + if (mapindex < 0 || mapindex >= ITEM_NUM(pin_irq_map)) + { + return RT_NULL; + } + return &pin_irq_map[mapindex]; +}; + +static rt_err_t gd32_pin_attach_irq(struct rt_device *device, rt_int32_t pin, + rt_uint32_t mode, void (*hdr)(void *args), void *args) +{ + const struct pin_index *index; + rt_base_t level; + rt_int32_t irqindex = -1; + + index = get_pin(pin); + if (index == RT_NULL) + { + return RT_ENOSYS; + } + irqindex = bit2bitno(index->pin); + if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map)) + { + return RT_ENOSYS; + } + + level = rt_hw_interrupt_disable(); + if (pin_irq_hdr_tab[irqindex].pin == pin && + pin_irq_hdr_tab[irqindex].hdr == hdr && + pin_irq_hdr_tab[irqindex].mode == mode && + pin_irq_hdr_tab[irqindex].args == args) + { + rt_hw_interrupt_enable(level); + return RT_EOK; + } + if (pin_irq_hdr_tab[irqindex].pin != -1) + { + rt_hw_interrupt_enable(level); + return RT_EBUSY; + } + pin_irq_hdr_tab[irqindex].pin = pin; + pin_irq_hdr_tab[irqindex].hdr = hdr; + pin_irq_hdr_tab[irqindex].mode = mode; + pin_irq_hdr_tab[irqindex].args = args; + rt_hw_interrupt_enable(level); + + return RT_EOK; +} + +static rt_err_t gd32_pin_dettach_irq(struct rt_device *device, rt_int32_t pin) +{ + const struct pin_index *index; + rt_base_t level; + rt_int32_t irqindex = -1; + + index = get_pin(pin); + if (index == RT_NULL) + { + return RT_ENOSYS; + } + irqindex = bit2bitno(index->pin); + if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map)) + { + return RT_ENOSYS; + } + + level = rt_hw_interrupt_disable(); + if (pin_irq_hdr_tab[irqindex].pin == -1) + { + rt_hw_interrupt_enable(level); + return RT_EOK; + } + pin_irq_hdr_tab[irqindex].pin = -1; + pin_irq_hdr_tab[irqindex].hdr = RT_NULL; + pin_irq_hdr_tab[irqindex].mode = 0; + pin_irq_hdr_tab[irqindex].args = RT_NULL; + rt_hw_interrupt_enable(level); + + return RT_EOK; +} + +static rt_err_t gd32_pin_irq_enable(struct rt_device *device, rt_base_t pin, + rt_uint32_t enabled) +{ + const struct pin_index *index; + const struct pin_irq_map *irqmap; + rt_base_t level; + rt_int32_t irqindex = -1; + exti_trig_type_enum trigger_mode; + + index = get_pin(pin); + if (index == RT_NULL) + { + return RT_ENOSYS; + } + + if (enabled == PIN_IRQ_ENABLE) + { + irqindex = bit2bitno(index->pin); + if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map)) + { + return RT_ENOSYS; + } + + level = rt_hw_interrupt_disable(); + + if (pin_irq_hdr_tab[irqindex].pin == -1) + { + rt_hw_interrupt_enable(level); + return RT_ENOSYS; + } + + irqmap = &pin_irq_map[irqindex]; + + switch (pin_irq_hdr_tab[irqindex].mode) + { + case PIN_IRQ_MODE_RISING: + trigger_mode = EXTI_TRIG_RISING; + break; + case PIN_IRQ_MODE_FALLING: + trigger_mode = EXTI_TRIG_FALLING; + break; + case PIN_IRQ_MODE_RISING_FALLING: + trigger_mode = EXTI_TRIG_BOTH; + break; + default: + rt_hw_interrupt_enable(level); + return RT_EINVAL; + } + /* connect EXTI line to GPIO pin */ + gpio_exti_source_select(index->gpio, index->pin); + + /* configure EXTI line */ + exti_init((exti_line_enum)(index->pin), EXTI_INTERRUPT, trigger_mode); + exti_interrupt_flag_clear((exti_line_enum)(index->pin)); + + /* enable and set interrupt priority */ + ECLIC_SetShvIRQ(irqmap->irqno, ECLIC_NON_VECTOR_INTERRUPT); + ECLIC_SetLevelIRQ(irqmap->irqno, 1); + ECLIC_EnableIRQ(irqmap->irqno); + pin_irq_enable_mask |= irqmap->pinbit; + + rt_hw_interrupt_enable(level); + } + else if (enabled == PIN_IRQ_DISABLE) + { + irqmap = get_pin_irq_map(index->pin); + if (irqmap == RT_NULL) + { + return RT_EINVAL; + } + if ((irqmap->pinbit >= GPIO_PIN_5) && (irqmap->pinbit <= GPIO_PIN_9)) + { + if (!(pin_irq_enable_mask & (GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9))) + { + ECLIC_DisableIRQ(irqmap->irqno); + } + } + else if ((irqmap->pinbit >= GPIO_PIN_10) && (irqmap->pinbit <= GPIO_PIN_15)) + { + if (!(pin_irq_enable_mask & (GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15))) + { + ECLIC_DisableIRQ(irqmap->irqno); + } + } + else + { + ECLIC_DisableIRQ(irqmap->irqno); + } + } + else + { + return -RT_ENOSYS; + } + + return RT_EOK; +} +const static struct rt_pin_ops _gd32_pin_ops = +{ + gd32_pin_mode, + gd32_pin_write, + gd32_pin_read, + gd32_pin_attach_irq, + gd32_pin_dettach_irq, + gd32_pin_irq_enable, +}; + +rt_inline void pin_irq_hdr(int irqno) +{ + if (pin_irq_hdr_tab[irqno].hdr) + { + pin_irq_hdr_tab[irqno].hdr(pin_irq_hdr_tab[irqno].args); + } +} + +void GD32_GPIO_EXTI_IRQHandler(rt_int8_t exti_line) +{ + if (RESET != exti_interrupt_flag_get((exti_line_enum)(1 << exti_line))) + { + pin_irq_hdr(exti_line); + exti_interrupt_flag_clear((exti_line_enum)(1 << exti_line)); + } +} + +void EXTI0_IRQHandler(void) +{ + rt_interrupt_enter(); + GD32_GPIO_EXTI_IRQHandler(0); + rt_interrupt_leave(); +} +void EXTI1_IRQHandler(void) +{ + rt_interrupt_enter(); + GD32_GPIO_EXTI_IRQHandler(1); + rt_interrupt_leave(); +} +void EXTI2_IRQHandler(void) +{ + rt_interrupt_enter(); + GD32_GPIO_EXTI_IRQHandler(2); + rt_interrupt_leave(); +} +void EXTI3_IRQHandler(void) +{ + rt_interrupt_enter(); + GD32_GPIO_EXTI_IRQHandler(3); + rt_interrupt_leave(); +} +void EXTI4_IRQHandler(void) +{ + rt_interrupt_enter(); + GD32_GPIO_EXTI_IRQHandler(4); + rt_interrupt_leave(); +} +void EXTI5_9_IRQHandler(void) +{ + rt_interrupt_enter(); + GD32_GPIO_EXTI_IRQHandler(5); + GD32_GPIO_EXTI_IRQHandler(6); + GD32_GPIO_EXTI_IRQHandler(7); + GD32_GPIO_EXTI_IRQHandler(8); + GD32_GPIO_EXTI_IRQHandler(9); + rt_interrupt_leave(); +} +void EXTI10_15_IRQHandler(void) +{ + rt_interrupt_enter(); + GD32_GPIO_EXTI_IRQHandler(10); + GD32_GPIO_EXTI_IRQHandler(11); + GD32_GPIO_EXTI_IRQHandler(12); + GD32_GPIO_EXTI_IRQHandler(13); + GD32_GPIO_EXTI_IRQHandler(14); + GD32_GPIO_EXTI_IRQHandler(15); + rt_interrupt_leave(); +} + +int rt_hw_pin_init(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_GPIOB); + rcu_periph_clock_enable(RCU_GPIOC); + rcu_periph_clock_enable(RCU_GPIOD); + rcu_periph_clock_enable(RCU_GPIOE); + rcu_periph_clock_enable(RCU_AF); + return rt_device_pin_register("pin", &_gd32_pin_ops, RT_NULL); +} +INIT_BOARD_EXPORT(rt_hw_pin_init); + +#endif /* RT_USING_PIN */ diff --git a/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_gpio.h b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_gpio.h new file mode 100644 index 0000000000..93d24a8317 --- /dev/null +++ b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_gpio.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 balanceTWK first version + * 2020-04-15 hqfang Modify for gd32vf103 + */ + +#ifndef __DRV_GPIO_H__ +#define __DRV_GPIO_H__ + +#include +#include +#include +#include + +#define __GD32_PORT(port) GPIO##port + +#define GET_PIN(PORTx,PIN) (rt_base_t)((16 * ( ((rt_base_t)__GD32_PORT(PORTx) - (rt_base_t)GPIOA)/(0x0400UL) )) + PIN) + +#define __GD32_PIN(index, gpio, gpio_index) \ + { \ + index, GPIO##gpio, GPIO_PIN_##gpio_index \ + } + +#define __GD32_PIN_RESERVE \ + { \ + -1, 0, 0 \ + } + +/* GD32 GPIO driver */ +struct pin_index +{ + int index; + uint32_t gpio; + uint32_t pin; +}; + +struct pin_irq_map +{ + rt_uint16_t pinbit; + IRQn_Type irqno; +}; + +int rt_hw_pin_init(void); + +#endif /* __DRV_GPIO_H__ */ + diff --git a/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_usart.c b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_usart.c new file mode 100644 index 0000000000..00fac33b3e --- /dev/null +++ b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_usart.c @@ -0,0 +1,347 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-07-23 tyustli first version + * 2020-04-02 hqfang modified for Nuclei + */ + +#include + +#ifdef RT_USING_SERIAL + +#if !defined(BSP_USING_UART0) && !defined(BSP_USING_UART1) && !defined(BSP_USING_UART2) \ + && !defined(BSP_USING_UART3) && !defined(BSP_USING_UART4) + #error "Please define at least one BSP_USING_UARTx" + /* this driver can be disabled at menuconfig -> RT-Thread Components -> Device Drivers */ +#endif + +enum +{ +#ifdef BSP_USING_UART0 + GDUART0_INDEX, +#endif +#ifdef BSP_USING_UART1 + GDUART1_INDEX, +#endif +#ifdef BSP_USING_UART2 + GDUART2_INDEX, +#endif +#ifdef BSP_USING_UART3 + GDUART3_INDEX, +#endif +#ifdef BSP_USING_UART4 + GDUART4_INDEX, +#endif +}; + +static struct gd32_uart_config uart_config[] = +{ +#ifdef BSP_USING_UART0 + { + "uart0", + USART0, + USART0_IRQn, + }, +#endif +#ifdef BSP_USING_UART1 + { + "uart1", + USART1, + USART1_IRQn, + }, +#endif +#ifdef BSP_USING_UART2 + { + "uart2", + USART2, + USART2_IRQn, + }, +#endif +#ifdef BSP_USING_UART3 + { + "uart3", + USART3, + USART3_IRQn, + }, +#endif +#ifdef BSP_USING_UART4 + { + "uart4", + UART4, + UART4_IRQn, + }, +#endif +}; + +static struct gd32_uart uart_obj[sizeof(uart_config) / sizeof(uart_config[0])] = {0}; + +static rt_err_t gd32_configure(struct rt_serial_device *serial, + struct serial_configure *cfg) +{ + struct gd32_uart *usart_obj; + struct gd32_uart_config *usart; + RT_ASSERT(serial != RT_NULL); + RT_ASSERT(cfg != RT_NULL); + + usart_obj = (struct gd32_uart *) serial->parent.user_data; + usart = usart_obj->config; + RT_ASSERT(usart != RT_NULL); + + usart_deinit(usart->uart_base); + usart_baudrate_set(usart->uart_base, cfg->baud_rate); + + switch (cfg->data_bits) + { + case DATA_BITS_8: + usart_word_length_set(usart->uart_base, USART_WL_8BIT); + break; + + case DATA_BITS_9: + usart_word_length_set(usart->uart_base, USART_WL_9BIT); + break; + default: + usart_word_length_set(usart->uart_base, USART_WL_8BIT); + break; + } + + switch (cfg->stop_bits) + { + case STOP_BITS_1: + usart_stop_bit_set(usart->uart_base, USART_STB_1BIT); + break; + case STOP_BITS_2: + usart_stop_bit_set(usart->uart_base, USART_STB_2BIT); + break; + default: + usart_stop_bit_set(usart->uart_base, USART_STB_1BIT); + break; + } + + switch (cfg->parity) + { + case PARITY_NONE: + usart_parity_config(usart->uart_base, USART_PM_NONE); + break; + case PARITY_ODD: + usart_parity_config(usart->uart_base, USART_PM_ODD); + break; + case PARITY_EVEN: + usart_parity_config(usart->uart_base, USART_PM_EVEN); + break; + default: + usart_parity_config(usart->uart_base, USART_PM_NONE); + break; + } + usart_hardware_flow_rts_config(usart->uart_base, USART_RTS_DISABLE); + usart_hardware_flow_cts_config(usart->uart_base, USART_RTS_DISABLE); + usart_receive_config(usart->uart_base, USART_RECEIVE_ENABLE); + usart_transmit_config(usart->uart_base, USART_TRANSMIT_ENABLE); + usart_enable(usart->uart_base); + + return RT_EOK; +} + +static rt_err_t gd32_control(struct rt_serial_device *serial, int cmd, + void *arg) +{ + struct gd32_uart *usart_obj; + struct gd32_uart_config *usart; + + RT_ASSERT(serial != RT_NULL); + usart_obj = (struct gd32_uart *) serial->parent.user_data; + usart = usart_obj->config; + RT_ASSERT(usart != RT_NULL); + + switch (cmd) + { + case RT_DEVICE_CTRL_CLR_INT: + ECLIC_DisableIRQ(usart->irqn); + usart_interrupt_disable(usart->uart_base, USART_INT_RBNE); + break; + case RT_DEVICE_CTRL_SET_INT: + ECLIC_EnableIRQ(usart->irqn); + /* enable USART0 receive interrupt */ + usart_interrupt_enable(usart->uart_base, USART_INT_RBNE); + break; + } + + return RT_EOK; +} + +static int gd32_putc(struct rt_serial_device *serial, char ch) +{ + struct gd32_uart *usart_obj; + struct gd32_uart_config *usart; + + RT_ASSERT(serial != RT_NULL); + usart_obj = (struct gd32_uart *) serial->parent.user_data; + usart = usart_obj->config; + RT_ASSERT(usart != RT_NULL); + + usart_data_transmit(usart->uart_base, (uint8_t) ch); + while (usart_flag_get(usart->uart_base, USART_FLAG_TBE) == RESET); + + return 1; +} + +static int gd32_getc(struct rt_serial_device *serial) +{ + int ch; + struct gd32_uart *usart_obj; + struct gd32_uart_config *usart; + + RT_ASSERT(serial != RT_NULL); + usart_obj = (struct gd32_uart *) serial->parent.user_data; + usart = usart_obj->config; + RT_ASSERT(usart != RT_NULL); + + ch = -1; + if (RESET != usart_flag_get(usart->uart_base, USART_FLAG_RBNE)) + { + ch = usart_data_receive(usart->uart_base) & 0xff; + } + + return ch; +} + +static const struct rt_uart_ops gd32_uart_ops = { gd32_configure, gd32_control, + gd32_putc, gd32_getc, + RT_NULL +}; + +static void usart_isr(struct rt_serial_device *serial) +{ + struct gd32_uart *usart_obj; + struct gd32_uart_config *usart; + + RT_ASSERT(serial != RT_NULL); + usart_obj = (struct gd32_uart *) serial->parent.user_data; + usart = usart_obj->config; + RT_ASSERT(usart != RT_NULL); + + if ((usart_interrupt_flag_get(usart->uart_base, USART_INT_FLAG_RBNE) + != RESET) + && (RESET != usart_flag_get(usart->uart_base, USART_FLAG_RBNE))) + { + rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); + usart_interrupt_flag_clear(usart->uart_base, USART_INT_FLAG_RBNE); + usart_flag_clear(usart->uart_base, USART_FLAG_RBNE); + } + else + { + if (usart_flag_get(usart->uart_base, USART_FLAG_CTSF) != RESET) + { + usart_flag_clear(usart->uart_base, USART_FLAG_CTSF); + } + + if (usart_flag_get(usart->uart_base, USART_FLAG_LBDF) != RESET) + { + usart_flag_clear(usart->uart_base, USART_FLAG_LBDF); + } + + if (usart_flag_get(usart->uart_base, USART_FLAG_TC) != RESET) + { + usart_flag_clear(usart->uart_base, USART_FLAG_TC); + } + } +} + +#ifdef BSP_USING_UART0 + +void USART0_IRQHandler(void) +{ + rt_interrupt_enter(); + + usart_isr(&uart_obj[GDUART0_INDEX].serial); + + rt_interrupt_leave(); +} + +#endif + +#ifdef BSP_USING_UART1 + +void USART1_IRQHandler(void) +{ + rt_interrupt_enter(); + + usart_isr(&uart_obj[GDUART1_INDEX].serial); + + rt_interrupt_leave(); +} + +#endif + +#ifdef BSP_USING_UART2 + +void USART2_IRQHandler(void) +{ + rt_interrupt_enter(); + + usart_isr(&uart_obj[GDUART2_INDEX].serial); + + rt_interrupt_leave(); +} + +#endif + +#ifdef BSP_USING_UART3 + +void UART3_IRQHandler(void) +{ + rt_interrupt_enter(); + + usart_isr(&uart_obj[GDUART3_INDEX].serial); + + rt_interrupt_leave(); +} + +#endif + +#ifdef BSP_USING_UART4 + +void UART4_IRQHandler(void) +{ + rt_interrupt_enter(); + + usart_isr(&uart_obj[GDUART4_INDEX].serial); + + rt_interrupt_leave(); +} + +#endif + +int rt_hw_usart_init(void) +{ + rt_size_t obj_num; + int index; + + obj_num = sizeof(uart_obj) / sizeof(struct gd32_uart); + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + rt_err_t result = 0; + + for (index = 0; index < obj_num; index++) + { + /* init UART object */ + uart_obj[index].config = &uart_config[index]; + uart_obj[index].serial.ops = &gd32_uart_ops; + uart_obj[index].serial.config = config; + + /* register UART device */ + result = rt_hw_serial_register(&uart_obj[index].serial, + uart_obj[index].config->name, + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX + | RT_DEVICE_FLAG_INT_TX, &uart_obj[index]); + RT_ASSERT(result == RT_EOK); + } + + return result; +} + +#endif /* RT_USING_SERIAL */ + +/******************** end of file *******************/ diff --git a/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_usart.h b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_usart.h new file mode 100644 index 0000000000..176720c4a2 --- /dev/null +++ b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_usart.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-15 hqfang first version + */ +#ifndef __DRV_UART_H__ +#define __DRV_UART_H__ + +#include +#include +#include + +/* gd32 config class */ +struct gd32_uart_config +{ + const char *name; + uint32_t uart_base; + IRQn_Type irqn; +}; + +/* gd32 uart dirver class */ +struct gd32_uart +{ + struct gd32_uart_config *config; + struct rt_serial_device serial; +}; + +int rt_hw_usart_init(void); + +#endif /* __DRV_USART_H__ */ + +/******************* end of file *******************/ diff --git a/libcpu/risc-v/SConscript b/libcpu/risc-v/SConscript index 640e46a4fb..024cc5ba44 100644 --- a/libcpu/risc-v/SConscript +++ b/libcpu/risc-v/SConscript @@ -10,7 +10,8 @@ group = [] list = os.listdir(cwd) # add common code files -group = group + SConscript(os.path.join('common', 'SConscript')) +if rtconfig.CPU != "nuclei": + group = group + SConscript(os.path.join('common', 'SConscript')) # cpu porting code files group = group + SConscript(os.path.join(rtconfig.CPU, 'SConscript')) diff --git a/libcpu/risc-v/nuclei/SConscript b/libcpu/risc-v/nuclei/SConscript new file mode 100644 index 0000000000..b0ae20ba02 --- /dev/null +++ b/libcpu/risc-v/nuclei/SConscript @@ -0,0 +1,14 @@ +# RT-Thread building script for component + +from building import * + +Import('rtconfig') + +cwd = GetCurrentDir() +src = Glob('*.c') + Glob('*.cpp') + Glob('*_gcc.S') +CPPPATH = [cwd] +ASFLAGS = '' + +group = DefineGroup('cpu', src, depend = [''], CPPPATH = CPPPATH, ASFLAGS = ASFLAGS) + +Return('group') diff --git a/libcpu/risc-v/nuclei/context_gcc.S b/libcpu/risc-v/nuclei/context_gcc.S new file mode 100644 index 0000000000..fda453940d --- /dev/null +++ b/libcpu/risc-v/nuclei/context_gcc.S @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2019-Present Nuclei Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020/03/26 Huaqi First Nuclei RISC-V porting implementation + */ + +#include "riscv_encoding.h" + +#ifndef __riscv_32e +#define RT_SAVED_REGNUM 30 +#else +#define RT_SAVED_REGNUM 14 +#endif + +#define RT_CONTEXT_SIZE (RT_SAVED_REGNUM * REGBYTES) + + .extern rt_interrupt_from_thread + .extern rt_interrupt_to_thread + + +.section .text + + +/* + * void rt_hw_context_switch_to(rt_ubase_t to); + * a0 --> to_thread + */ + .globl rt_hw_context_switch_to + +/* Start the first task. This also clears the bit that indicates the FPU is + in use in case the FPU was used before the scheduler was started - which + would otherwise result in the unnecessary leaving of space in the stack + for lazy saving of FPU registers. */ +.align 3 +rt_hw_context_switch_to: + /* Setup Interrupt Stack using + The stack that was used by main() + before the scheduler is started is + no longer required after the scheduler is started. + Interrupt stack pointer is stored in CSR_MSCRATCH */ + la t0, _sp + csrw CSR_MSCRATCH, t0 + LOAD sp, 0x0(a0) /* Read sp from first TCB member(a0) */ + + /* Pop PC from stack and set MEPC */ + LOAD t0, 0 * REGBYTES(sp) + csrw CSR_MEPC, t0 + /* Pop mstatus from stack and set it */ + LOAD t0, (RT_SAVED_REGNUM - 1) * REGBYTES(sp) + csrw CSR_MSTATUS, t0 + /* Interrupt still disable here */ + /* Restore Registers from Stack */ + LOAD x1, 1 * REGBYTES(sp) /* RA */ + LOAD x5, 2 * REGBYTES(sp) + LOAD x6, 3 * REGBYTES(sp) + LOAD x7, 4 * REGBYTES(sp) + LOAD x8, 5 * REGBYTES(sp) + LOAD x9, 6 * REGBYTES(sp) + LOAD x10, 7 * REGBYTES(sp) + LOAD x11, 8 * REGBYTES(sp) + LOAD x12, 9 * REGBYTES(sp) + LOAD x13, 10 * REGBYTES(sp) + LOAD x14, 11 * REGBYTES(sp) + LOAD x15, 12 * REGBYTES(sp) +#ifndef __riscv_32e + LOAD x16, 13 * REGBYTES(sp) + LOAD x17, 14 * REGBYTES(sp) + LOAD x18, 15 * REGBYTES(sp) + LOAD x19, 16 * REGBYTES(sp) + LOAD x20, 17 * REGBYTES(sp) + LOAD x21, 18 * REGBYTES(sp) + LOAD x22, 19 * REGBYTES(sp) + LOAD x23, 20 * REGBYTES(sp) + LOAD x24, 21 * REGBYTES(sp) + LOAD x25, 22 * REGBYTES(sp) + LOAD x26, 23 * REGBYTES(sp) + LOAD x27, 24 * REGBYTES(sp) + LOAD x28, 25 * REGBYTES(sp) + LOAD x29, 26 * REGBYTES(sp) + LOAD x30, 27 * REGBYTES(sp) + LOAD x31, 28 * REGBYTES(sp) +#endif + + addi sp, sp, RT_CONTEXT_SIZE + + mret + +.align 2 +.global eclic_msip_handler +eclic_msip_handler: + addi sp, sp, -RT_CONTEXT_SIZE + STORE x1, 1 * REGBYTES(sp) /* RA */ + STORE x5, 2 * REGBYTES(sp) + STORE x6, 3 * REGBYTES(sp) + STORE x7, 4 * REGBYTES(sp) + STORE x8, 5 * REGBYTES(sp) + STORE x9, 6 * REGBYTES(sp) + STORE x10, 7 * REGBYTES(sp) + STORE x11, 8 * REGBYTES(sp) + STORE x12, 9 * REGBYTES(sp) + STORE x13, 10 * REGBYTES(sp) + STORE x14, 11 * REGBYTES(sp) + STORE x15, 12 * REGBYTES(sp) +#ifndef __riscv_32e + STORE x16, 13 * REGBYTES(sp) + STORE x17, 14 * REGBYTES(sp) + STORE x18, 15 * REGBYTES(sp) + STORE x19, 16 * REGBYTES(sp) + STORE x20, 17 * REGBYTES(sp) + STORE x21, 18 * REGBYTES(sp) + STORE x22, 19 * REGBYTES(sp) + STORE x23, 20 * REGBYTES(sp) + STORE x24, 21 * REGBYTES(sp) + STORE x25, 22 * REGBYTES(sp) + STORE x26, 23 * REGBYTES(sp) + STORE x27, 24 * REGBYTES(sp) + STORE x28, 25 * REGBYTES(sp) + STORE x29, 26 * REGBYTES(sp) + STORE x30, 27 * REGBYTES(sp) + STORE x31, 28 * REGBYTES(sp) +#endif + /* Push mstatus to stack */ + csrr t0, CSR_MSTATUS + STORE t0, (RT_SAVED_REGNUM - 1) * REGBYTES(sp) + + /* Push additional registers */ + + /* Store sp to task stack */ + LOAD t0, rt_interrupt_from_thread + STORE sp, 0(t0) + + csrr t0, CSR_MEPC + STORE t0, 0(sp) + + jal rt_hw_taskswitch + + /* Switch task context */ + LOAD t0, rt_interrupt_to_thread + LOAD sp, 0x0(t0) + + /* Pop PC from stack and set MEPC */ + LOAD t0, 0 * REGBYTES(sp) + csrw CSR_MEPC, t0 + + /* Pop additional registers */ + + /* Pop mstatus from stack and set it */ + LOAD t0, (RT_SAVED_REGNUM - 1) * REGBYTES(sp) + csrw CSR_MSTATUS, t0 + /* Interrupt still disable here */ + /* Restore Registers from Stack */ + LOAD x1, 1 * REGBYTES(sp) /* RA */ + LOAD x5, 2 * REGBYTES(sp) + LOAD x6, 3 * REGBYTES(sp) + LOAD x7, 4 * REGBYTES(sp) + LOAD x8, 5 * REGBYTES(sp) + LOAD x9, 6 * REGBYTES(sp) + LOAD x10, 7 * REGBYTES(sp) + LOAD x11, 8 * REGBYTES(sp) + LOAD x12, 9 * REGBYTES(sp) + LOAD x13, 10 * REGBYTES(sp) + LOAD x14, 11 * REGBYTES(sp) + LOAD x15, 12 * REGBYTES(sp) +#ifndef __riscv_32e + LOAD x16, 13 * REGBYTES(sp) + LOAD x17, 14 * REGBYTES(sp) + LOAD x18, 15 * REGBYTES(sp) + LOAD x19, 16 * REGBYTES(sp) + LOAD x20, 17 * REGBYTES(sp) + LOAD x21, 18 * REGBYTES(sp) + LOAD x22, 19 * REGBYTES(sp) + LOAD x23, 20 * REGBYTES(sp) + LOAD x24, 21 * REGBYTES(sp) + LOAD x25, 22 * REGBYTES(sp) + LOAD x26, 23 * REGBYTES(sp) + LOAD x27, 24 * REGBYTES(sp) + LOAD x28, 25 * REGBYTES(sp) + LOAD x29, 26 * REGBYTES(sp) + LOAD x30, 27 * REGBYTES(sp) + LOAD x31, 28 * REGBYTES(sp) +#endif + + addi sp, sp, RT_CONTEXT_SIZE + mret diff --git a/libcpu/risc-v/nuclei/cpuport.c b/libcpu/risc-v/nuclei/cpuport.c new file mode 100644 index 0000000000..fad9afdf4c --- /dev/null +++ b/libcpu/risc-v/nuclei/cpuport.c @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * Copyright (c) 2019-Present Nuclei Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020/03/26 Huaqi Nuclei RISC-V Core porting code. + */ + +#include +#include +#include +#include + +#include "cpuport.h" + +#define SYSTICK_TICK_CONST (SOC_TIMER_FREQ / RT_TICK_PER_SECOND) + +/* Interrupt level for kernel systimer interrupt and software timer interrupt */ +#define RT_KERNEL_INTERRUPT_LEVEL 1 + +/* Initial CSR MSTATUS value when thread created */ +#define RT_INITIAL_MSTATUS (MSTATUS_MPP | MSTATUS_MPIE | MSTATUS_FS_INITIAL) + +/** + * @brief from thread used interrupt context switch + * + */ +volatile rt_ubase_t rt_interrupt_from_thread = 0; +/** + * @brief to thread used interrupt context switch + * + */ +volatile rt_ubase_t rt_interrupt_to_thread = 0; +/** + * @brief flag to indicate context switch in interrupt or not + * + */ +volatile rt_ubase_t rt_thread_switch_interrupt_flag = 0; + +/** + * @brief thread stack frame of saved context + * + */ +struct rt_hw_stack_frame +{ + rt_ubase_t epc; /*!< epc - epc - program counter */ + rt_ubase_t ra; /*!< x1 - ra - return address for jumps */ + rt_ubase_t t0; /*!< x5 - t0 - temporary register 0 */ + rt_ubase_t t1; /*!< x6 - t1 - temporary register 1 */ + rt_ubase_t t2; /*!< x7 - t2 - temporary register 2 */ + rt_ubase_t s0_fp; /*!< x8 - s0/fp - saved register 0 or frame pointer */ + rt_ubase_t s1; /*!< x9 - s1 - saved register 1 */ + rt_ubase_t a0; /*!< x10 - a0 - return value or function argument 0 */ + rt_ubase_t a1; /*!< x11 - a1 - return value or function argument 1 */ + rt_ubase_t a2; /*!< x12 - a2 - function argument 2 */ + rt_ubase_t a3; /*!< x13 - a3 - function argument 3 */ + rt_ubase_t a4; /*!< x14 - a4 - function argument 4 */ + rt_ubase_t a5; /*!< x15 - a5 - function argument 5 */ +#ifndef __riscv_32e + rt_ubase_t a6; /*!< x16 - a6 - function argument 6 */ + rt_ubase_t a7; /*!< x17 - s7 - function argument 7 */ + rt_ubase_t s2; /*!< x18 - s2 - saved register 2 */ + rt_ubase_t s3; /*!< x19 - s3 - saved register 3 */ + rt_ubase_t s4; /*!< x20 - s4 - saved register 4 */ + rt_ubase_t s5; /*!< x21 - s5 - saved register 5 */ + rt_ubase_t s6; /*!< x22 - s6 - saved register 6 */ + rt_ubase_t s7; /*!< x23 - s7 - saved register 7 */ + rt_ubase_t s8; /*!< x24 - s8 - saved register 8 */ + rt_ubase_t s9; /*!< x25 - s9 - saved register 9 */ + rt_ubase_t s10; /*!< x26 - s10 - saved register 10 */ + rt_ubase_t s11; /*!< x27 - s11 - saved register 11 */ + rt_ubase_t t3; /*!< x28 - t3 - temporary register 3 */ + rt_ubase_t t4; /*!< x29 - t4 - temporary register 4 */ + rt_ubase_t t5; /*!< x30 - t5 - temporary register 5 */ + rt_ubase_t t6; /*!< x31 - t6 - temporary register 6 */ +#endif + rt_ubase_t mstatus; /*!< - machine status register */ +}; + +/** + * This function will initialize thread stack + * + * @param tentry the entry of thread + * @param parameter the parameter of entry + * @param stack_addr the beginning stack address + * @param texit the function will be called when thread exit + * + * @return stack address + */ +rt_uint8_t *rt_hw_stack_init(void *tentry, + void *parameter, + rt_uint8_t *stack_addr, + void *texit) +{ + struct rt_hw_stack_frame *frame; + rt_uint8_t *stk; + int i; + + stk = stack_addr + sizeof(rt_ubase_t); + stk = (rt_uint8_t *)RT_ALIGN_DOWN((rt_ubase_t)stk, REGBYTES); + stk -= sizeof(struct rt_hw_stack_frame); + + frame = (struct rt_hw_stack_frame *)stk; + + for (i = 0; i < sizeof(struct rt_hw_stack_frame) / sizeof(rt_ubase_t); i++) + { + ((rt_ubase_t *)frame)[i] = 0xdeadbeef; + } + + frame->ra = (rt_ubase_t)texit; + frame->a0 = (rt_ubase_t)parameter; + frame->epc = (rt_ubase_t)tentry; + + frame->mstatus = RT_INITIAL_MSTATUS; + + return stk; +} + +/** + * @brief Do rt-thread context switch in interrupt context + * + * @param from thread sp of from thread + * @param to thread sp of to thread + */ +void rt_hw_context_switch_interrupt(rt_ubase_t from, rt_ubase_t to) +{ + if (rt_thread_switch_interrupt_flag == 0) + rt_interrupt_from_thread = from; + + rt_interrupt_to_thread = to; + rt_thread_switch_interrupt_flag = 1; + RT_YIELD(); +} + +/** + * @brief Do rt-thread context switch in task context + * + * @param from thread sp of from thread + * @param to thread sp of to thread + */ +void rt_hw_context_switch(rt_ubase_t from, rt_ubase_t to) +{ + rt_interrupt_from_thread = from; + rt_interrupt_to_thread = to; + RT_YIELD(); +} + +/** + * @brief shutdown CPU + * + */ +void rt_hw_cpu_shutdown() +{ + rt_uint32_t level; + rt_kprintf("shutdown...\n"); + + level = rt_hw_interrupt_disable(); + while (level) + { + RT_ASSERT(0); + } +} + +/** + * @brief Do extra task switch code + * + * @details + * + * - Clear software timer interrupt request flag + * - clear rt_thread_switch_interrupt_flag to 0 + */ +void rt_hw_taskswitch(void) +{ + /* Clear Software IRQ, A MUST */ + SysTimer_ClearSWIRQ(); + rt_thread_switch_interrupt_flag = 0; +} + +/** + * @brief Setup systimer and software timer interrupt + * + * @details + * + * - Set Systimer interrupt as NON-VECTOR interrupt with lowest interrupt level + * - Set software timer interrupt as VECTOR interrupt with lowest interrupt level + * - Enable these two interrupts + */ +void rt_hw_ticksetup(void) +{ + uint64_t ticks = SYSTICK_TICK_CONST; + + /* Make SWI and SysTick the lowest priority interrupts. */ + /* Stop and clear the SysTimer. SysTimer as Non-Vector Interrupt */ + SysTick_Config(ticks); + ECLIC_DisableIRQ(SysTimer_IRQn); + ECLIC_SetLevelIRQ(SysTimer_IRQn, RT_KERNEL_INTERRUPT_LEVEL); + ECLIC_SetShvIRQ(SysTimer_IRQn, ECLIC_NON_VECTOR_INTERRUPT); + ECLIC_EnableIRQ(SysTimer_IRQn); + + /* Set SWI interrupt level to lowest level/priority, SysTimerSW as Vector Interrupt */ + ECLIC_SetShvIRQ(SysTimerSW_IRQn, ECLIC_VECTOR_INTERRUPT); + ECLIC_SetLevelIRQ(SysTimerSW_IRQn, RT_KERNEL_INTERRUPT_LEVEL); + ECLIC_EnableIRQ(SysTimerSW_IRQn); +} + +/** + * systimer interrupt handler eclic_mtip_handler + * is hard coded in startup_.S + * We define SysTick_Handler as eclic_mtip_handler + * for easy understanding + */ +#define SysTick_Handler eclic_mtip_handler + +/** + * @brief This is the timer interrupt service routine. + * + */ +void SysTick_Handler(void) +{ + /* Reload systimer */ + SysTick_Reload(SYSTICK_TICK_CONST); + + /* enter interrupt */ + rt_interrupt_enter(); + + /* tick increase */ + rt_tick_increase(); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +/** + * @brief Disable cpu interrupt + * + * @details + * + * - Disable cpu interrupt by clear MIE bit in MSTATUS + * - Return the previous value in MSTATUS before clear MIE bit + * + * @return the previous value in MSTATUS before clear MIE bit + */ +rt_base_t rt_hw_interrupt_disable(void) +{ + return __RV_CSR_READ_CLEAR(CSR_MSTATUS, MSTATUS_MIE); +} + +/** + * @brief Restore previous saved interrupt status + * + * @param level previous saved MSTATUS value + */ +void rt_hw_interrupt_enable(rt_base_t level) +{ + __RV_CSR_WRITE(CSR_MSTATUS, level); +} diff --git a/libcpu/risc-v/nuclei/cpuport.h b/libcpu/risc-v/nuclei/cpuport.h new file mode 100644 index 0000000000..3736f0078a --- /dev/null +++ b/libcpu/risc-v/nuclei/cpuport.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * Copyright (c) 2019-Present Nuclei Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020/03/26 hqfang Nuclei RISC-V Core porting code. + */ + +#ifndef __CPUPORT_H__ +#define __CPUPORT_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Scheduler utilities. */ +#define RT_YIELD() \ +{ \ + /* Set a software interrupt(SWI) request to request a context switch. */ \ + SysTimer_SetSWIRQ(); \ + /* Barriers are normally not required but do ensure the code is completely \ + within the specified behaviour for the architecture. */ \ + __RWMB(); \ + __FENCE_I(); \ +} + +extern void rt_hw_ticksetup(void); +extern void rt_hw_taskswitch(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libcpu/risc-v/nuclei/interrupt_gcc.S b/libcpu/risc-v/nuclei/interrupt_gcc.S new file mode 100644 index 0000000000..02a3e3e760 --- /dev/null +++ b/libcpu/risc-v/nuclei/interrupt_gcc.S @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2019-Present Nuclei Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020/03/26 hqfang First Nuclei RISC-V porting implementation + */ + +#include "riscv_encoding.h" + +.section .text.entry +.align 8 + +/** + * \brief Global interrupt disabled + * \details + * This function disable global interrupt. + * \remarks + * - All the interrupt requests will be ignored by CPU. + */ +.macro DISABLE_MIE + csrc CSR_MSTATUS, MSTATUS_MIE +.endm + +/** + * \brief Macro for context save + * \details + * This macro save ABI defined caller saved registers in the stack. + * \remarks + * - This Macro could use to save context when you enter to interrupt + * or exception +*/ +/* Save caller registers */ +.macro SAVE_CONTEXT + csrrw sp, CSR_MSCRATCHCSWL, sp + /* Allocate stack space for context saving */ +#ifndef __riscv_32e + addi sp, sp, -20*REGBYTES +#else + addi sp, sp, -14*REGBYTES +#endif /* __riscv_32e */ + + STORE x1, 0*REGBYTES(sp) + STORE x4, 1*REGBYTES(sp) + STORE x5, 2*REGBYTES(sp) + STORE x6, 3*REGBYTES(sp) + STORE x7, 4*REGBYTES(sp) + STORE x10, 5*REGBYTES(sp) + STORE x11, 6*REGBYTES(sp) + STORE x12, 7*REGBYTES(sp) + STORE x13, 8*REGBYTES(sp) + STORE x14, 9*REGBYTES(sp) + STORE x15, 10*REGBYTES(sp) +#ifndef __riscv_32e + STORE x16, 14*REGBYTES(sp) + STORE x17, 15*REGBYTES(sp) + STORE x28, 16*REGBYTES(sp) + STORE x29, 17*REGBYTES(sp) + STORE x30, 18*REGBYTES(sp) + STORE x31, 19*REGBYTES(sp) +#endif /* __riscv_32e */ +.endm + +/** + * \brief Macro for restore caller registers + * \details + * This macro restore ABI defined caller saved registers from stack. + * \remarks + * - You could use this macro to restore context before you want return + * from interrupt or exeception + */ +/* Restore caller registers */ +.macro RESTORE_CONTEXT + LOAD x1, 0*REGBYTES(sp) + LOAD x4, 1*REGBYTES(sp) + LOAD x5, 2*REGBYTES(sp) + LOAD x6, 3*REGBYTES(sp) + LOAD x7, 4*REGBYTES(sp) + LOAD x10, 5*REGBYTES(sp) + LOAD x11, 6*REGBYTES(sp) + LOAD x12, 7*REGBYTES(sp) + LOAD x13, 8*REGBYTES(sp) + LOAD x14, 9*REGBYTES(sp) + LOAD x15, 10*REGBYTES(sp) +#ifndef __riscv_32e + LOAD x16, 14*REGBYTES(sp) + LOAD x17, 15*REGBYTES(sp) + LOAD x28, 16*REGBYTES(sp) + LOAD x29, 17*REGBYTES(sp) + LOAD x30, 18*REGBYTES(sp) + LOAD x31, 19*REGBYTES(sp) + + /* De-allocate the stack space */ + addi sp, sp, 20*REGBYTES +#else + /* De-allocate the stack space */ + addi sp, sp, 14*REGBYTES +#endif /* __riscv_32e */ + csrrw sp, CSR_MSCRATCHCSWL, sp +.endm + +/** + * \brief Macro for save necessary CSRs to stack + * \details + * This macro store MCAUSE, MEPC, MSUBM to stack. + */ +.macro SAVE_CSR_CONTEXT + /* Store CSR mcause to stack using pushmcause */ + csrrwi x0, CSR_PUSHMCAUSE, 11 + /* Store CSR mepc to stack using pushmepc */ + csrrwi x0, CSR_PUSHMEPC, 12 + /* Store CSR msub to stack using pushmsub */ + csrrwi x0, CSR_PUSHMSUBM, 13 +.endm + +/** + * \brief Macro for restore necessary CSRs from stack + * \details + * This macro restore MSUBM, MEPC, MCAUSE from stack. + */ +.macro RESTORE_CSR_CONTEXT + LOAD x5, 13*REGBYTES(sp) + csrw CSR_MSUBM, x5 + LOAD x5, 12*REGBYTES(sp) + csrw CSR_MEPC, x5 + LOAD x5, 11*REGBYTES(sp) + csrw CSR_MCAUSE, x5 +.endm + +/** + * \brief Exception/NMI Entry + * \details + * This function provide common entry functions for exception/nmi. + * \remarks + * This function provide a default exception/nmi entry. + * ABI defined caller save register and some CSR registers + * to be saved before enter interrupt handler and be restored before return. + */ +.section .text.trap +/* In CLIC mode, the exeception entry must be 64bytes aligned */ +.align 6 +.global exc_entry +exc_entry: + /* Save the caller saving registers (context) */ + SAVE_CONTEXT + /* Save the necessary CSR registers */ + SAVE_CSR_CONTEXT + + /* + * Set the exception handler function arguments + * argument 1: mcause value + * argument 2: current stack point(SP) value + */ + csrr a0, mcause + mv a1, sp + /* + * TODO: Call the exception handler function + * By default, the function template is provided in + * system_Device.c, you can adjust it as you want + */ + call core_exception_handler + + /* Restore the necessary CSR registers */ + RESTORE_CSR_CONTEXT + /* Restore the caller saving registers (context) */ + RESTORE_CONTEXT + + /* Return to regular code */ + mret + +/** + * \brief Non-Vector Interrupt Entry + * \details + * This function provide common entry functions for handling + * non-vector interrupts + * \remarks + * This function provide a default non-vector interrupt entry. + * ABI defined caller save register and some CSR registers need + * to be saved before enter interrupt handler and be restored before return. + */ +.section .text.irq +/* In CLIC mode, the interrupt entry must be 4bytes aligned */ +.align 2 +.global irq_entry +/* This label will be set to MTVT2 register */ +irq_entry: + /* Save the caller saving registers (context) */ + SAVE_CONTEXT + /* Save the necessary CSR registers */ + SAVE_CSR_CONTEXT + + /* This special CSR read/write operation, which is actually + * claim the CLIC to find its pending highest ID, if the ID + * is not 0, then automatically enable the mstatus.MIE, and + * jump to its vector-entry-label, and update the link register + */ + csrrw ra, CSR_JALMNXTI, ra + + /* Critical section with interrupts disabled */ + DISABLE_MIE + + /* Restore the necessary CSR registers */ + RESTORE_CSR_CONTEXT + /* Restore the caller saving registers (context) */ + RESTORE_CONTEXT + + /* Return to regular code */ + mret + +/* Default Handler for Exceptions / Interrupts */ +.global default_intexc_handler +Undef_Handler: +default_intexc_handler: +1: + j 1b + diff --git a/tools/mkdist.py b/tools/mkdist.py index 7e4b9a8bbe..ec527d87e1 100644 --- a/tools/mkdist.py +++ b/tools/mkdist.py @@ -345,6 +345,13 @@ def MkDist(program, BSP_ROOT, RTT_ROOT, Env, rttide = None): bsp_copy_files(os.path.join(library_path, Env['bsp_lib_type']), os.path.join(library_dir, Env['bsp_lib_type'])) shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig')) + # copy nuclei bsp libiary files + if os.path.basename(os.path.dirname(BSP_ROOT)) == 'nuclei': + print("=> copy nuclei bsp library") + library_path = os.path.join(os.path.dirname(BSP_ROOT), 'libraries') + library_dir = os.path.join(dist_dir, 'libraries') + bsp_copy_files(os.path.join(library_path, Env['bsp_lib_type']), os.path.join(library_dir, Env['bsp_lib_type'])) + # do bsp special dist handle if 'dist_handle' in Env: print("=> start dist handle") From 3b2fa472096d41287ee8cb542e8c1d119a5a8b76 Mon Sep 17 00:00:00 2001 From: luhuadong Date: Fri, 17 Apr 2020 22:14:37 +0800 Subject: [PATCH 13/27] [BSP] add Libraries when scons --dist --- bsp/at32/at32f403a-start/rtconfig.py | 6 +++--- tools/mkdist.py | 26 ++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/bsp/at32/at32f403a-start/rtconfig.py b/bsp/at32/at32f403a-start/rtconfig.py index 1d63cabb96..4800f9a871 100644 --- a/bsp/at32/at32f403a-start/rtconfig.py +++ b/bsp/at32/at32f403a-start/rtconfig.py @@ -57,7 +57,7 @@ if PLATFORM == 'gcc': else: CFLAGS += ' -O2' - CXXFLAGS = CFLAGS + CXXFLAGS = CFLAGS POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' @@ -88,7 +88,7 @@ elif PLATFORM == 'armcc': else: CFLAGS += ' -O2' - CXXFLAGS = CFLAGS + CXXFLAGS = CFLAGS CFLAGS += ' -std=c99' POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' @@ -136,7 +136,7 @@ elif PLATFORM == 'iar': LFLAGS = ' --config "board/linker_scripts/link.icf"' LFLAGS += ' --entry __iar_program_start' - + CXXFLAGS = CFLAGS EXEC_PATH = EXEC_PATH + '/arm/bin/' diff --git a/tools/mkdist.py b/tools/mkdist.py index 7e4b9a8bbe..e71d767446 100644 --- a/tools/mkdist.py +++ b/tools/mkdist.py @@ -122,7 +122,7 @@ def bsp_update_kconfig(dist_dir): line = line[0:position] + 'default "rt-thread"\n' found = 0 f.write(line) - + def bsp_update_kconfig_library(dist_dir): # change RTT_ROOT in Kconfig if not os.path.isfile(os.path.join(dist_dir, 'Kconfig')): @@ -141,7 +141,7 @@ def bsp_update_kconfig_library(dist_dir): found = 0 f.write(line) - # change board/kconfig path + # change board/kconfig path if not os.path.isfile(os.path.join(dist_dir, 'board/Kconfig')): return @@ -214,12 +214,21 @@ def MkDist_Strip(program, BSP_ROOT, RTT_ROOT, Env): bsp_copy_files(os.path.join(library_path, Env['bsp_lib_type']), os.path.join(library_dir, Env['bsp_lib_type'])) shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig')) + # copy at32 bsp libiary files + if os.path.basename(os.path.dirname(BSP_ROOT)) == 'at32': + print("=> copy at32 bsp library") + library_path = os.path.join(os.path.dirname(BSP_ROOT), 'Libraries') + library_dir = os.path.join(dist_dir, 'Libraries') + bsp_copy_files(os.path.join(library_path, 'rt_drivers'), os.path.join(library_dir, 'rt_drivers')) + bsp_copy_files(os.path.join(library_path, 'AT32_Std_Driver'), os.path.join(library_dir, 'AT32_Std_Driver')) + shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig')) + # do bsp special dist handle - if 'dist_handle' in Env: + if 'dist_handle' in Env: print("=> start dist handle") dist_handle = Env['dist_handle'] dist_handle(BSP_ROOT) - + # get all source files from program for item in program: walk_children(item) @@ -345,6 +354,15 @@ def MkDist(program, BSP_ROOT, RTT_ROOT, Env, rttide = None): bsp_copy_files(os.path.join(library_path, Env['bsp_lib_type']), os.path.join(library_dir, Env['bsp_lib_type'])) shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig')) + # copy at32 bsp libiary files + if os.path.basename(os.path.dirname(BSP_ROOT)) == 'at32': + print("=> copy at32 bsp library") + library_path = os.path.join(os.path.dirname(BSP_ROOT), 'Libraries') + library_dir = os.path.join(dist_dir, 'Libraries') + bsp_copy_files(os.path.join(library_path, 'rt_drivers'), os.path.join(library_dir, 'rt_drivers')) + bsp_copy_files(os.path.join(library_path, 'AT32_Std_Driver'), os.path.join(library_dir, 'AT32_Std_Driver')) + shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig')) + # do bsp special dist handle if 'dist_handle' in Env: print("=> start dist handle") From 098eccc05729b06f8e4af060d702308f6596b9c8 Mon Sep 17 00:00:00 2001 From: bigmagic Date: Fri, 17 Apr 2020 22:16:34 +0800 Subject: [PATCH 14/27] add raspi3-64 readme note --- bsp/raspberry-pi/raspi3-64/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/bsp/raspberry-pi/raspi3-64/README.md b/bsp/raspberry-pi/raspi3-64/README.md index 576b13ed0e..a8558d809e 100644 --- a/bsp/raspberry-pi/raspi3-64/README.md +++ b/bsp/raspberry-pi/raspi3-64/README.md @@ -31,6 +31,16 @@ EXEC_PATH = r'E:/env_released_1.1.2/env/tools/gnu_gcc/arm_gcc/gcc-arm-8.3-2019.0 然后在`bsp\raspberry-pi\raspi3-64\`下输入scons编译即可。 +**window环境搭建注意** + +下载完成`gcc-arm-8.3-2019.03-i686-mingw32-aarch64-elf.tar.xz`交叉编译工具链后,最好采用7-zip解压工具进行两次解压。 +确保解压目录下的`/bin/aarch64-elf-ld.exe`文件的size不为0。 +否则编译会出现如下错误: + +``` +collect2.exe:fatal error:CreateProcess:No such file or directory +``` + ### 2.2 Linux上的环境搭建 Linux下推荐使用[gcc工具][2]。Linux版本下gcc版本可采用`gcc-arm-8.3-2019.03-x86_64-aarch64-elf`。 From bcae19654162c80a8f2380794189c7b4ec242c90 Mon Sep 17 00:00:00 2001 From: bigmagic Date: Fri, 17 Apr 2020 22:19:54 +0800 Subject: [PATCH 15/27] [bsp\raspi4]move io to `iomap.h` --- bsp/raspberry-pi/raspi4/driver/board.c | 8 ++------ bsp/raspberry-pi/raspi4/driver/board.h | 2 +- bsp/raspberry-pi/raspi4/driver/drv_gpio.h | 2 -- bsp/raspberry-pi/raspi4/driver/drv_uart.c | 6 ------ bsp/raspberry-pi/raspi4/driver/drv_uart.h | 1 - bsp/raspberry-pi/raspi4/driver/iomap.h | 21 ++++++++++++++++++--- 6 files changed, 21 insertions(+), 19 deletions(-) diff --git a/bsp/raspberry-pi/raspi4/driver/board.c b/bsp/raspberry-pi/raspi4/driver/board.c index 46d629a35d..79a24d184f 100644 --- a/bsp/raspberry-pi/raspi4/driver/board.c +++ b/bsp/raspberry-pi/raspi4/driver/board.c @@ -18,10 +18,6 @@ #include "mmu.h" static rt_uint64_t timerStep; -// 0x40, 0x44, 0x48, 0x4c: Core 0~3 Timers interrupt control -#define CORE0_TIMER_IRQ_CTRL HWREG32(0xFF800040) -#define TIMER_IRQ 30 -#define NON_SECURE_TIMER_IRQ (1 << 1) int rt_hw_get_gtimer_frq(void); void rt_hw_set_gtimer_val(rt_uint64_t value); @@ -29,7 +25,7 @@ int rt_hw_get_gtimer_val(void); int rt_hw_get_cntpct_val(void); void rt_hw_gtimer_enable(void); -void core0_timer_enable_interrupt_controller() +void core0_timer_enable_interrupt_controller(void) { CORE0_TIMER_IRQ_CTRL |= NON_SECURE_TIMER_IRQ; } @@ -94,4 +90,4 @@ void rt_hw_board_init(void) #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif -} \ No newline at end of file +} diff --git a/bsp/raspberry-pi/raspi4/driver/board.h b/bsp/raspberry-pi/raspi4/driver/board.h index 66805464f2..a7c96b3276 100644 --- a/bsp/raspberry-pi/raspi4/driver/board.h +++ b/bsp/raspberry-pi/raspi4/driver/board.h @@ -12,6 +12,7 @@ #define BOARD_H__ #include +#include "iomap.h" extern unsigned char __bss_start; extern unsigned char __bss_end; @@ -22,4 +23,3 @@ extern unsigned char __bss_end; void rt_hw_board_init(void); #endif - diff --git a/bsp/raspberry-pi/raspi4/driver/drv_gpio.h b/bsp/raspberry-pi/raspi4/driver/drv_gpio.h index ebc9452cec..c4658fcebb 100644 --- a/bsp/raspberry-pi/raspi4/driver/drv_gpio.h +++ b/bsp/raspberry-pi/raspi4/driver/drv_gpio.h @@ -17,8 +17,6 @@ #include "board.h" #include "interrupt.h" -#define GPIO_BASE (0xFE000000 + 0x00200000) - #define GPIO_REG_GPFSEL0(BASE) HWREG32(BASE + 0x00) #define GPIO_REG_GPFSEL1(BASE) HWREG32(BASE + 0x04) #define GPIO_REG_GPFSEL2(BASE) HWREG32(BASE + 0x08) diff --git a/bsp/raspberry-pi/raspi4/driver/drv_uart.c b/bsp/raspberry-pi/raspi4/driver/drv_uart.c index a7ac1b5892..6a70cdfb3a 100644 --- a/bsp/raspberry-pi/raspi4/driver/drv_uart.c +++ b/bsp/raspberry-pi/raspi4/driver/drv_uart.c @@ -16,12 +16,6 @@ #include "drv_uart.h" #include "drv_gpio.h" -#define UART0_BASE (0xFE000000 + 0x00201000) -#define PL011_BASE UART0_BASE -#define IRQ_PL011 (121 + 32) - -#define UART_REFERENCE_CLOCK 48000000 - struct hw_uart_device { rt_ubase_t hw_base; diff --git a/bsp/raspberry-pi/raspi4/driver/drv_uart.h b/bsp/raspberry-pi/raspi4/driver/drv_uart.h index 4f23d7b46e..714043efd3 100644 --- a/bsp/raspberry-pi/raspi4/driver/drv_uart.h +++ b/bsp/raspberry-pi/raspi4/driver/drv_uart.h @@ -81,4 +81,3 @@ int rt_hw_uart_init(void); #endif /* DRV_UART_H__ */ - diff --git a/bsp/raspberry-pi/raspi4/driver/iomap.h b/bsp/raspberry-pi/raspi4/driver/iomap.h index 675cd147e3..3f18353904 100644 --- a/bsp/raspberry-pi/raspi4/driver/iomap.h +++ b/bsp/raspberry-pi/raspi4/driver/iomap.h @@ -1,8 +1,23 @@ #ifndef __RASPI4_H__ #define __RASPI4_H__ -#define ARM_GIC_NR_IRQS 512 -#define INTC_BASE 0xff800000 +//gpio +#define GPIO_BASE (0xFE000000 + 0x00200000) + +//uart +#define UART0_BASE (0xFE000000 + 0x00201000) +#define PL011_BASE UART0_BASE +#define IRQ_PL011 (121 + 32) +#define UART_REFERENCE_CLOCK (48000000) + +// 0x40, 0x44, 0x48, 0x4c: Core 0~3 Timers interrupt control +#define CORE0_TIMER_IRQ_CTRL HWREG32(0xFF800040) +#define TIMER_IRQ 30 +#define NON_SECURE_TIMER_IRQ (1 << 1) + +//gic max +#define ARM_GIC_NR_IRQS (512) +#define INTC_BASE (0xff800000) #define GIC_V2_DISTRIBUTOR_BASE (INTC_BASE + 0x00041000) #define GIC_V2_CPU_INTERFACE_BASE (INTC_BASE + 0x00042000) #define GIC_V2_HYPERVISOR_BASE (INTC_BASE + 0x00044000) @@ -11,4 +26,4 @@ #define GIC_PL400_DISTRIBUTOR_PPTR GIC_V2_DISTRIBUTOR_BASE #define GIC_PL400_CONTROLLER_PPTR GIC_V2_CPU_INTERFACE_BASE -#endif \ No newline at end of file +#endif From 3afb24f4c1f7530887a9f3f981bc0fdd3961c44c Mon Sep 17 00:00:00 2001 From: bigmagic Date: Fri, 17 Apr 2020 22:30:41 +0800 Subject: [PATCH 16/27] fix aarch64 compiler warning --- components/finsh/finsh.h | 4 ++-- components/finsh/finsh_compiler.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/finsh/finsh.h b/components/finsh/finsh.h index eb38682c4f..7276ea7ce1 100644 --- a/components/finsh/finsh.h +++ b/components/finsh/finsh.h @@ -27,8 +27,8 @@ #define HEAP_ALIGNMENT 4 /* heap alignment */ #define FINSH_GET16(x) (*(x)) | (*((x)+1) << 8) -#define FINSH_GET32(x) (rt_uint32_t)(*(x)) | ((rt_uint32_t)*((x)+1) << 8) | \ - ((rt_uint32_t)*((x)+2) << 16) | ((rt_uint32_t)*((x)+3) << 24) +#define FINSH_GET32(x) (rt_ubase_t)(*(x)) | ((rt_ubase_t)*((x)+1) << 8) | \ + ((rt_ubase_t)*((x)+2) << 16) | ((rt_ubase_t)*((x)+3) << 24) #define FINSH_SET16(x, v) \ do \ diff --git a/components/finsh/finsh_compiler.c b/components/finsh/finsh_compiler.c index 8d33e0e567..f81409bf9a 100644 --- a/components/finsh/finsh_compiler.c +++ b/components/finsh/finsh_compiler.c @@ -191,7 +191,7 @@ static int finsh_compile(struct finsh_node* node) case FINSH_NODE_VALUE_NULL: case FINSH_NODE_VALUE_STRING: finsh_code_byte(FINSH_OP_LD_DWORD); - finsh_code_dword((uint32_t)node->value.ptr); + finsh_code_dword((rt_ubase_t)node->value.ptr); break; /* arithmetic operation */ From bcda77bc438fdb20e4a8410fcf4825794ab0148c Mon Sep 17 00:00:00 2001 From: Huaqi Fang <578567190@qq.com> Date: Mon, 20 Apr 2020 10:33:32 +0800 Subject: [PATCH 17/27] [DOC] Add Nuclei to main README.md Mainly display Nuclei processor support Signed-off-by: Huaqi Fang <578567190@qq.com> --- README.md | 2 +- README_zh.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 09156b6ca4..d0ca35c957 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ RT-Thread supports many architectures, and has covered the major architectures i - **ARM9**:manufacturers like Allwinner、Xilinx 、GOKE - **ARM11**:manufacturers like Fullhan - **MIPS32**:manufacturers like loongson、Ingenic -- **RISC-V**:manufacturers like Hifive、Kendryte +- **RISC-V**:manufacturers like Hifive、Kendryte、[Nuclei](https://nucleisys.com/) - **ARC**:manufacturers like SYNOPSYS - **DSP**:manufacturers like TI - **C-Sky** diff --git a/README_zh.md b/README_zh.md index 4d1cc3e9e5..9cdfa30722 100644 --- a/README_zh.md +++ b/README_zh.md @@ -89,7 +89,7 @@ RT-Thread RTOS 支持许多架构,并且已经涵盖了当前应用中的主 - MIPS32:如芯片制造商loongson、Ingenic -- RISC-V:如芯片制造商Hifive、Kendryte +- RISC-V:如芯片制造商Hifive、Kendryte、[芯来Nuclei](https://nucleisys.com/) - ARC:如芯片制造商SYNOPSYS From 3b20282e13ec4d369238141f9bf980f38a742e1f Mon Sep 17 00:00:00 2001 From: xupenghu_huaweipc Date: Mon, 20 Apr 2020 19:20:56 +0800 Subject: [PATCH 18/27] add bsp/stm32l010rb-nucleo, fix some pr suggest. --- .travis.yml | 1 + bsp/stm32/stm32l010-st-nucleo/README.md | 2 +- bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.icf | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 82421e993c..8b4f03006a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -107,6 +107,7 @@ env: - RTT_BSP='stm32/stm32h743-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32h747-st-discovery' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32l4r9-st-eval' RTT_TOOL_CHAIN='sourcery-arm' + - RTT_BSP='stm32/stm32l010-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32l053-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32l432-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32l475-atk-pandora' RTT_TOOL_CHAIN='sourcery-arm' diff --git a/bsp/stm32/stm32l010-st-nucleo/README.md b/bsp/stm32/stm32l010-st-nucleo/README.md index 6b8613bb36..c69bbe14fa 100644 --- a/bsp/stm32/stm32l010-st-nucleo/README.md +++ b/bsp/stm32/stm32l010-st-nucleo/README.md @@ -29,7 +29,7 @@ NUCLEO-L010RB 开发板是 ST 官方推出的一款基于 ARM Cortex-M0+ 内核 - 20KB RAM - 512 byte EEPROM - 常用外设 - - LED:3个,USB communication(LD1 双色),power LED(LD3 红色),user LED(LD2 黄色) + - LED:3个,USB communication(LD1 双色),power LED(LD3 红色),user LED(LD2 黄色) - 按键:1个,B1(兼具唤醒功能,PC13),B2(RESET) - 常用接口:USB 支持 3 种不同接口:虚拟 COM 端口、大容量存储和调试端口;arduino 接口等 - 调试接口:标准 SWD diff --git a/bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.icf index 24d6f5275c..1d998fe063 100644 --- a/bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.icf +++ b/bsp/stm32/stm32l010-st-nucleo/board/linker_scripts/link.icf @@ -26,4 +26,4 @@ do not initialize { section .noinit }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; place in ROM_region { readonly }; -place in RAM_region { readwrite, last block CSTACK}; \ No newline at end of file +place in RAM_region { readwrite, last block CSTACK}; From e1bd3673fd428ffbfd04d2f51a1a9be6fbfe832d Mon Sep 17 00:00:00 2001 From: luhuadong Date: Wed, 22 Apr 2020 16:58:10 +0800 Subject: [PATCH 19/27] [AT32 BSP] do bsp special dist handle --- bsp/at32/at32f403a-start/Kconfig | 3 +-- bsp/at32/at32f403a-start/rtconfig.py | 7 +++++++ bsp/at32/tools/sdk_dist.py | 19 +++++++++++++++++++ tools/mkdist.py | 18 ------------------ 4 files changed, 27 insertions(+), 20 deletions(-) create mode 100644 bsp/at32/tools/sdk_dist.py diff --git a/bsp/at32/at32f403a-start/Kconfig b/bsp/at32/at32f403a-start/Kconfig index 7a400db91f..1a3b4b75bc 100644 --- a/bsp/at32/at32f403a-start/Kconfig +++ b/bsp/at32/at32f403a-start/Kconfig @@ -17,6 +17,5 @@ config PKGS_DIR source "$RTT_DIR/Kconfig" source "$PKGS_DIR/Kconfig" -source "../libraries/Kconfig" +source "../Libraries/Kconfig" source "board/Kconfig" - diff --git a/bsp/at32/at32f403a-start/rtconfig.py b/bsp/at32/at32f403a-start/rtconfig.py index 4800f9a871..5f2f01ca76 100644 --- a/bsp/at32/at32f403a-start/rtconfig.py +++ b/bsp/at32/at32f403a-start/rtconfig.py @@ -1,4 +1,5 @@ import os +import sys # toolchains options ARCH='arm' @@ -141,3 +142,9 @@ elif PLATFORM == 'iar': EXEC_PATH = EXEC_PATH + '/arm/bin/' POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' + +def dist_handle(BSP_ROOT): + cwd_path = os.getcwd() + sys.path.append(os.path.join(os.path.dirname(BSP_ROOT), 'tools')) + from sdk_dist import dist_do_building + dist_do_building(BSP_ROOT) diff --git a/bsp/at32/tools/sdk_dist.py b/bsp/at32/tools/sdk_dist.py new file mode 100644 index 0000000000..01ff930b20 --- /dev/null +++ b/bsp/at32/tools/sdk_dist.py @@ -0,0 +1,19 @@ +import os +import sys +import shutil +cwd_path = os.getcwd() +sys.path.append(os.path.join(os.path.dirname(cwd_path), 'rt-thread', 'tools')) + +# BSP dist function +def dist_do_building(BSP_ROOT): + from mkdist import bsp_copy_files + import rtconfig + + dist_dir = os.path.join(BSP_ROOT, 'dist', os.path.basename(BSP_ROOT)) + library_path = os.path.join(os.path.dirname(BSP_ROOT), 'Libraries') + library_dir = os.path.join(dist_dir, 'Libraries') + print("=> copy bsp drivers") + bsp_copy_files(os.path.join(library_path, 'rt_drivers'), os.path.join(library_dir, 'rt_drivers')) + print("=> copy bsp library") + bsp_copy_files(os.path.join(library_path, rtconfig.BSP_LIBRARY_TYPE), os.path.join(library_dir, rtconfig.BSP_LIBRARY_TYPE)) + shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig')) diff --git a/tools/mkdist.py b/tools/mkdist.py index 2f12ad8f12..d83020f755 100644 --- a/tools/mkdist.py +++ b/tools/mkdist.py @@ -214,15 +214,6 @@ def MkDist_Strip(program, BSP_ROOT, RTT_ROOT, Env): bsp_copy_files(os.path.join(library_path, Env['bsp_lib_type']), os.path.join(library_dir, Env['bsp_lib_type'])) shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig')) - # copy at32 bsp libiary files - if os.path.basename(os.path.dirname(BSP_ROOT)) == 'at32': - print("=> copy at32 bsp library") - library_path = os.path.join(os.path.dirname(BSP_ROOT), 'Libraries') - library_dir = os.path.join(dist_dir, 'Libraries') - bsp_copy_files(os.path.join(library_path, 'rt_drivers'), os.path.join(library_dir, 'rt_drivers')) - bsp_copy_files(os.path.join(library_path, 'AT32_Std_Driver'), os.path.join(library_dir, 'AT32_Std_Driver')) - shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig')) - # do bsp special dist handle if 'dist_handle' in Env: print("=> start dist handle") @@ -354,15 +345,6 @@ def MkDist(program, BSP_ROOT, RTT_ROOT, Env, rttide = None): bsp_copy_files(os.path.join(library_path, Env['bsp_lib_type']), os.path.join(library_dir, Env['bsp_lib_type'])) shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig')) - # copy at32 bsp libiary files - if os.path.basename(os.path.dirname(BSP_ROOT)) == 'at32': - print("=> copy at32 bsp library") - library_path = os.path.join(os.path.dirname(BSP_ROOT), 'Libraries') - library_dir = os.path.join(dist_dir, 'Libraries') - bsp_copy_files(os.path.join(library_path, 'rt_drivers'), os.path.join(library_dir, 'rt_drivers')) - bsp_copy_files(os.path.join(library_path, 'AT32_Std_Driver'), os.path.join(library_dir, 'AT32_Std_Driver')) - shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig')) - # copy nuclei bsp libiary files if os.path.basename(os.path.dirname(BSP_ROOT)) == 'nuclei': print("=> copy nuclei bsp library") From ef00e50ad5603573346a3a1ba8497550af66a26a Mon Sep 17 00:00:00 2001 From: yangjie Date: Thu, 23 Apr 2020 16:21:01 +0800 Subject: [PATCH 20/27] =?UTF-8?q?[bsp][stm32l475-atk-pandora]=E5=B0=86SPI3?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=B8=BA=20transmit=20only=20master=20?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=EF=BC=8C=E9=98=B2=E6=AD=A2LCD=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E4=BD=BF=E7=94=A8=E7=9A=84PIN=E8=84=9A=E8=A2=ABSPI3?= =?UTF-8?q?=5FMISO=E5=8D=A0=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/CubeMX_Config/.mxproject | 8 +- .../board/CubeMX_Config/STM32L475VE.ioc | 695 +++++++++--------- .../CubeMX_Config/Src/stm32l4xx_hal_msp.c | 6 +- 3 files changed, 352 insertions(+), 357 deletions(-) diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/.mxproject index b2abade8d0..f56464c131 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/.mxproject +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/.mxproject @@ -1,14 +1,14 @@ [PreviousGenFiles] -HeaderPath=E:/1-thread-source/rt-thread-h/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc +HeaderPath=E:/1-thread-source/rt-thread_f/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc HeaderFiles=stm32l4xx_it.h;stm32l4xx_hal_conf.h;main.h; -SourcePath=E:/1-thread-source/rt-thread-h/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src +SourcePath=E:/1-thread-source/rt-thread_f/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src SourceFiles=stm32l4xx_it.c;stm32l4xx_hal_msp.c;main.c; [PreviousLibFiles] -LibFiles=Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_iwdg.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_lptim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_qspi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sai.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sai_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_sdmmc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sd.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sd_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_usb.h;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_lptim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_sdmmc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sd.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sd_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_iwdg.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_lptim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_qspi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sai.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sai_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_sdmmc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sd.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sd_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_usb.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l475xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/system_stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c; +LibFiles=Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_iwdg.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_lptim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_qspi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sai.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sai_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_sdmmc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sd.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sd_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_usb.h;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_lptim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_sdmmc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sd.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sd_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_iwdg.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_lptim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_qspi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sai.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sai_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_sdmmc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sd.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_sd_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_usb.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l475xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/system_stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/tz_context.h; [PreviousUsedKeilFiles] -SourceFiles=..\Src\main.c;..\Src\stm32l4xx_it.c;..\Src\stm32l4xx_hal_msp.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_lptim.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c;..\\Src/system_stm32l4xx.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_lptim.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c;..\\Src/system_stm32l4xx.c;..\Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;; +SourceFiles=..\Src\main.c;..\Src\stm32l4xx_it.c;..\Src\stm32l4xx_hal_msp.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_lptim.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_sdmmc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sd.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sd_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c;..\\Src/system_stm32l4xx.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_lptim.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_sdmmc.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sd.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sd_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c;..\Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c;..\\Src/system_stm32l4xx.c;..\Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;; HeaderPath=..\Drivers\STM32L4xx_HAL_Driver\Inc;..\Drivers\STM32L4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32L4xx\Include;..\Drivers\CMSIS\Include;..\Inc; CDefines=USE_HAL_DRIVER;STM32L475xx;USE_HAL_DRIVER;USE_HAL_DRIVER; diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/STM32L475VE.ioc b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/STM32L475VE.ioc index 13064b21c0..5b1083a232 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/STM32L475VE.ioc +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/STM32L475VE.ioc @@ -1,366 +1,363 @@ #MicroXplorer Configuration settings - do not modify -ADC1.Channel-15\#ChannelRegularConversion=ADC_CHANNEL_14 -ADC1.IPParameters=Rank-15\#ChannelRegularConversion,Channel-15\#ChannelRegularConversion,SamplingTime-15\#ChannelRegularConversion,OffsetNumber-15\#ChannelRegularConversion,NbrOfConversionFlag,master -ADC1.NbrOfConversionFlag=1 -ADC1.OffsetNumber-15\#ChannelRegularConversion=ADC_OFFSET_NONE -ADC1.Rank-15\#ChannelRegularConversion=1 -ADC1.SamplingTime-15\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5 -ADC1.master=1 -File.Version=6 -KeepUserPlacement=false Mcu.Family=STM32L4 -Mcu.IP0=ADC1 -Mcu.IP1=IWDG -Mcu.IP10=SPI2 -Mcu.IP11=SPI3 -Mcu.IP12=SYS -Mcu.IP13=TIM1 -Mcu.IP14=TIM2 -Mcu.IP15=TIM4 -Mcu.IP16=TIM15 -Mcu.IP17=TIM16 -Mcu.IP18=TIM17 -Mcu.IP19=USART1 -Mcu.IP2=LPTIM1 -Mcu.IP20=USART2 -Mcu.IP21=USB_OTG_FS -Mcu.IP3=NVIC +ProjectManager.MainLocation=Src +PA6.Mode=Full_Duplex_Master +SH.S_TIM4_CH2.ConfNb=1 +RCC.USART1Freq_Value=80000000 +RCC.SAI1Freq_Value=13714285.714285715 +USART2.IPParameters=VirtualMode-Asynchronous +RCC.CortexFreq_Value=80000000 +SPI3.Direction=SPI_DIRECTION_2LINES +VP_TIM17_VS_ClockSourceINT.Mode=Enable_Timer +SPI3.VirtualType=VM_MASTER +ProjectManager.KeepUserCode=true +Mcu.UserName=STM32L475VETx +SPI1.VirtualType=VM_MASTER +SPI2.VirtualType=VM_MASTER +PH0-OSC_IN\ (PH0).Signal=RCC_OSC_IN +TIM1.IPParameters=Channel-PWM Generation1 CH1 +PC10.Signal=SDMMC1_D2 +PC12.Signal=SDMMC1_CK +VP_IWDG_VS_IWDG.Mode=IWDG_Activate +RCC.PLLSAI1RoutputFreq_Value=48000000 +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_USART2_UART_Init-USART2-false-HAL-true,5-MX_QUADSPI_Init-QUADSPI-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true,7-MX_SPI2_Init-SPI2-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_ADC1_Init-ADC1-false-HAL-true,10-MX_IWDG_Init-IWDG-false-HAL-true,11-MX_TIM17_Init-TIM17-false-HAL-true,12-MX_TIM16_Init-TIM16-false-HAL-true,13-MX_TIM15_Init-TIM15-false-HAL-true,14-MX_TIM4_Init-TIM4-false-HAL-true,15-MX_TIM1_Init-TIM1-false-HAL-true,16-MX_SAI1_Init-SAI1-false-HAL-true,17-MX_SPI3_Init-SPI3-false-HAL-true,18-MX_TIM2_Init-TIM2-false-HAL-true,19-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true +SAI1.VirtualProtocol-SAI_A_BASIC=VM_BASIC_PROTOCOL +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +SAI1.Instance-SAI_A_MasterWithClock=SAI$Index_Block_A +PA11.Mode=Device_Only +RCC.RTCFreq_Value=32768 +RCC.USART2Freq_Value=80000000 +PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator +SH.S_TIM1_CH1.ConfNb=1 +USART1.IPParameters=VirtualMode-Asynchronous +PB11.Signal=S_TIM2_CH4 +PB13.Signal=SPI2_SCK +PB15.Signal=SPI2_MOSI +PinOutPanel.RotationAngle=0 +RCC.MCO1PinFreq_Value=80000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +ProjectManager.StackSize=0x400 +PB3\ (JTDO-TRACESWO).Signal=SPI3_SCK +PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator +PA14\ (JTCK-SWCLK).Signal=SYS_JTCK-SWCLK +RCC.I2C3Freq_Value=80000000 +RCC.LPTIM1Freq_Value=80000000 Mcu.IP4=QUADSPI Mcu.IP5=RCC -Mcu.IP6=RTC -Mcu.IP7=SAI1 -Mcu.IP8=SDMMC1 -Mcu.IP9=SPI1 -Mcu.IPNb=22 -Mcu.Name=STM32L475V(C-E-G)Tx -Mcu.Package=LQFP100 -Mcu.Pin0=PE2 -Mcu.Pin1=PE3 -Mcu.Pin10=PA3 -Mcu.Pin11=PA5 -Mcu.Pin12=PA6 -Mcu.Pin13=PA7 -Mcu.Pin14=PC5 -Mcu.Pin15=PE9 -Mcu.Pin16=PE10 -Mcu.Pin17=PE11 -Mcu.Pin18=PE12 -Mcu.Pin19=PE13 -Mcu.Pin2=PE4 -Mcu.Pin20=PE14 -Mcu.Pin21=PE15 -Mcu.Pin22=PB10 -Mcu.Pin23=PB11 -Mcu.Pin24=PB13 -Mcu.Pin25=PB14 -Mcu.Pin26=PB15 -Mcu.Pin27=PC8 -Mcu.Pin28=PC9 -Mcu.Pin29=PA9 -Mcu.Pin3=PE5 -Mcu.Pin30=PA10 -Mcu.Pin31=PA11 -Mcu.Pin32=PA12 -Mcu.Pin33=PA13 (JTMS-SWDIO) -Mcu.Pin34=PA14 (JTCK-SWCLK) -Mcu.Pin35=PC10 -Mcu.Pin36=PC11 -Mcu.Pin37=PC12 -Mcu.Pin38=PD2 -Mcu.Pin39=PB3 (JTDO-TRACESWO) -Mcu.Pin4=PE6 -Mcu.Pin40=PB4 (NJTRST) -Mcu.Pin41=PB5 -Mcu.Pin42=PB7 -Mcu.Pin43=PB8 -Mcu.Pin44=VP_IWDG_VS_IWDG -Mcu.Pin45=VP_LPTIM1_VS_LPTIM_counterModeInternalClock -Mcu.Pin46=VP_RTC_VS_RTC_Activate -Mcu.Pin47=VP_SAI1_VP_$IpInstance_SAIA_SAI_BASIC -Mcu.Pin48=VP_SAI1_VP_$IpInstance_SAIB_SAI_BASIC -Mcu.Pin49=VP_SYS_VS_Systick -Mcu.Pin5=PC14-OSC32_IN (PC14) -Mcu.Pin50=VP_TIM1_VS_ClockSourceINT -Mcu.Pin51=VP_TIM2_VS_ClockSourceINT -Mcu.Pin52=VP_TIM4_VS_ClockSourceINT -Mcu.Pin53=VP_TIM15_VS_ClockSourceINT -Mcu.Pin54=VP_TIM16_VS_ClockSourceINT -Mcu.Pin55=VP_TIM17_VS_ClockSourceINT -Mcu.Pin6=PC15-OSC32_OUT (PC15) -Mcu.Pin7=PH0-OSC_IN (PH0) -Mcu.Pin8=PH1-OSC_OUT (PH1) -Mcu.Pin9=PA2 -Mcu.PinsNb=56 -Mcu.ThirdPartyNb=0 -Mcu.UserConstants= -Mcu.UserName=STM32L475VETx -MxCube.Version=5.6.0 -MxDb.Version=DB.5.0.60 -NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false -NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false -NVIC.ForceEnableDMAVector=true -NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false -NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false -NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false -NVIC.OTG_FS_IRQn=true\:0\:0\:false\:false\:true\:true\:true -NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false -NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +RCC.FCLKCortexFreq_Value=80000000 +Mcu.IP2=LPTIM1 NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false -NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true -NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false -PA10.Mode=Asynchronous -PA10.Signal=USART1_RX -PA11.Mode=Device_Only -PA11.Signal=USB_OTG_FS_DM -PA12.Mode=Device_Only +Mcu.IP3=NVIC +Mcu.IP0=ADC1 +Mcu.IP1=IWDG PA12.Signal=USB_OTG_FS_DP -PA13\ (JTMS-SWDIO).Mode=Serial_Wire +Mcu.UserConstants= +PE11.Mode=Single Bank +RCC.VCOSAI1OutputFreq_Value=96000000 +SAI1.VirtualMode-SAI_B_SyncSlave=VM_SLAVE +RCC.SDMMCFreq_Value=48000000 +Mcu.ThirdPartyNb=0 +SPI1.Direction=SPI_DIRECTION_2LINES +RCC.HCLKFreq_Value=80000000 +PE2.Mode=SAI_A_MasterWithClock +Mcu.IPNb=22 +TIM2.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4 +ProjectManager.PreviousToolchain= +RCC.APB2TimFreq_Value=80000000 +VP_SAI1_VP_$IpInstance_SAIB_SAI_BASIC.Signal=SAI1_VP_$IpInstance_SAIB_SAI_BASIC +SPI1.CalculateBaudRate=40.0 MBits/s +Mcu.Pin6=PC15-OSC32_OUT (PC15) +RCC.SAI2Freq_Value=13714285.714285715 +Mcu.Pin7=PH0-OSC_IN (PH0) +VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT +Mcu.Pin8=PH1-OSC_OUT (PH1) +PE5.Signal=SAI1_SCK_A +Mcu.Pin9=PA2 +RCC.AHBFreq_Value=80000000 +PB13.Locked=true +Mcu.Pin0=PE2 +PE14.Locked=true +Mcu.Pin1=PE3 +Mcu.Pin2=PE4 +Mcu.Pin3=PE5 +RCC.USART3Freq_Value=80000000 +Mcu.Pin4=PE6 +Mcu.Pin5=PC14-OSC32_IN (PC14) +ProjectManager.ProjectBuild=false +PH1-OSC_OUT\ (PH1).Mode=HSE-External-Oscillator +RCC.HSE_VALUE=8000000 +TIM4.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false +SH.ADCx_IN14.ConfNb=1 +Mcu.IP10=SPI2 +USART2.VirtualMode-Asynchronous=VM_ASYNC +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true +RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE +Mcu.IP12=SYS +Mcu.IP11=SPI3 +ADC1.OffsetNumber-15\#ChannelRegularConversion=ADC_OFFSET_NONE +Mcu.IP18=TIM17 +ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.15.1 +Mcu.IP17=TIM16 +MxDb.Version=DB.5.0.60 +PE15.Locked=true +Mcu.IP19=USART1 +Mcu.IP14=TIM2 +Mcu.IP13=TIM1 +PE13.Signal=QUADSPI_BK1_IO1 +Mcu.IP16=TIM15 +ProjectManager.BackupPrevious=false +Mcu.IP15=TIM4 +RCC.VCOInputFreq_Value=8000000 +TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 +PE9.Signal=S_TIM1_CH1 +PB14.Mode=Full_Duplex_Master +PB5.Mode=TX_Only_Simplex_Unidirect_Master +File.Version=6 +PC9.Mode=SD_4_bits_Wide_bus +SPI2.CalculateBaudRate=40.0 MBits/s +SAI1.InitProtocol-SAI_A_MasterWithClock=Enable +SH.S_TIM4_CH2.0=TIM4_CH2,PWM Generation2 CH2 +PE2.Signal=SAI1_MCLK_A +PB7.Signal=S_TIM4_CH2 +Mcu.IP21=USB_OTG_FS +PB8.Locked=true +Mcu.IP20=USART2 +RCC.PLLRCLKFreq_Value=80000000 +PE13.Mode=Single Bank +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false +PE4.Mode=SAI_A_MasterWithClock +ADC1.Channel-15\#ChannelRegularConversion=ADC_CHANNEL_14 +PE4.Signal=SAI1_FS_A +PE10.Signal=QUADSPI_CLK +VP_TIM15_VS_ClockSourceINT.Signal=TIM15_VS_ClockSourceINT +ProjectManager.HalAssertFull=false +VP_TIM1_VS_ClockSourceINT.Mode=Internal +ProjectManager.ProjectName=STM32L475VE +ADC1.Rank-15\#ChannelRegularConversion=1 +SAI1.OutputDrive-SAI_A_MasterWithClock=SAI_OUTPUTDRIVE_ENABLE +Mcu.Package=LQFP100 +SAI1.AudioFrequency-SAI_A_MasterWithClock=SAI_AUDIO_FREQUENCY_44K +PA6.Signal=SPI1_MISO +SPI2.Mode=SPI_MODE_MASTER +SPI3.Mode=SPI_MODE_MASTER +SH.ADCx_IN14.0=ADC1_IN14,IN14-Single-Ended +NVIC.OTG_FS_IRQn=true\:0\:0\:false\:false\:true\:true\:true +ProjectManager.ToolChainLocation= +RCC.LSI_VALUE=32000 +VP_LPTIM1_VS_LPTIM_counterModeInternalClock.Mode=Counts__internal_clock_event_00 +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +RCC.LSCOPinFreq_Value=32000 +PA10.Signal=USART1_RX +USB_OTG_FS.VirtualMode=Device_Only +RCC.DFSDMFreq_Value=80000000 +PC11.Mode=SD_4_bits_Wide_bus +ADC1.SamplingTime-15\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5 +RCC.PLLPoutputFreq_Value=22857142.85714286 +RCC.APB1TimFreq_Value=80000000 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +RCC.LPUART1Freq_Value=80000000 +SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +SPI2.Direction=SPI_DIRECTION_2LINES +PC5.Signal=ADCx_IN14 +USB_OTG_FS.IPParameters=VirtualMode +PB13.Mode=Full_Duplex_Master +SH.S_TIM2_CH4.ConfNb=1 PA13\ (JTMS-SWDIO).Signal=SYS_JTMS-SWDIO -PA14\ (JTCK-SWCLK).Mode=Serial_Wire -PA14\ (JTCK-SWCLK).Signal=SYS_JTCK-SWCLK -PA2.Mode=Asynchronous -PA2.Signal=USART2_TX -PA3.Mode=Asynchronous +PH0-OSC_IN\ (PH0).Mode=HSE-External-Oscillator +PE12.Locked=true +PE3.Mode=SAI_B_SyncSlave +ProjectManager.CustomerFirmwarePackage= +PB15.Locked=true +PB3\ (JTDO-TRACESWO).Locked=true +RCC.PLLSAI1N=12 PA3.Signal=USART2_RX PA5.Mode=Full_Duplex_Master -PA5.Signal=SPI1_SCK -PA6.Mode=Full_Duplex_Master -PA6.Signal=SPI1_MISO -PA7.Mode=Full_Duplex_Master -PA7.Signal=SPI1_MOSI -PA9.Mode=Asynchronous -PA9.Signal=USART1_TX -PB10.Signal=S_TIM2_CH3 -PB11.Signal=S_TIM2_CH4 -PB13.Locked=true -PB13.Mode=Full_Duplex_Master -PB13.Signal=SPI2_SCK -PB14.Locked=true -PB14.Mode=Full_Duplex_Master -PB14.Signal=SPI2_MISO -PB15.Locked=true -PB15.Mode=Full_Duplex_Master -PB15.Signal=SPI2_MOSI -PB3\ (JTDO-TRACESWO).Locked=true -PB3\ (JTDO-TRACESWO).Mode=Full_Duplex_Master -PB3\ (JTDO-TRACESWO).Signal=SPI3_SCK -PB4\ (NJTRST).Mode=Full_Duplex_Master -PB4\ (NJTRST).Signal=SPI3_MISO -PB5.Locked=true -PB5.Mode=Full_Duplex_Master -PB5.Signal=SPI3_MOSI -PB7.Locked=true -PB7.Signal=S_TIM4_CH2 -PB8.Locked=true -PB8.Signal=S_TIM4_CH3 -PC10.Mode=SD_4_bits_Wide_bus -PC10.Signal=SDMMC1_D2 -PC11.Mode=SD_4_bits_Wide_bus -PC11.Signal=SDMMC1_D3 -PC12.Mode=SD_4_bits_Wide_bus -PC12.Signal=SDMMC1_CK -PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator -PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN -PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator -PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT -PC5.Signal=ADCx_IN14 -PC8.Mode=SD_4_bits_Wide_bus -PC8.Signal=SDMMC1_D0 -PC9.Mode=SD_4_bits_Wide_bus -PC9.Signal=SDMMC1_D1 -PD2.Mode=SD_4_bits_Wide_bus -PD2.Signal=SDMMC1_CMD -PE10.Mode=Single Bank -PE10.Signal=QUADSPI_CLK -PE11.Mode=Single Bank -PE11.Signal=QUADSPI_NCS -PE12.Locked=true PE12.Mode=Single Bank -PE12.Signal=QUADSPI_BK1_IO0 -PE13.Locked=true -PE13.Mode=Single Bank -PE13.Signal=QUADSPI_BK1_IO1 -PE14.Locked=true -PE14.Mode=Single Bank -PE14.Signal=QUADSPI_BK1_IO2 -PE15.Locked=true -PE15.Mode=Single Bank -PE15.Signal=QUADSPI_BK1_IO3 -PE2.Mode=SAI_A_MasterWithClock -PE2.Signal=SAI1_MCLK_A -PE3.Mode=SAI_B_SyncSlave -PE3.Signal=SAI1_SD_B -PE4.Mode=SAI_A_MasterWithClock -PE4.Signal=SAI1_FS_A -PE5.Mode=SAI_A_MasterWithClock -PE5.Signal=SAI1_SCK_A -PE6.Mode=SAI_A_MasterWithClock -PE6.Signal=SAI1_SD_A -PE9.Signal=S_TIM1_CH1 -PH0-OSC_IN\ (PH0).Mode=HSE-External-Oscillator -PH0-OSC_IN\ (PH0).Signal=RCC_OSC_IN -PH1-OSC_OUT\ (PH1).Mode=HSE-External-Oscillator -PH1-OSC_OUT\ (PH1).Signal=RCC_OSC_OUT -PinOutPanel.RotationAngle=0 -ProjectManager.AskForMigrate=true -ProjectManager.BackupPrevious=false -ProjectManager.CompilerOptimize=6 -ProjectManager.ComputerToolchain=false -ProjectManager.CoupleFile=false -ProjectManager.CustomerFirmwarePackage= -ProjectManager.DefaultFWLocation=true -ProjectManager.DeletePrevious=true -ProjectManager.DeviceId=STM32L475VETx -ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.15.1 -ProjectManager.FreePins=false -ProjectManager.HalAssertFull=false -ProjectManager.HeapSize=0x200 -ProjectManager.KeepUserCode=true -ProjectManager.LastFirmware=true -ProjectManager.LibraryCopy=0 -ProjectManager.MainLocation=Src -ProjectManager.NoMain=false -ProjectManager.PreviousToolchain= -ProjectManager.ProjectBuild=false -ProjectManager.ProjectFileName=STM32L475VE.ioc -ProjectManager.ProjectName=STM32L475VE -ProjectManager.StackSize=0x400 -ProjectManager.TargetToolchain=MDK-ARM V5 -ProjectManager.ToolChainLocation= -ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_USART2_UART_Init-USART2-false-HAL-true,5-MX_QUADSPI_Init-QUADSPI-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true,7-MX_SPI2_Init-SPI2-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_ADC1_Init-ADC1-false-HAL-true,10-MX_IWDG_Init-IWDG-false-HAL-true,11-MX_TIM17_Init-TIM17-false-HAL-true,12-MX_TIM16_Init-TIM16-false-HAL-true,13-MX_TIM15_Init-TIM15-false-HAL-true,14-MX_TIM4_Init-TIM4-false-HAL-true,15-MX_TIM1_Init-TIM1-false-HAL-true,16-MX_SAI1_Init-SAI1-false-HAL-true,17-MX_SPI3_Init-SPI3-false-HAL-true,18-MX_TIM2_Init-TIM2-false-HAL-true,19-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true -RCC.ADCFreq_Value=48000000 -RCC.AHBFreq_Value=80000000 -RCC.APB1Freq_Value=80000000 -RCC.APB1TimFreq_Value=80000000 -RCC.APB2Freq_Value=80000000 -RCC.APB2TimFreq_Value=80000000 -RCC.CortexFreq_Value=80000000 -RCC.DFSDMFreq_Value=80000000 -RCC.FCLKCortexFreq_Value=80000000 -RCC.FamilyName=M -RCC.HCLKFreq_Value=80000000 -RCC.HSE_VALUE=8000000 -RCC.HSI_VALUE=16000000 -RCC.I2C1Freq_Value=80000000 -RCC.I2C2Freq_Value=80000000 -RCC.I2C3Freq_Value=80000000 -RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1N,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PLLSAI2RoutputFreq_Value,PLLSourceVirtual,PWRFreq_Value,RNGFreq_Value,RTCClockSelection,RTCFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value -RCC.LPTIM1Freq_Value=80000000 -RCC.LPTIM2Freq_Value=80000000 -RCC.LPUART1Freq_Value=80000000 -RCC.LSCOPinFreq_Value=32000 -RCC.LSI_VALUE=32000 -RCC.MCO1PinFreq_Value=80000000 -RCC.MSI_VALUE=4000000 -RCC.PLLN=20 -RCC.PLLPoutputFreq_Value=22857142.85714286 -RCC.PLLQoutputFreq_Value=80000000 -RCC.PLLRCLKFreq_Value=80000000 -RCC.PLLSAI1N=12 -RCC.PLLSAI1PoutputFreq_Value=13714285.714285715 -RCC.PLLSAI1QoutputFreq_Value=48000000 -RCC.PLLSAI1RoutputFreq_Value=48000000 -RCC.PLLSAI2PoutputFreq_Value=9142857.142857144 -RCC.PLLSAI2RoutputFreq_Value=32000000 -RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE -RCC.PWRFreq_Value=80000000 -RCC.RNGFreq_Value=48000000 -RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE -RCC.RTCFreq_Value=32768 -RCC.SAI1Freq_Value=13714285.714285715 -RCC.SAI2Freq_Value=13714285.714285715 -RCC.SDMMCFreq_Value=48000000 -RCC.SWPMI1Freq_Value=80000000 -RCC.SYSCLKFreq_VALUE=80000000 -RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK -RCC.UART4Freq_Value=80000000 -RCC.UART5Freq_Value=80000000 -RCC.USART1Freq_Value=80000000 -RCC.USART2Freq_Value=80000000 -RCC.USART3Freq_Value=80000000 -RCC.USBFreq_Value=48000000 -RCC.VCOInputFreq_Value=8000000 -RCC.VCOOutputFreq_Value=160000000 -RCC.VCOSAI1OutputFreq_Value=96000000 -RCC.VCOSAI2OutputFreq_Value=64000000 -SAI1.AudioFrequency-SAI_A_MasterWithClock=SAI_AUDIO_FREQUENCY_44K -SAI1.ErrorAudioFreq-SAI_A_MasterWithClock=-72.09 % -SAI1.IPParameters=Instance-SAI_A_MasterWithClock,VirtualMode-SAI_A_MasterWithClock,MClockEnable-SAI_A_MasterWithClock,RealAudioFreq-SAI_A_MasterWithClock,ErrorAudioFreq-SAI_A_MasterWithClock,InitProtocol-SAI_A_MasterWithClock,VirtualProtocol-SAI_A_BASIC,AudioFrequency-SAI_A_MasterWithClock,OutputDrive-SAI_A_MasterWithClock,Instance-SAI_B_SyncSlave,VirtualMode-SAI_B_SyncSlave,InitProtocol-SAI_B_SyncSlave,VirtualProtocol-SAI_B_BASIC -SAI1.InitProtocol-SAI_A_MasterWithClock=Enable -SAI1.InitProtocol-SAI_B_SyncSlave=Enable -SAI1.Instance-SAI_A_MasterWithClock=SAI$Index_Block_A -SAI1.Instance-SAI_B_SyncSlave=SAI$Index_Block_B -SAI1.MClockEnable-SAI_A_MasterWithClock=SAI_MASTERCLOCK_ENABLE -SAI1.OutputDrive-SAI_A_MasterWithClock=SAI_OUTPUTDRIVE_ENABLE -SAI1.RealAudioFreq-SAI_A_MasterWithClock=53.571 KHz -SAI1.VirtualMode-SAI_A_MasterWithClock=VM_MASTER -SAI1.VirtualMode-SAI_B_SyncSlave=VM_SLAVE -SAI1.VirtualProtocol-SAI_A_BASIC=VM_BASIC_PROTOCOL -SAI1.VirtualProtocol-SAI_B_BASIC=VM_BASIC_PROTOCOL -SH.ADCx_IN14.0=ADC1_IN14,IN14-Single-Ended -SH.ADCx_IN14.ConfNb=1 -SH.S_TIM1_CH1.0=TIM1_CH1,PWM Generation1 CH1 -SH.S_TIM1_CH1.ConfNb=1 -SH.S_TIM2_CH3.0=TIM2_CH3,PWM Generation3 CH3 -SH.S_TIM2_CH3.ConfNb=1 -SH.S_TIM2_CH4.0=TIM2_CH4,PWM Generation4 CH4 -SH.S_TIM2_CH4.ConfNb=1 -SH.S_TIM4_CH2.0=TIM4_CH2,PWM Generation2 CH2 -SH.S_TIM4_CH2.ConfNb=1 -SH.S_TIM4_CH3.0=TIM4_CH3,PWM Generation3 CH3 -SH.S_TIM4_CH3.ConfNb=1 -SPI1.CalculateBaudRate=40.0 MBits/s -SPI1.Direction=SPI_DIRECTION_2LINES -SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate -SPI1.Mode=SPI_MODE_MASTER -SPI1.VirtualType=VM_MASTER -SPI2.CalculateBaudRate=40.0 MBits/s -SPI2.Direction=SPI_DIRECTION_2LINES -SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate -SPI2.Mode=SPI_MODE_MASTER -SPI2.VirtualType=VM_MASTER -SPI3.CalculateBaudRate=40.0 MBits/s -SPI3.Direction=SPI_DIRECTION_2LINES -SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate -SPI3.Mode=SPI_MODE_MASTER -SPI3.VirtualType=VM_MASTER -TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 -TIM1.IPParameters=Channel-PWM Generation1 CH1 -TIM2.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 -TIM2.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 -TIM2.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4 -TIM4.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 -TIM4.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 -TIM4.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation2 CH2 -USART1.IPParameters=VirtualMode-Asynchronous -USART1.VirtualMode-Asynchronous=VM_ASYNC -USART2.IPParameters=VirtualMode-Asynchronous -USART2.VirtualMode-Asynchronous=VM_ASYNC -USB_OTG_FS.IPParameters=VirtualMode -USB_OTG_FS.VirtualMode=Device_Only -VP_IWDG_VS_IWDG.Mode=IWDG_Activate -VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG -VP_LPTIM1_VS_LPTIM_counterModeInternalClock.Mode=Counts__internal_clock_event_00 -VP_LPTIM1_VS_LPTIM_counterModeInternalClock.Signal=LPTIM1_VS_LPTIM_counterModeInternalClock -VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +RCC.MSI_VALUE=4000000 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +PA14\ (JTCK-SWCLK).Mode=Serial_Wire +RCC.PLLQoutputFreq_Value=80000000 +ProjectManager.ProjectFileName=STM32L475VE.ioc +TIM2.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 +PA7.Mode=Full_Duplex_Master +PA10.Mode=Asynchronous +Mcu.PinsNb=55 VP_SAI1_VP_$IpInstance_SAIA_SAI_BASIC.Mode=SAI_A_BASIC +ProjectManager.NoMain=false +SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +ADC1.IPParameters=Rank-15\#ChannelRegularConversion,Channel-15\#ChannelRegularConversion,SamplingTime-15\#ChannelRegularConversion,OffsetNumber-15\#ChannelRegularConversion,NbrOfConversionFlag,master +SAI1.MClockEnable-SAI_A_MasterWithClock=SAI_MASTERCLOCK_ENABLE +PC11.Signal=SDMMC1_D3 +RCC.SWPMI1Freq_Value=80000000 +PC8.Signal=SDMMC1_D0 +PE10.Mode=Single Bank +PC10.Mode=SD_4_bits_Wide_bus VP_SAI1_VP_$IpInstance_SAIA_SAI_BASIC.Signal=SAI1_VP_$IpInstance_SAIA_SAI_BASIC -VP_SAI1_VP_$IpInstance_SAIB_SAI_BASIC.Mode=SAI_B_BASIC -VP_SAI1_VP_$IpInstance_SAIB_SAI_BASIC.Signal=SAI1_VP_$IpInstance_SAIB_SAI_BASIC -VP_SYS_VS_Systick.Mode=SysTick -VP_SYS_VS_Systick.Signal=SYS_VS_Systick -VP_TIM15_VS_ClockSourceINT.Mode=Internal -VP_TIM15_VS_ClockSourceINT.Signal=TIM15_VS_ClockSourceINT +ProjectManager.DefaultFWLocation=true +SAI1.ErrorAudioFreq-SAI_A_MasterWithClock=-72.09 % +PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT VP_TIM16_VS_ClockSourceINT.Mode=Enable_Timer -VP_TIM16_VS_ClockSourceINT.Signal=TIM16_VS_ClockSourceINT -VP_TIM17_VS_ClockSourceINT.Mode=Enable_Timer +ProjectManager.DeletePrevious=true +PB14.Locked=true +RCC.VCOSAI2OutputFreq_Value=64000000 VP_TIM17_VS_ClockSourceINT.Signal=TIM17_VS_ClockSourceINT -VP_TIM1_VS_ClockSourceINT.Mode=Internal -VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT -VP_TIM2_VS_ClockSourceINT.Mode=Internal -VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT -VP_TIM4_VS_ClockSourceINT.Mode=Internal +RCC.FamilyName=M +PH1-OSC_OUT\ (PH1).Signal=RCC_OSC_OUT +USART1.VirtualMode-Asynchronous=VM_ASYNC +PA3.Mode=Asynchronous +SAI1.RealAudioFreq-SAI_A_MasterWithClock=53.571 KHz +PA9.Mode=Asynchronous +SH.S_TIM1_CH1.0=TIM1_CH1,PWM Generation1 CH1 VP_TIM4_VS_ClockSourceINT.Signal=TIM4_VS_ClockSourceINT +ProjectManager.TargetToolchain=MDK-ARM V5 +TIM4.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation2 CH2 +Mcu.Pin51=VP_TIM4_VS_ClockSourceINT +Mcu.Pin52=VP_TIM15_VS_ClockSourceINT +Mcu.Pin50=VP_TIM2_VS_ClockSourceINT +SH.S_TIM4_CH3.0=TIM4_CH3,PWM Generation3 CH3 +Mcu.Pin53=VP_TIM16_VS_ClockSourceINT +Mcu.Pin54=VP_TIM17_VS_ClockSourceINT +PA9.Signal=USART1_TX +VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT +PB5.Locked=true +SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +RCC.USBFreq_Value=48000000 +PE11.Signal=QUADSPI_NCS +Mcu.Pin48=VP_SYS_VS_Systick +Mcu.Pin49=VP_TIM1_VS_ClockSourceINT +RCC.PLLSAI1PoutputFreq_Value=13714285.714285715 +Mcu.Pin46=VP_SAI1_VP_$IpInstance_SAIA_SAI_BASIC +Mcu.Pin47=VP_SAI1_VP_$IpInstance_SAIB_SAI_BASIC +PB10.Signal=S_TIM2_CH3 +SAI1.VirtualMode-SAI_A_MasterWithClock=VM_MASTER +SH.S_TIM4_CH3.ConfNb=1 +VP_SAI1_VP_$IpInstance_SAIB_SAI_BASIC.Mode=SAI_B_BASIC +PB14.Signal=SPI2_MISO +PD2.Mode=SD_4_bits_Wide_bus +RCC.PLLSAI2RoutputFreq_Value=32000000 +PA5.Signal=SPI1_SCK +Mcu.Pin40=PB5 +Mcu.Pin41=PB7 +PC12.Mode=SD_4_bits_Wide_bus +Mcu.Pin44=VP_LPTIM1_VS_LPTIM_counterModeInternalClock +Mcu.Pin45=VP_RTC_VS_RTC_Activate +Mcu.Pin42=PB8 board=custom +Mcu.Pin43=VP_IWDG_VS_IWDG +SAI1.IPParameters=Instance-SAI_A_MasterWithClock,VirtualMode-SAI_A_MasterWithClock,MClockEnable-SAI_A_MasterWithClock,RealAudioFreq-SAI_A_MasterWithClock,ErrorAudioFreq-SAI_A_MasterWithClock,InitProtocol-SAI_A_MasterWithClock,VirtualProtocol-SAI_A_BASIC,AudioFrequency-SAI_A_MasterWithClock,OutputDrive-SAI_A_MasterWithClock,Instance-SAI_B_SyncSlave,VirtualMode-SAI_B_SyncSlave,InitProtocol-SAI_B_SyncSlave,VirtualProtocol-SAI_B_BASIC +RCC.VCOOutputFreq_Value=160000000 +ProjectManager.LastFirmware=true +PB15.Mode=Full_Duplex_Master +TIM4.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 +RCC.APB2Freq_Value=80000000 +PE14.Signal=QUADSPI_BK1_IO2 +RCC.UART4Freq_Value=80000000 +SPI3.CalculateBaudRate=40.0 MBits/s +PE6.Mode=SAI_A_MasterWithClock +PE15.Signal=QUADSPI_BK1_IO3 +MxCube.Version=5.6.0 +Mcu.Pin37=PC12 +Mcu.Pin38=PD2 +Mcu.Pin35=PC10 +VP_TIM2_VS_ClockSourceINT.Mode=Internal +RCC.I2C1Freq_Value=80000000 +SH.S_TIM2_CH3.0=TIM2_CH3,PWM Generation3 CH3 +Mcu.Pin36=PC11 +SPI1.Mode=SPI_MODE_MASTER +Mcu.Pin39=PB3 (JTDO-TRACESWO) +PE14.Mode=Single Bank +PB3\ (JTDO-TRACESWO).Mode=TX_Only_Simplex_Unidirect_Master +RCC.RNGFreq_Value=48000000 +PE5.Mode=SAI_A_MasterWithClock +RCC.PLLSAI1QoutputFreq_Value=48000000 +Mcu.Pin30=PA10 +RCC.ADCFreq_Value=48000000 +VP_SYS_VS_Systick.Mode=SysTick +TIM2.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 +Mcu.Pin33=PA13 (JTMS-SWDIO) +Mcu.Pin34=PA14 (JTCK-SWCLK) +Mcu.Pin31=PA11 +Mcu.Pin32=PA12 +VP_TIM16_VS_ClockSourceINT.Signal=TIM16_VS_ClockSourceINT +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false +SH.S_TIM2_CH3.ConfNb=1 +PE6.Signal=SAI1_SD_A +RCC.UART5Freq_Value=80000000 +ProjectManager.FreePins=false +RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1N,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PLLSAI2RoutputFreq_Value,PLLSourceVirtual,PWRFreq_Value,RNGFreq_Value,RTCClockSelection,RTCFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value +ProjectManager.AskForMigrate=true +Mcu.Name=STM32L475V(C-E-G)Tx +RCC.LPTIM2Freq_Value=80000000 +Mcu.Pin26=PB15 +PE12.Signal=QUADSPI_BK1_IO0 +Mcu.Pin27=PC8 +PA2.Signal=USART2_TX +Mcu.Pin24=PB13 +ProjectManager.UnderRoot=false +Mcu.Pin25=PB14 +PE13.Locked=true +Mcu.IP8=SDMMC1 +Mcu.IP9=SPI1 +Mcu.Pin28=PC9 +Mcu.IP6=RTC +PC8.Mode=SD_4_bits_Wide_bus +Mcu.Pin29=PA9 +Mcu.IP7=SAI1 +ProjectManager.CoupleFile=false +PA13\ (JTMS-SWDIO).Mode=Serial_Wire +RCC.SYSCLKFreq_VALUE=80000000 +Mcu.Pin22=PB10 +PB5.Signal=SPI3_MOSI +Mcu.Pin23=PB11 +Mcu.Pin20=PE14 +ADC1.master=1 +Mcu.Pin21=PE15 +PA12.Mode=Device_Only +NVIC.ForceEnableDMAVector=true +RCC.PLLSAI2PoutputFreq_Value=9142857.142857144 +KeepUserPlacement=false +PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false +ProjectManager.CompilerOptimize=6 +SAI1.Instance-SAI_B_SyncSlave=SAI$Index_Block_B +PA11.Signal=USB_OTG_FS_DM +VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG +VP_TIM15_VS_ClockSourceINT.Mode=Internal +ProjectManager.HeapSize=0x200 +Mcu.Pin15=PE9 +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +Mcu.Pin16=PE10 +Mcu.Pin13=PA7 +SH.S_TIM2_CH4.0=TIM2_CH4,PWM Generation4 CH4 +Mcu.Pin14=PC5 +Mcu.Pin19=PE13 +ProjectManager.ComputerToolchain=false +Mcu.Pin17=PE11 +RCC.HSI_VALUE=16000000 +Mcu.Pin18=PE12 +VP_TIM4_VS_ClockSourceINT.Mode=Internal +SAI1.VirtualProtocol-SAI_B_BASIC=VM_BASIC_PROTOCOL +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +ADC1.NbrOfConversionFlag=1 +Mcu.Pin11=PA5 +Mcu.Pin12=PA6 +RCC.PLLN=20 +Mcu.Pin10=PA3 +PB7.Locked=true +PE3.Signal=SAI1_SD_B +PA2.Mode=Asynchronous +PB8.Signal=S_TIM4_CH3 +VP_LPTIM1_VS_LPTIM_counterModeInternalClock.Signal=LPTIM1_VS_LPTIM_counterModeInternalClock +RCC.PWRFreq_Value=80000000 +PC9.Signal=SDMMC1_D1 +PD2.Signal=SDMMC1_CMD +RCC.I2C2Freq_Value=80000000 +RCC.APB1Freq_Value=80000000 +SAI1.InitProtocol-SAI_B_SyncSlave=Enable +ProjectManager.DeviceId=STM32L475VETx +ProjectManager.LibraryCopy=0 +PE15.Mode=Single Bank +PA7.Signal=SPI1_MOSI diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c index 1b25bb7567..7dc7cc3ad7 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c @@ -478,10 +478,9 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) __HAL_RCC_GPIOB_CLK_ENABLE(); /**SPI3 GPIO Configuration PB3 (JTDO-TRACESWO) ------> SPI3_SCK - PB4 (NJTRST) ------> SPI3_MISO PB5 ------> SPI3_MOSI */ - GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; + GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; @@ -551,10 +550,9 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) /**SPI3 GPIO Configuration PB3 (JTDO-TRACESWO) ------> SPI3_SCK - PB4 (NJTRST) ------> SPI3_MISO PB5 ------> SPI3_MOSI */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5); + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_3|GPIO_PIN_5); /* USER CODE BEGIN SPI3_MspDeInit 1 */ From 03eb616ff6f5227efd6bb786f33294283bf96246 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Fri, 24 Apr 2020 08:46:56 +0800 Subject: [PATCH 21/27] [tools] fix c99/siginfo_t issue caused by gcc_version --- tools/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/utils.py b/tools/utils.py index 9459396544..67ce098ccd 100644 --- a/tools/utils.py +++ b/tools/utils.py @@ -273,7 +273,7 @@ def VersionCmp(ver1, ver2): def GCCC99Patch(cflags): import building - gcc_version = building.GetDepend('GCC_VERSION') + gcc_version = building.GetDepend('GCC_VERSION_STR') if gcc_version: gcc_version = gcc_version.replace('"', '') if VersionCmp(gcc_version, "4.8.0") == 1: From 2099924e20fab8529cbd31487833a03368d23125 Mon Sep 17 00:00:00 2001 From: bigmagic Date: Sun, 26 Apr 2020 09:52:31 +0800 Subject: [PATCH 22/27] add raspi3 mbox option --- bsp/raspberry-pi/raspi3-64/driver/mbox.c | 401 +++++++++++++++++++++++ bsp/raspberry-pi/raspi3-64/driver/mbox.h | 64 +++- 2 files changed, 464 insertions(+), 1 deletion(-) diff --git a/bsp/raspberry-pi/raspi3-64/driver/mbox.c b/bsp/raspberry-pi/raspi3-64/driver/mbox.c index 1d995340d6..dc09ecab4b 100644 --- a/bsp/raspberry-pi/raspi3-64/driver/mbox.c +++ b/bsp/raspberry-pi/raspi3-64/driver/mbox.c @@ -47,3 +47,404 @@ int mbox_call(unsigned char ch, int mmu_enable) } return 0; } + +int bcm283x_mbox_hardware_get_model(void) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_HARDWARE_GET_MODEL; + mbox[3] = 4; // buffer size + mbox[4] = 0; // len + + mbox[5] = 0; + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + return mbox[5]; +} + +int bcm283x_mbox_hardware_get_revison(void) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_HARDWARE_GET_REV; + mbox[3] = 4; // buffer size + mbox[4] = 0; // len + + mbox[5] = 0; + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + return mbox[5]; +} + +int bcm283x_mbox_hardware_get_mac_address(uint8_t * mac) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_HARDWARE_GET_MAC_ADDRESS; + mbox[3] = 6; // buffer size + mbox[4] = 0; // len + + mbox[5] = 0; + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + char * mac_str = (char *)&mbox[5]; + mac[0] = mac_str[0]; + mac[1] = mac_str[1]; + mac[2] = mac_str[2]; + mac[3] = mac_str[3]; + mac[4] = mac_str[4]; + mac[5] = mac_str[5]; + return 0; +} + + +int bcm283x_mbox_hardware_get_serial(rt_uint64_t* sn) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_HARDWARE_GET_SERIAL; + mbox[3] = 8; // buffer size + mbox[4] = 0; // len + + mbox[5] = 0; + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + sn = (rt_uint64_t *)&mbox[5]; + + return 0; +} + +int bcm283x_mbox_hardware_get_arm_memory(rt_uint32_t * base, rt_uint32_t * size) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_HARDWARE_GET_ARM_MEMORY; + mbox[3] = 8; // buffer size + mbox[4] = 0; // len + + mbox[5] = 0; + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + *base = mbox[5]; + *size = mbox[6]; + + return 0; + +} + +int bcm283x_mbox_hardware_get_vc_memory(rt_uint32_t * base, rt_uint32_t * size) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_HARDWARE_GET_VC_MEMORY; + mbox[3] = 8; // buffer size + mbox[4] = 0; // len + + mbox[5] = 0; + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + *base = mbox[5]; + *size = mbox[6]; + + return 0; +} + +int bcm283x_mbox_clock_get_turbo(void) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_CLOCK_GET_TURBO; + mbox[3] = 8; // buffer size + mbox[4] = 4; // len + + mbox[5] = 0; // id + mbox[6] = 0; // val + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + if(mbox[5] != 0) + { + return -1; + } + + return mbox[6]; +} + +int bcm283x_mbox_clock_set_turbo(int level) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_CLOCK_SET_TURBO; + mbox[3] = 8; // buffer size + mbox[4] = 8; // len + + mbox[5] = 0; // id + mbox[6] = level ? 1 : 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + if(mbox[5] != 0) + { + return -1; + } + + return mbox[6]; +} + +int bcm283x_mbox_clock_get_state(int id) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_CLOCK_GET_STATE; + mbox[3] = 8; // buffer size + mbox[4] = 4; // len + + mbox[5] = id; // id + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + if(mbox[5] != id) + { + return -1; + } + + return (mbox[6] & 0x3); +} + +int bcm283x_mbox_clock_set_state(int id, int state) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_CLOCK_SET_STATE; + mbox[3] = 8; // buffer size + mbox[4] = 8; // len + + mbox[5] = id; // id + mbox[6] = state & 0x3; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + if(mbox[5] != id) + { + return -1; + } + + return (mbox[6] & 0x3); +} + +int bcm283x_mbox_clock_get_rate(int id) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_CLOCK_GET_RATE; + mbox[3] = 8; // buffer size + mbox[4] = 4; // len + + mbox[5] = id; // id + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + if(mbox[5] != id) + { + return -1; + } + + return mbox[6]; +} + +int bcm283x_mbox_clock_set_rate(int id, int rate) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_CLOCK_SET_RATE; + mbox[3] = 8; // buffer size + mbox[4] = 8; // len + + mbox[5] = id; // id + mbox[6] = rate; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + if(mbox[5] != id) + { + return -1; + } + + return mbox[6]; +} + +int bcm283x_mbox_clock_get_max_rate(int id) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_CLOCK_GET_MAX_RATE; + mbox[3] = 8; // buffer size + mbox[4] = 4; // len + + mbox[5] = id; // id + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + if(mbox[5] != id) + { + return -1; + } + + return mbox[6]; +} + +int bcm283x_mbox_clock_get_min_rate(int id) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_CLOCK_GET_MIN_RATE; + mbox[3] = 8; // buffer size + mbox[4] = 4; // len + + mbox[5] = id; // id + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + if(mbox[5] != id) + { + return -1; + } + + return mbox[6]; +} + +int bcm283x_mbox_power_get_state(int id) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_POWER_GET_STATE; + mbox[3] = 8; // buffer size + mbox[4] = 4; // len + + mbox[5] = id; // id + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + if(mbox[5] != id) + { + return -1; + } + + return (mbox[6] & 0x3); +} + +int bcm283x_mbox_power_set_state(int id, int state) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_POWER_SET_STATE; + mbox[3] = 8; // buffer size + mbox[4] = 8; // len + + mbox[5] = id; // id + mbox[6] = state & 0x3; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + if(mbox[5] != id) + { + return -1; + } + + return (mbox[6] & 0x3); +} + +int bcm283x_mbox_temp_get(void) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_TEMP_GET; + mbox[3] = 8; // buffer size + mbox[4] = 4; // len + + mbox[5] = 0; //id + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + if(mbox[5] != 0) + { + return -1; + } + + return mbox[6]; +} + +int bcm283x_mbox_temp_get_max(void) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_TEMP_GET_MAX; + mbox[3] = 8; // buffer size + mbox[4] = 4; // len + + mbox[5] = 0; // id + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + if(mbox[5] != 0) + { + return -1; + } + + return mbox[6]; +} diff --git a/bsp/raspberry-pi/raspi3-64/driver/mbox.h b/bsp/raspberry-pi/raspi3-64/driver/mbox.h index eb7eb0318c..f235691d7b 100644 --- a/bsp/raspberry-pi/raspi3-64/driver/mbox.h +++ b/bsp/raspberry-pi/raspi3-64/driver/mbox.h @@ -12,7 +12,7 @@ #ifndef __MBOX_H__ #define __MBOX_H__ - +#include /* a properly aligned buffer */ extern volatile unsigned int* mbox; @@ -56,7 +56,69 @@ extern volatile unsigned int* mbox; #define MMU_ENABLE 1 #define MMU_DISABLE 0 +/* + * raspi hardware info + */ +enum { + MBOX_TAG_HARDWARE_GET_MODEL = 0x00010001, + MBOX_TAG_HARDWARE_GET_REV = 0x00010002, + MBOX_TAG_HARDWARE_GET_MAC_ADDRESS = 0x00010003, + MBOX_TAG_HARDWARE_GET_SERIAL = 0x00010004, + MBOX_TAG_HARDWARE_GET_ARM_MEMORY = 0x00010005, + MBOX_TAG_HARDWARE_GET_VC_MEMORY = 0x00010006, + MBOX_TAG_HARDWARE_GET_CLOCKS = 0x00010007, +}; + +/* + * raspi clock + */ +enum { + MBOX_TAG_CLOCK_GET_TURBO = 0x00030009, + MBOX_TAG_CLOCK_SET_TURBO = 0x00038009, + MBOX_TAG_CLOCK_GET_STATE = 0x00030001, + MBOX_TAG_CLOCK_SET_STATE = 0x00038001, + MBOX_TAG_CLOCK_GET_RATE = 0x00030002, + MBOX_TAG_CLOCK_SET_RATE = 0x00038002, + MBOX_TAG_CLOCK_GET_MAX_RATE = 0x00030004, + MBOX_TAG_CLOCK_GET_MIN_RATE = 0x00030007, +}; + +/* + * raspi power + */ +enum { + MBOX_TAG_POWER_GET_STATE = 0x00020001, + MBOX_TAG_POWER_SET_STATE = 0x00028001, +}; + +/* + * raspi temperature + */ +enum { + MBOX_TAG_TEMP_GET = 0x00030006, + MBOX_TAG_TEMP_GET_MAX = 0x0003000A, +}; + #define MBOX_ADDR 0xc00000 int mbox_call(unsigned char ch, int mmu_enable); +int bcm283x_mbox_hardware_get_model(void); +int bcm283x_mbox_hardware_get_revison(void); +int bcm283x_mbox_hardware_get_mac_address(uint8_t * mac); +int bcm283x_mbox_hardware_get_serial(rt_uint64_t* sn); +int bcm283x_mbox_hardware_get_arm_memory(rt_uint32_t * base, rt_uint32_t * size); +int bcm283x_mbox_hardware_get_vc_memory(rt_uint32_t * base, rt_uint32_t * size); +int bcm283x_mbox_clock_get_turbo(void); +int bcm283x_mbox_clock_set_turbo(int level); +int bcm283x_mbox_clock_get_state(int id); +int bcm283x_mbox_clock_set_state(int id, int state); +int bcm283x_mbox_clock_get_rate(int id); +int bcm283x_mbox_clock_set_rate(int id, int rate); +int bcm283x_mbox_clock_get_max_rate(int id); +int bcm283x_mbox_clock_get_min_rate(int id); +int bcm283x_mbox_power_get_state(int id); +int bcm283x_mbox_power_set_state(int id, int state); +int bcm283x_mbox_temp_get(void); +int bcm283x_mbox_temp_get_max(void); + #endif From 6251fc93b6e8be24391bd17db9f1540d740491f2 Mon Sep 17 00:00:00 2001 From: bigmagic Date: Sun, 26 Apr 2020 09:53:41 +0800 Subject: [PATCH 23/27] [bsp/raspi]fix hdmi driver --- bsp/raspberry-pi/raspi3-64/driver/drv_fb.c | 164 ++++++++++++++++++--- 1 file changed, 145 insertions(+), 19 deletions(-) diff --git a/bsp/raspberry-pi/raspi3-64/driver/drv_fb.c b/bsp/raspberry-pi/raspi3-64/driver/drv_fb.c index d4abc4fd60..cabaded5fd 100644 --- a/bsp/raspberry-pi/raspi3-64/driver/drv_fb.c +++ b/bsp/raspberry-pi/raspi3-64/driver/drv_fb.c @@ -15,9 +15,10 @@ #include "drv_fb.h" #include "mmu.h" -#define LCD_WIDTH (640) +#define LCD_WIDTH (800) #define LCD_HEIGHT (480) #define LCD_DEPTH (32) +#define LCD_BPP (32) #define TAG_ALLOCATE_BUFFER 0x00040001 #define TAG_SET_PHYS_WIDTH_HEIGHT 0x00048003 @@ -28,6 +29,39 @@ #define TAG_SET_VIRT_OFFSET 0x00048009 #define TAG_END 0x00000000 + +enum { + MBOX_TAG_FB_GET_GPIOVIRT = 0x00040010, + MBOX_TAG_FB_ALLOCATE_BUFFER = 0x00040001, + MBOX_TAG_FB_RELEASE_BUFFER = 0x00048001, + MBOX_TAG_FB_BLANK_SCREEN = 0x00040002, + MBOX_TAG_FB_GET_PHYS_WH = 0x00040003, + MBOX_TAG_FB_TEST_PHYS_WH = 0x00044003, + MBOX_TAG_FB_SET_PHYS_WH = 0x00048003, + MBOX_TAG_FB_GET_VIRT_WH = 0x00040004, + MBOX_TAG_FB_TEST_VIRT_WH = 0x00044004, + MBOX_TAG_FB_SET_VIRT_WH = 0x00048004, + MBOX_TAG_FB_GET_DEPTH = 0x00040005, + MBOX_TAG_FB_TEST_DEPTH = 0x00044005, + MBOX_TAG_FB_SET_DEPTH = 0x00048005, + MBOX_TAG_FB_GET_PIXEL_ORDER = 0x00040006, + MBOX_TAG_FB_TEST_PIXEL_ORDER = 0x00044006, + MBOX_TAG_FB_SET_PIXEL_ORDER = 0x00048006, + MBOX_TAG_FB_GET_ALPHA_MODE = 0x00040007, + MBOX_TAG_FB_TEST_ALPHA_MODE = 0x00044007, + MBOX_TAG_FB_SET_ALPHA_MODE = 0x00048007, + MBOX_TAG_FB_GET_PITCH = 0x00040008, + MBOX_TAG_FB_GET_VIRT_OFFSET = 0x00040009, + MBOX_TAG_FB_TEST_VIRT_OFFSET = 0x00044009, + MBOX_TAG_FB_SET_VIRT_OFFSET = 0x00048009, + MBOX_TAG_FB_GET_OVERSCAN = 0x0004000a, + MBOX_TAG_FB_TEST_OVERSCAN = 0x0004400a, + MBOX_TAG_FB_SET_OVERSCAN = 0x0004800a, + MBOX_TAG_FB_GET_PALETTE = 0x0004000b, + MBOX_TAG_FB_TEST_PALETTE = 0x0004400b, + MBOX_TAG_FB_SET_PALETTE = 0x0004800b, +}; + #define LCD_DEVICE(dev) (struct rt_hdmi_fb_device*)(dev) static struct rt_hdmi_fb_device _hdmi; @@ -75,7 +109,7 @@ rt_err_t hdmi_fb_control(rt_device_t dev, int cmd, void *args) info->bits_per_pixel= LCD_DEPTH; info->width = lcd->width; info->height = lcd->height; - info->framebuffer = lcd->fb;//(rt_uint8_t *)lcd->fb; + info->framebuffer = lcd->fb; } break; } @@ -119,38 +153,122 @@ rt_err_t rt_hdmi_fb_device_init(struct rt_hdmi_fb_device *hdmi_fb, const char *n return RT_EOK; } -int hdmi_fb_init(void) +rt_uint32_t bcm283x_mbox_fb_get_gpiovirt(void) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_FB_GET_GPIOVIRT; + mbox[3] = 4; // buffer size + mbox[4] = 0; // len + + mbox[5] = 0; // id + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + return (mbox[5] & 0x3fffffff); +} + +rt_uint32_t bcm283x_mbox_fb_get_pitch(void) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_FB_GET_PITCH; + mbox[3] = 4; // buffer size + mbox[4] = 0; // len + + mbox[5] = 0; // id + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + return mbox[5]; +} + +void bcm283x_mbox_fb_set_porder(int rgb) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_FB_SET_PIXEL_ORDER; + mbox[3] = 4; // buffer size + mbox[4] = 4; // len + + mbox[5] = rgb; // id + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); +} + +void bcm283x_mbox_fb_setoffset(int xoffset, int yoffset) +{ + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_FB_SET_VIRT_OFFSET; + mbox[3] = 8; // buffer size + mbox[4] = 8; // len + + mbox[5] = xoffset; // id + mbox[6] = yoffset; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); +} + + +void bcm283x_mbox_fb_setalpha(int alpha) +{ + + mbox[0] = 8*4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_FB_SET_ALPHA_MODE; + mbox[3] = 4; // buffer size + mbox[4] = 4; // len + + mbox[5] = alpha; // id + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); +} + +void *bcm283x_mbox_fb_alloc(int width, int height, int bpp, int nrender) { mbox[0] = 4 * 35; mbox[1] = MBOX_REQUEST; mbox[2] = TAG_ALLOCATE_BUFFER;//get framebuffer, gets alignment on request - mbox[3] = 8; - mbox[4] = 0; - mbox[5] = 4096; //FrameBufferInfo.pointer - mbox[6] = 0; //FrameBufferInfo.size + mbox[3] = 8; //size + mbox[4] = 4; //len + mbox[5] = 4096; //The design of MBOX driver forces us to give the virtual address 0x3C100000 + mbox[6] = 0; //FrameBufferInfo.size mbox[7] = TAG_SET_PHYS_WIDTH_HEIGHT; mbox[8] = 8; - mbox[9] = 0; - mbox[10] = LCD_WIDTH; - mbox[11] = LCD_HEIGHT; + mbox[9] = 8; + mbox[10] = width; + mbox[11] = height; mbox[12] = TAG_SET_VIRT_WIDTH_HEIGHT; mbox[13] = 8; - mbox[14] = 0; - mbox[15] = LCD_WIDTH; - mbox[16] = LCD_HEIGHT; + mbox[14] = 8; + mbox[15] = width; + mbox[16] = height * nrender; mbox[17] = TAG_SET_DEPTH; mbox[18] = 4; - mbox[19] = 0; - mbox[20] = 16; //FrameBufferInfo.depth RGB 565 + mbox[19] = 4; + mbox[20] = bpp; mbox[21] = TAG_SET_PIXEL_ORDER; mbox[22] = 4; mbox[23] = 0; - mbox[24] = 1; //RGB, not BGR preferably + mbox[24] = 0; //RGB, not BGR preferably mbox[25] = TAG_GET_PITCH; mbox[26] = 4; @@ -167,17 +285,25 @@ int hdmi_fb_init(void) mbox_call(MBOX_CH_PROP, MMU_DISABLE); - _hdmi.fb = (rt_uint8_t *)(uintptr_t)(mbox[5] & 0x3FFFFFFF); + return (void *)((rt_uint64_t)(mbox[5] & 0x3fffffff)); +} +int hdmi_fb_init(void) +{ + _hdmi.fb = (rt_uint8_t *)bcm283x_mbox_fb_alloc(LCD_WIDTH, LCD_HEIGHT, LCD_BPP, 1); + bcm283x_mbox_fb_setoffset(0, 0); + bcm283x_mbox_fb_set_porder(0); _hdmi.width = LCD_WIDTH; _hdmi.height = LCD_HEIGHT; _hdmi.depth = LCD_DEPTH; _hdmi.pitch = 0; _hdmi.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB888; - armv8_map((unsigned long)_hdmi.fb, (unsigned long)_hdmi.fb, 0x200000, MEM_ATTR_MEMORY); + armv8_map((unsigned long)_hdmi.fb, (unsigned long)_hdmi.fb, 0x200000, MEM_ATTR_IO); - rt_kprintf("_hdmi.fb is %p\n", _hdmi.fb); + rt_hw_dcache_invalidate_range((unsigned long)_hdmi.fb,LCD_WIDTH * LCD_HEIGHT * 3); + + //rt_kprintf("_hdmi.fb is %p\n", _hdmi.fb); rt_hdmi_fb_device_init(&_hdmi, "lcd"); return 0; From 609911bee9c1235151f5328e7dcae9880d6861f6 Mon Sep 17 00:00:00 2001 From: Fu Wei Date: Tue, 14 Apr 2020 14:53:39 +0800 Subject: [PATCH 24/27] [RISC-V:K210]Add UART1~3 support for K210 This patch adds UART1~3 support for K210, and separates the rt_uart_ops of UARTHS from UART. This patch add configs in Kconfig for configuring the pins of UARTx, please check the sysctl_set_power_mode for the pins in the io_config_init of bsp/k210/driver/drv_io_config.c Signed-off-by: Fu Wei --- bsp/k210/driver/Kconfig | 41 ++++- bsp/k210/driver/drv_io_config.c | 22 ++- bsp/k210/driver/drv_uart.c | 302 +++++++++++++++++++++++++++----- 3 files changed, 318 insertions(+), 47 deletions(-) diff --git a/bsp/k210/driver/Kconfig b/bsp/k210/driver/Kconfig index 4d38a7c9b2..8acbf5202c 100644 --- a/bsp/k210/driver/Kconfig +++ b/bsp/k210/driver/Kconfig @@ -2,17 +2,44 @@ config BSP_USING_UART_HS bool "Enable High Speed UART" default y -config BSP_USING_UART1 - bool "Enable UART1 (GPIO0/1)" - default n +menu "General Purpose UARTs" -config BSP_USING_UART2 - bool "Enable UART2 (GPIO0/1)" +menuconfig BSP_USING_UART1 + bool "Enable UART1" default n + if BSP_USING_UART1 + config BSP_UART1_TXD_PIN + int "uart1 TXD pin number" + default 20 + config BSP_UART1_RXD_PIN + int "uart1 RXD pin number" + default 21 + endif -config BSP_USING_UART3 - bool "Enable UART3 (GPIO0/1)" +menuconfig BSP_USING_UART2 + bool "Enable UART2" default n + if BSP_USING_UART2 + config BSP_UART2_TXD_PIN + int "uart2 TXD pin number" + default 28 + config BSP_UART2_RXD_PIN + int "uart2 RXD pin number" + default 27 + endif + +menuconfig BSP_USING_UART3 + bool "Enable UART3" + default n + if BSP_USING_UART3 + config BSP_UART3_TXD_PIN + int "uart3 TXD pin number" + default 22 + config BSP_UART3_RXD_PIN + int "uart3 RXD pin number" + default 23 + endif +endmenu config BSP_USING_I2C1 bool "Enable I2C1 (GPIO0/1)" diff --git a/bsp/k210/driver/drv_io_config.c b/bsp/k210/driver/drv_io_config.c index cd0e8f27f6..3098537eae 100644 --- a/bsp/k210/driver/drv_io_config.c +++ b/bsp/k210/driver/drv_io_config.c @@ -63,6 +63,18 @@ static struct io_config #endif #endif +#ifdef BSP_USING_UART1 + IOCONFIG(BSP_UART1_TXD_PIN, FUNC_UART1_TX), + IOCONFIG(BSP_UART1_RXD_PIN, FUNC_UART1_RX), +#endif +#ifdef BSP_USING_UART2 + IOCONFIG(BSP_UART2_TXD_PIN, FUNC_UART2_TX), + IOCONFIG(BSP_UART2_RXD_PIN, FUNC_UART2_RX), +#endif +#ifdef BSP_USING_UART3 + IOCONFIG(BSP_UART3_TXD_PIN, FUNC_UART3_TX), + IOCONFIG(BSP_UART3_RXD_PIN, FUNC_UART3_RX), +#endif }; static int print_io_config() @@ -89,7 +101,15 @@ int io_config_init(void) sysctl_set_power_mode(SYSCTL_POWER_BANK0, SYSCTL_POWER_V18); sysctl_set_power_mode(SYSCTL_POWER_BANK1, SYSCTL_POWER_V18); sysctl_set_power_mode(SYSCTL_POWER_BANK2, SYSCTL_POWER_V18); - +#ifdef BSP_USING_UART2 + // for IO-27/28 + sysctl_set_power_mode(SYSCTL_POWER_BANK4, SYSCTL_POWER_V33); +#endif +#if defined(BSP_USING_UART1) || defined(BSP_USING_UART3) + // for IO-20~23 + sysctl_set_power_mode(SYSCTL_POWER_BANK3, SYSCTL_POWER_V33); +#endif + for(i = 0; i < count; i++) { fpioa_set_function(io_config[i].io_num, io_config[i].func); diff --git a/bsp/k210/driver/drv_uart.c b/bsp/k210/driver/drv_uart.c index 7e22d40c5d..830b14cbbc 100644 --- a/bsp/k210/driver/drv_uart.c +++ b/bsp/k210/driver/drv_uart.c @@ -17,10 +17,12 @@ #include #include -// #include "uart.h" +#include "uart.h" #include "uarths.h" #include "plic.h" +#define UART_DEFAULT_BAUDRATE 115200 + static volatile uarths_t *const _uarths = (volatile uarths_t *)UARTHS_BASE_ADDR; struct device_uart @@ -29,22 +31,71 @@ struct device_uart rt_uint32_t irqno; }; -static rt_err_t uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg); +static rt_err_t rt_uarths_configure(struct rt_serial_device *serial, struct serial_configure *cfg); +static rt_err_t uarths_control(struct rt_serial_device *serial, int cmd, void *arg); +static int drv_uarths_putc(struct rt_serial_device *serial, char c); +static int drv_uarths_getc(struct rt_serial_device *serial); + +static void uarths_irq_handler(int irqno, void *param); + +static rt_err_t rt_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg); static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg); static int drv_uart_putc(struct rt_serial_device *serial, char c); static int drv_uart_getc(struct rt_serial_device *serial); static void uart_irq_handler(int irqno, void *param); +const struct rt_uart_ops _uart_hs_ops = +{ + rt_uarths_configure, + uarths_control, + drv_uarths_putc, + drv_uarths_getc, + RT_NULL +}; + const struct rt_uart_ops _uart_ops = { - uart_configure, + rt_uart_configure, uart_control, drv_uart_putc, drv_uart_getc, + //TODO: add DMA support RT_NULL }; +/* START ported from kendryte standalone sdk uart.c */ +#define __UART_BRATE_CONST 16 + +volatile uart_t* const _uart[3] = +{ + (volatile uart_t*)UART1_BASE_ADDR, + (volatile uart_t*)UART2_BASE_ADDR, + (volatile uart_t*)UART3_BASE_ADDR +}; + +void uart_init(uart_device_number_t channel) +{ + sysctl_clock_enable(SYSCTL_CLOCK_UART1 + channel); + sysctl_reset(SYSCTL_RESET_UART1 + channel); +} + +/* END ported from kendryte standalone sdk uart.c */ +static inline uart_device_number_t _get_uart_channel(rt_uint32_t addr) +{ + switch (addr) + { + case UART1_BASE_ADDR: + return UART_DEVICE_1; + case UART2_BASE_ADDR: + return UART_DEVICE_2; + case UART3_BASE_ADDR: + return UART_DEVICE_3; + default: + return UART_DEVICE_MAX; + } +} + /* * UART Initiation */ @@ -62,7 +113,7 @@ int rt_hw_uart_init(void) serial = &serial_hs; uart = &uart_hs; - serial->ops = &_uart_ops; + serial->ops = &_uart_hs_ops; serial->config = config; serial->config.baud_rate = 115200; @@ -86,36 +137,79 @@ int rt_hw_uart_init(void) serial->ops = &_uart_ops; serial->config = config; - serial->config.baud_rate = 115200; + serial->config.baud_rate = UART_DEFAULT_BAUDRATE; uart->hw_base = UART1_BASE_ADDR; uart->irqno = IRQN_UART1_INTERRUPT; + uart_init(UART_DEVICE_1); + rt_hw_serial_register(serial, - "uarths", + "uart1", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); } #endif #ifdef BSP_USING_UART2 + { + static struct rt_serial_device serial2; + static struct device_uart uart2; + + serial = &serial2; + uart = &uart2; + + serial->ops = &_uart_ops; + serial->config = config; + serial->config.baud_rate = UART_DEFAULT_BAUDRATE; + + uart->hw_base = UART2_BASE_ADDR; + uart->irqno = IRQN_UART2_INTERRUPT; + + uart_init(UART_DEVICE_2); + + rt_hw_serial_register(serial, + "uart2", + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, + uart); + } #endif #ifdef BSP_USING_UART3 + { + static struct rt_serial_device serial3; + static struct device_uart uart3; + + serial = &serial3; + uart = &uart3; + + serial->ops = &_uart_ops; + serial->config = config; + serial->config.baud_rate = UART_DEFAULT_BAUDRATE; + + uart->hw_base = UART3_BASE_ADDR; + uart->irqno = IRQN_UART3_INTERRUPT; + + uart_init(UART_DEVICE_3); + + rt_hw_serial_register(serial, + "uart3", + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, + uart); + } #endif return 0; } /* - * UART interface + * UARTHS interface */ -static rt_err_t uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg) +static rt_err_t rt_uarths_configure(struct rt_serial_device *serial, struct serial_configure *cfg) { - rt_uint32_t baud_div; struct device_uart *uart; - uint32_t freq = sysctl_clock_get_freq(SYSCTL_CLOCK_CPU); - uint16_t div = freq / cfg->baud_rate - 1; + uint32_t freq_hs = sysctl_clock_get_freq(SYSCTL_CLOCK_CPU); + uint16_t div_hs = freq_hs / cfg->baud_rate - 1; RT_ASSERT(serial != RT_NULL); serial->config = *cfg; @@ -125,7 +219,7 @@ static rt_err_t uart_configure(struct rt_serial_device *serial, struct serial_co if (uart->hw_base == UARTHS_BASE_ADDR) { - _uarths->div.div = div; + _uarths->div.div = div_hs; _uarths->txctrl.txen = 1; _uarths->rxctrl.rxen = 1; _uarths->txctrl.txcnt = 0; @@ -137,13 +231,14 @@ static rt_err_t uart_configure(struct rt_serial_device *serial, struct serial_co } else { + return (-1); /* other uart */ } return (RT_EOK); } -static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg) +static rt_err_t uarths_control(struct rt_serial_device *serial, int cmd, void *arg) { struct device_uart *uart; @@ -160,7 +255,7 @@ static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg case RT_DEVICE_CTRL_SET_INT: /* install interrupt */ - rt_hw_interrupt_install(uart->irqno, uart_irq_handler, + rt_hw_interrupt_install(uart->irqno, uarths_irq_handler, serial, serial->parent.parent.name); rt_hw_interrupt_umask(uart->irqno); break; @@ -169,38 +264,168 @@ static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg return (RT_EOK); } -static int drv_uart_putc(struct rt_serial_device *serial, char c) + +static int drv_uarths_putc(struct rt_serial_device *serial, char c) +{ + struct device_uart *uart = serial->parent.user_data; + RT_ASSERT(uart->hw_base == UARTHS_BASE_ADDR); + + while (_uarths->txdata.full); + _uarths->txdata.data = (uint8_t)c; + + return (1); +} + +static int drv_uarths_getc(struct rt_serial_device *serial) +{ + struct device_uart *uart = serial->parent.user_data; + RT_ASSERT(uart->hw_base == UARTHS_BASE_ADDR); + + uarths_rxdata_t recv = _uarths->rxdata; + if (recv.empty) + return EOF; + else + return (recv.data & 0xff); + /* Receive Data Available */ + + return (-1); +} + +/* UARTHS ISR */ +static void uarths_irq_handler(int irqno, void *param) +{ + struct rt_serial_device *serial = (struct rt_serial_device *)param; + struct device_uart *uart = serial->parent.user_data; + RT_ASSERT(uart->hw_base == UARTHS_BASE_ADDR); + + /* read interrupt status and clear it */ + if (_uarths->ip.rxwm) + rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); +} + +/* + * UART interface + */ +static rt_err_t rt_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg) +{ + struct device_uart *uart; + uart_bitwidth_t data_width = (uart_bitwidth_t)cfg->data_bits ; + uart_stopbit_t stopbit = (uart_stopbit_t)cfg->stop_bits; + uart_parity_t parity = (uart_parity_t)cfg->parity; + + uint32_t freq = sysctl_clock_get_freq(SYSCTL_CLOCK_APB0); + uint32_t divisor = freq / (uint32_t)cfg->baud_rate; + uint8_t dlh = divisor >> 12; + uint8_t dll = (divisor - (dlh << 12)) / __UART_BRATE_CONST; + uint8_t dlf = divisor - (dlh << 12) - dll * __UART_BRATE_CONST; + + RT_ASSERT(serial != RT_NULL); + serial->config = *cfg; + + uart = serial->parent.user_data; + RT_ASSERT(uart != RT_NULL); + + uart_device_number_t channel = _get_uart_channel(uart->hw_base); + RT_ASSERT(channel != UART_DEVICE_MAX); + + RT_ASSERT(data_width >= 5 && data_width <= 8); + if (data_width == 5) + { + RT_ASSERT(stopbit != UART_STOP_2); + } + else + { + RT_ASSERT(stopbit != UART_STOP_1_5); + } + + uint32_t stopbit_val = stopbit == UART_STOP_1 ? 0 : 1; + uint32_t parity_val; + switch (parity) + { + case UART_PARITY_NONE: + parity_val = 0; + break; + case UART_PARITY_ODD: + parity_val = 1; + break; + case UART_PARITY_EVEN: + parity_val = 3; + break; + default: + RT_ASSERT(!"Invalid parity"); + break; + } + + _uart[channel]->LCR |= 1u << 7; + _uart[channel]->DLH = dlh; + _uart[channel]->DLL = dll; + _uart[channel]->DLF = dlf; + _uart[channel]->LCR = 0; + _uart[channel]->LCR = (data_width - 5) | + (stopbit_val << 2) | + (parity_val << 3); + _uart[channel]->LCR &= ~(1u << 7); + _uart[channel]->IER |= 0x80; /* THRE */ + _uart[channel]->FCR = UART_RECEIVE_FIFO_1 << 6 | + UART_SEND_FIFO_8 << 4 | + 0x1 << 3 | + 0x1; + + return (RT_EOK); +} + +static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg) { struct device_uart *uart; uart = serial->parent.user_data; - if (uart->hw_base == UARTHS_BASE_ADDR) + uart_device_number_t channel = _get_uart_channel(uart->hw_base); + + RT_ASSERT(uart != RT_NULL); + RT_ASSERT(channel != UART_DEVICE_MAX); + + switch (cmd) { - while (_uarths->txdata.full); - _uarths->txdata.data = (uint8_t)c; - } - else - { - /* other uart */ + case RT_DEVICE_CTRL_CLR_INT: + /* Disable the UART Interrupt */ + rt_hw_interrupt_mask(uart->irqno); + _uart[channel]->IER &= ~0x1; + break; + + case RT_DEVICE_CTRL_SET_INT: + /* install interrupt */ + rt_hw_interrupt_install(uart->irqno, uart_irq_handler, + serial, serial->parent.parent.name); + rt_hw_interrupt_umask(uart->irqno); + _uart[channel]->IER |= 0x1; + break; } + return (RT_EOK); +} + +static int drv_uart_putc(struct rt_serial_device *serial, char c) +{ + struct device_uart *uart = serial->parent.user_data; + uart_device_number_t channel = _get_uart_channel(uart->hw_base); + RT_ASSERT(channel != UART_DEVICE_MAX); + + while (_uart[channel]->LSR & (1u << 5)); + _uart[channel]->THR = c; + return (1); } static int drv_uart_getc(struct rt_serial_device *serial) { - int ret = -1; struct device_uart *uart = serial->parent.user_data; + uart_device_number_t channel = _get_uart_channel(uart->hw_base); + RT_ASSERT(channel != UART_DEVICE_MAX); - if (uart->hw_base == UARTHS_BASE_ADDR) - { - uarths_rxdata_t recv = _uarths->rxdata; - if (recv.empty) - return EOF; - else - return (recv.data & 0xff); - } - + if (_uart[channel]->LSR & 1) + return (char)(_uart[channel]->RBR & 0xff); + else + return EOF; /* Receive Data Available */ return (-1); @@ -209,21 +434,20 @@ static int drv_uart_getc(struct rt_serial_device *serial) /* UART ISR */ static void uart_irq_handler(int irqno, void *param) { - rt_ubase_t isr; struct rt_serial_device *serial = (struct rt_serial_device *)param; struct device_uart *uart = serial->parent.user_data; + uart_device_number_t channel = _get_uart_channel(uart->hw_base); + RT_ASSERT(channel != UART_DEVICE_MAX); /* read interrupt status and clear it */ - if (uart->hw_base == UARTHS_BASE_ADDR) - { - if (_uarths->ip.rxwm) - rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); - } + if (_uart[channel]->LSR) + rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } /* WEAK for SDK 0.5.6 */ -RT_WEAK void uart_debug_init(int uart_channel) +RT_WEAK void uart_debug_init(uart_device_number_t uart_channel) { } + From 9d374f873cc9d3f0ee1af5f463fcaeee75d5f6e8 Mon Sep 17 00:00:00 2001 From: hphuang Date: Tue, 28 Apr 2020 19:07:08 +0800 Subject: [PATCH 25/27] mstorage.c: fix the issue that _read_capacity() returns the wrong last valid address of storage medium --- components/drivers/usb/usbdevice/class/mstorage.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/drivers/usb/usbdevice/class/mstorage.c b/components/drivers/usb/usbdevice/class/mstorage.c index 43fb25afe4..a681b8212f 100644 --- a/components/drivers/usb/usbdevice/class/mstorage.c +++ b/components/drivers/usb/usbdevice/class/mstorage.c @@ -426,7 +426,7 @@ static rt_size_t _read_capacity(ufunction_t func, ustorage_cbw_t cbw) data = (struct mstorage*)func->user_data; buf = data->ep_in->buffer; - sector_count = data->geometry.sector_count; + sector_count = data->geometry.sector_count - 1; /* Last Logical Block Address */ sector_size = data->geometry.bytes_per_sector; buf[0] = sector_count >> 24; From 79b44d29ad2c03b0634635797fb60b810b29eba3 Mon Sep 17 00:00:00 2001 From: Maofeng Date: Tue, 28 Apr 2020 03:23:09 +0800 Subject: [PATCH 26/27] [bsp\nrf5x]Support BSP UART0 --- bsp/nrf5x/libraries/drivers/drv_uart.c | 129 ++++++++++++++----------- bsp/nrf5x/nrf52840/board/Kconfig | 17 +++- bsp/nrf5x/nrf52840/rtconfig.h | 3 + 3 files changed, 89 insertions(+), 60 deletions(-) diff --git a/bsp/nrf5x/libraries/drivers/drv_uart.c b/bsp/nrf5x/libraries/drivers/drv_uart.c index b310fa57a4..08c7148353 100644 --- a/bsp/nrf5x/libraries/drivers/drv_uart.c +++ b/bsp/nrf5x/libraries/drivers/drv_uart.c @@ -1,59 +1,83 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-28 xckhmf Modify for + * + */ #include #include #include "drv_uart.h" -static struct rt_serial_device _serial0_0; -static void uart_event_hander(nrfx_uart_event_t const *p_event,void *p_context); +#ifdef BSP_USING_UART typedef struct { struct rt_serial_device *serial; nrfx_uart_t uart; + uint8_t rx_byte; + uint16_t rx_length; uint32_t rx_pin; uint32_t tx_pin; nrfx_uart_event_handler_t event_handler; -} UART_CFG_T; +} drv_uart_cfg_t; - -UART_CFG_T uart0 = { +#ifdef BSP_USING_UART0 +static struct rt_serial_device _serial_0; +static void uart0_event_hander(nrfx_uart_event_t const *p_event,void *p_context); +drv_uart_cfg_t m_uart0_cfg = { .uart = NRFX_UART_INSTANCE(0), -#ifdef RT_USING_CONSOLE - .rx_pin = 8, - .tx_pin = 6, - .event_handler = uart_event_hander, -#else - .rx_pin = 19, - .tx_pin = 20 -#endif + .rx_byte = 0, + .rx_length = 0, + .rx_pin = BSP_UART0_RX_PIN, + .tx_pin = BSP_UART0_TX_PIN, + .event_handler = uart0_event_hander }; -UART_CFG_T *working_cfg = RT_NULL; +#endif /* BSP_USING_UART0 */ -static void uart_event_hander(nrfx_uart_event_t const *p_event,void *p_context) -{ - +#ifdef BSP_USING_UART1 + #error not support UART1. Use UART0 instead. +#endif /* BSP_USING_UART1 */ + +#ifdef BSP_USING_UART0 +static void uart0_event_hander(nrfx_uart_event_t const *p_event,void *p_context) +{ if (p_event->type == NRFX_UART_EVT_RX_DONE) { - rt_hw_serial_isr(working_cfg->serial, RT_SERIAL_EVENT_RX_IND); + if(p_event->data.rxtx.bytes == 1) + { + m_uart0_cfg.rx_length = p_event->data.rxtx.bytes; + + /* rx_byte equal p_data */ + //m_uart0_cfg.rx_byte = *(p_event->data.rxtx.p_data); + + rt_hw_serial_isr(m_uart0_cfg.serial, RT_SERIAL_EVENT_RX_IND); + } + nrfx_uart_rx(&(m_uart0_cfg.uart),&m_uart0_cfg.rx_byte,1); } if (p_event->type == NRFX_UART_EVT_TX_DONE) { - + /* @TODO:[RT_DEVICE_FLAG_INT_TX]*/ } } +#endif /* BSP_USING_UART0 */ static rt_err_t _uart_cfg(struct rt_serial_device *serial, struct serial_configure *cfg) { - nrfx_uart_config_t config = NRFX_UART_DEFAULT_CONFIG(uart0.tx_pin,uart0.rx_pin); - UART_CFG_T *instance = &uart0; + nrfx_uart_config_t config = NRFX_UART_DEFAULT_CONFIG(BSP_UART0_TX_PIN,BSP_UART0_RX_PIN); + drv_uart_cfg_t *instance = RT_NULL; RT_ASSERT(serial != RT_NULL); RT_ASSERT(cfg != RT_NULL); - - if (serial->parent.user_data != RT_NULL) + + if (serial->parent.user_data == RT_NULL) { - instance = (UART_CFG_T*)serial->parent.user_data; + return -RT_ERROR; } - + instance = (drv_uart_cfg_t*)serial->parent.user_data; nrfx_uart_uninit(&(instance->uart)); switch (cfg->baud_rate) @@ -83,28 +107,23 @@ static rt_err_t _uart_cfg(struct rt_serial_device *serial, struct serial_configu config.hal_cfg.hwfc = NRF_UART_HWFC_DISABLED; config.pselrxd = instance->rx_pin; config.pseltxd = instance->tx_pin; - + nrfx_uart_init(&(instance->uart), &config, instance->event_handler); - - nrf_uart_int_enable(instance->uart.p_reg, NRF_UART_INT_MASK_RXDRDY | NRF_UART_INT_MASK_RXTO | NRF_UART_INT_MASK_ERROR); + nrfx_uart_rx(&(instance->uart),&(instance->rx_byte),1); nrf_uart_int_disable(instance->uart.p_reg, NRF_UART_INT_MASK_TXDRDY); - - nrfx_uart_rx_enable(&(instance->uart)); - - working_cfg = instance; return RT_EOK; } static rt_err_t _uart_ctrl(struct rt_serial_device *serial, int cmd, void *arg) { - UART_CFG_T *instance = working_cfg; - + drv_uart_cfg_t *instance = NULL; RT_ASSERT(serial != RT_NULL); - if (serial->parent.user_data != RT_NULL) + if (serial->parent.user_data == RT_NULL) { - instance = (UART_CFG_T*)serial->parent.user_data; + return -RT_ERROR; } + instance = (drv_uart_cfg_t*)serial->parent.user_data; switch (cmd) { @@ -129,10 +148,7 @@ static rt_err_t _uart_ctrl(struct rt_serial_device *serial, int cmd, void *arg) break; case RT_DEVICE_CTRL_PIN: - if (working_cfg != instance) - { - _uart_cfg(instance->serial, &(instance->serial->config)); - } + _uart_cfg(instance->serial, &(instance->serial->config)); break; case RT_DEVICE_POWERSAVE: @@ -152,13 +168,13 @@ static rt_err_t _uart_ctrl(struct rt_serial_device *serial, int cmd, void *arg) static int _uart_putc(struct rt_serial_device *serial, char c) { - UART_CFG_T *instance = working_cfg; + drv_uart_cfg_t *instance = NULL; int rtn = 1; RT_ASSERT(serial != RT_NULL); if (serial->parent.user_data != RT_NULL) { - instance = (UART_CFG_T*)serial->parent.user_data; + instance = (drv_uart_cfg_t*)serial->parent.user_data; } nrf_uart_event_clear(instance->uart.p_reg, NRF_UART_EVENT_TXDRDY); @@ -171,23 +187,21 @@ static int _uart_putc(struct rt_serial_device *serial, char c) return rtn; } -/* - @note: this function is invaild ,the cause of the problem is [nrfx_uart.c - line 340] -*/ static int _uart_getc(struct rt_serial_device *serial) { int ch = -1; - UART_CFG_T *instance = working_cfg; - + drv_uart_cfg_t *instance = NULL; RT_ASSERT(serial != RT_NULL); if (serial->parent.user_data != RT_NULL) { - instance = (UART_CFG_T*)serial->parent.user_data; + instance = (drv_uart_cfg_t*)serial->parent.user_data; + } + if(instance->rx_length) + { + ch = instance->rx_byte; + instance->rx_length--; } - - ch = (int)(nrf_uart_rxd_get(instance->uart.p_reg)); - return ch; } @@ -202,11 +216,14 @@ void rt_hw_uart_init(void) { struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; - config.bufsz = RT_SERIAL_RB_BUFSZ; - _serial0_0.config = config; - _serial0_0.ops = &_uart_ops; - uart0.serial = &_serial0_0; +#ifdef BSP_USING_UART0 + _serial_0.config = config; + _serial_0.ops = &_uart_ops; + m_uart0_cfg.serial = &_serial_0; + rt_hw_serial_register(&_serial_0, "uart0", \ + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, &m_uart0_cfg); +#endif /* BSP_USING_UART0 */ - rt_hw_serial_register(&_serial0_0, "uart0", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, &uart0); } +#endif /* BSP_USING_UART */ diff --git a/bsp/nrf5x/nrf52840/board/Kconfig b/bsp/nrf5x/nrf52840/board/Kconfig index b7edace9e8..e05787c775 100644 --- a/bsp/nrf5x/nrf52840/board/Kconfig +++ b/bsp/nrf5x/nrf52840/board/Kconfig @@ -2,14 +2,14 @@ menu "Hardware Drivers Config" config SOC_NRF52840 bool - config SOC_NRF52840 + config SOC_NRF52840 select RT_USING_COMPONENTS_INIT select RT_USING_USER_MAIN default y menu "Onboard Peripheral Drivers" config BSP_USING_JLINK_TO_USART - bool "Enable JLINK TO USART (uart0)" + bool "Enable JLINK TO USART (uart0|RX_PIN:8|TX_PIN:6)" select BSP_USING_UART select BSP_USING_UART0 default y @@ -30,11 +30,20 @@ menu "On-chip Peripheral Drivers" config BSP_USING_UART0 bool "Enable UART0" default y - + if BSP_USING_UART0 + config BSP_UART0_RX_PIN + int "uart0 rx pin number" + range 0 31 + default 8 + config BSP_UART0_TX_PIN + int "uart0 tx pin number" + range 0 31 + default 6 + endif config BSP_USING_UART1 bool "Enable UART1" default n - endif + endif endmenu endmenu diff --git a/bsp/nrf5x/nrf52840/rtconfig.h b/bsp/nrf5x/nrf52840/rtconfig.h index 1741c7dd7b..c63c401e68 100644 --- a/bsp/nrf5x/nrf52840/rtconfig.h +++ b/bsp/nrf5x/nrf52840/rtconfig.h @@ -155,10 +155,13 @@ /* Onboard Peripheral Drivers */ +#define BSP_USING_JLINK_TO_USART /* On-chip Peripheral Drivers */ #define BSP_USING_UART #define BSP_USING_UART0 +#define BSP_UART0_RX_PIN 8 +#define BSP_UART0_TX_PIN 6 #endif From 786eb5ae9c77970f25f662d57a83276d09c9a72d Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Thu, 30 Apr 2020 21:08:04 +0800 Subject: [PATCH 27/27] [C++] rename the Thread/Mutex to cxx_Thread/Mutex to avoid same name issue --- bsp/lpc54608-LPCXpresso/project.ewp | 8 +- bsp/lpc54608-LPCXpresso/project.ewt | 8 +- bsp/lpc54608-LPCXpresso/project.uvprojx | 1743 ++++++++--------- components/cplusplus/crt_init.c | 0 .../cplusplus/{Mutex.cpp => cxx_Mutex.cpp} | 0 .../{Semaphore.cpp => cxx_Semaphore.cpp} | 0 .../cplusplus/{Thread.cpp => cxx_Thread.cpp} | 0 components/cplusplus/{crt.cpp => cxx_crt.cpp} | 0 8 files changed, 876 insertions(+), 883 deletions(-) mode change 100755 => 100644 components/cplusplus/crt_init.c rename components/cplusplus/{Mutex.cpp => cxx_Mutex.cpp} (100%) rename components/cplusplus/{Semaphore.cpp => cxx_Semaphore.cpp} (100%) rename components/cplusplus/{Thread.cpp => cxx_Thread.cpp} (100%) rename components/cplusplus/{crt.cpp => cxx_crt.cpp} (100%) diff --git a/bsp/lpc54608-LPCXpresso/project.ewp b/bsp/lpc54608-LPCXpresso/project.ewp index 22154af07d..d16ead5d2c 100644 --- a/bsp/lpc54608-LPCXpresso/project.ewp +++ b/bsp/lpc54608-LPCXpresso/project.ewp @@ -2148,16 +2148,16 @@ CPlusPlus - $PROJ_DIR$\../../components/cplusplus/Mutex.cpp + $PROJ_DIR$\../../components/cplusplus/cxx_Mutex.cpp - $PROJ_DIR$\../../components/cplusplus/Semaphore.cpp + $PROJ_DIR$\../../components/cplusplus/cxx_Semaphore.cpp - $PROJ_DIR$\../../components/cplusplus/Thread.cpp + $PROJ_DIR$\../../components/cplusplus/cxx_Thread.cpp - $PROJ_DIR$\../../components/cplusplus/crt.cpp + $PROJ_DIR$\../../components/cplusplus/cxx_crt.cpp $PROJ_DIR$\../../components/cplusplus/crt_init.c diff --git a/bsp/lpc54608-LPCXpresso/project.ewt b/bsp/lpc54608-LPCXpresso/project.ewt index de78292e60..a1d63d5e4b 100644 --- a/bsp/lpc54608-LPCXpresso/project.ewt +++ b/bsp/lpc54608-LPCXpresso/project.ewt @@ -2355,19 +2355,19 @@ CPlusPlus - $PROJ_DIR$\..\..\components\cplusplus\crt.cpp + $PROJ_DIR$\..\..\components\cplusplus\cxx_crt.cpp $PROJ_DIR$\..\..\components\cplusplus\crt_init.c - $PROJ_DIR$\..\..\components\cplusplus\Mutex.cpp + $PROJ_DIR$\..\..\components\cplusplus\cxx_Mutex.cpp - $PROJ_DIR$\..\..\components\cplusplus\Semaphore.cpp + $PROJ_DIR$\..\..\components\cplusplus\cxx_Semaphore.cpp - $PROJ_DIR$\..\..\components\cplusplus\Thread.cpp + $PROJ_DIR$\..\..\components\cplusplus\cxx_Thread.cpp diff --git a/bsp/lpc54608-LPCXpresso/project.uvprojx b/bsp/lpc54608-LPCXpresso/project.uvprojx index ad2e225b2e..e7978224d2 100644 --- a/bsp/lpc54608-LPCXpresso/project.uvprojx +++ b/bsp/lpc54608-LPCXpresso/project.uvprojx @@ -330,9 +330,9 @@ 0 --library_interface=armcc --library_type=standardlib --diag_suppress=66,1296,186 - CPU_LPC54608J512ET180=1, CPU_LPC54608, CORE_M4, SDK_DEBUGCONSOLE=0, RT_USING_ARM_LIBC + SDK_DEBUGCONSOLE=0, CPU_LPC54608, CORE_M4, CPU_LPC54608J512ET180=1, RT_USING_ARM_LIBC - .;..\..\include;applications;.;drivers;SDK_2.2_LPCXpresso54608\CMSIS\Include;SDK_2.2_LPCXpresso54608\devices\LPC54608;SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers;SDK_2.2_LPCXpresso54608\devices\LPC54608\utilities;SDK_2.2_LPCXpresso54608\sdmmc_2.1.2\inc;SDK_2.2_LPCXpresso54608\sdmmc_2.1.2\src;..\..\libcpu\arm\common;..\..\libcpu\arm\cortex-m4;..\..\components\cplusplus;..\..\components\dfs\include;..\..\components\dfs\filesystems\devfs;..\..\components\dfs\filesystems\elmfat;..\..\components\drivers\include;..\..\components\drivers\include;..\..\components\drivers\include;..\..\components\drivers\include;..\..\components\drivers\include;..\..\components\drivers\include;..\..\components\drivers\spi;..\..\components\drivers\include;..\..\components\drivers\include;..\..\components\finsh;..\..\components\libc\compilers\armlibc;..\..\components\libc\compilers\common;..\..\components\libc\pthreads;..\..\components\libc\time;..\..\components\net\lwip-2.0.2\src;..\..\components\net\lwip-2.0.2\src\include;..\..\components\net\lwip-2.0.2\src\include\ipv4;..\..\components\net\lwip-2.0.2\src\arch\include;..\..\components\net\lwip-2.0.2\src\include\netif;..\..\components\net\netdev\include;..\..\components\net\sal_socket\include;..\..\components\net\sal_socket\include\socket;..\..\components\net\sal_socket\impl;..\..\components\net\sal_socket\include\dfs_net;..\..\components\net\sal_socket\include\dfs_net\sys_select;..\..\components\net\sal_socket\include\socket\sys_socket + .;../../include;applications;.;drivers;SDK_2.2_LPCXpresso54608/sdmmc_2.1.2/inc;SDK_2.2_LPCXpresso54608/sdmmc_2.1.2/src;SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers;SDK_2.2_LPCXpresso54608/devices/LPC54608/utilities;SDK_2.2_LPCXpresso54608/CMSIS/Include;SDK_2.2_LPCXpresso54608/devices/LPC54608;../../libcpu/arm/common;../../libcpu/arm/cortex-m4;../../components/finsh;../../components/dfs/include;../../components/dfs/filesystems/elmfat;../../components/dfs/filesystems/devfs;../../components/net/lwip-2.0.2/src;../../components/net/lwip-2.0.2/src/include;../../components/net/lwip-2.0.2/src/include/ipv4;../../components/net/lwip-2.0.2/src/arch/include;../../components/net/lwip-2.0.2/src/include/netif;../../components/net/netdev/include;../../components/net/sal_socket/include;../../components/net/sal_socket/include/socket;../../components/net/sal_socket/impl;../../components/net/sal_socket/include/dfs_net;../../components/net/sal_socket/include/dfs_net/sys_select;../../components/net/sal_socket/include/socket/sys_socket;../../components/drivers/include;../../components/drivers/include;../../components/drivers/spi;../../components/drivers/include;../../components/drivers/include;../../components/drivers/include;../../components/drivers/include;../../components/drivers/include;../../components/drivers/include;../../components/cplusplus;../../components/libc/compilers/armlibc;../../components/libc/compilers/common;../../components/libc/pthreads;../../components/libc/time @@ -379,112 +379,105 @@ clock.c 1 - ..\..\src\clock.c + ../../src/clock.c components.c 1 - ..\..\src\components.c - - - - - cpu.c - 1 - ..\..\src\cpu.c + ../../src/components.c device.c 1 - ..\..\src\device.c + ../../src/device.c idle.c 1 - ..\..\src\idle.c + ../../src/idle.c ipc.c 1 - ..\..\src\ipc.c + ../../src/ipc.c irq.c 1 - ..\..\src\irq.c + ../../src/irq.c kservice.c 1 - ..\..\src\kservice.c + ../../src/kservice.c mem.c 1 - ..\..\src\mem.c + ../../src/mem.c memheap.c 1 - ..\..\src\memheap.c + ../../src/memheap.c mempool.c 1 - ..\..\src\mempool.c + ../../src/mempool.c object.c 1 - ..\..\src\object.c + ../../src/object.c scheduler.c 1 - ..\..\src\scheduler.c + ../../src/scheduler.c signal.c 1 - ..\..\src\signal.c + ../../src/signal.c thread.c 1 - ..\..\src\thread.c + ../../src/thread.c timer.c 1 - ..\..\src\timer.c + ../../src/timer.c @@ -494,21 +487,21 @@ application.c 1 - applications\application.c + applications/application.c mnt.c 1 - applications\mnt.c + applications/mnt.c startup.c 1 - applications\startup.c + applications/startup.c @@ -518,84 +511,395 @@ board.c 1 - drivers\board.c + drivers/board.c clock_config.c 1 - drivers\clock_config.c + drivers/clock_config.c drt_mpu.c 1 - drivers\drt_mpu.c + drivers/drt_mpu.c drv_emac.c 1 - drivers\drv_emac.c + drivers/drv_emac.c drv_ft5406.c 1 - drivers\drv_ft5406.c + drivers/drv_ft5406.c drv_i2c.c 1 - drivers\drv_i2c.c + drivers/drv_i2c.c drv_lcd.c 1 - drivers\drv_lcd.c + drivers/drv_lcd.c drv_sd.c 1 - drivers\drv_sd.c + drivers/drv_sd.c drv_sdram.c 1 - drivers\drv_sdram.c + drivers/drv_sdram.c drv_sram.c 1 - drivers\drv_sram.c + drivers/drv_sram.c drv_uart.c 1 - drivers\drv_uart.c + drivers/drv_uart.c fsl_phy.c 1 - drivers\fsl_phy.c + drivers/fsl_phy.c + + + + + Libraries + + + fsl_sd.c + 1 + SDK_2.2_LPCXpresso54608/sdmmc_2.1.2/src/fsl_sd.c + + + + + fsl_sdmmc.c + 1 + SDK_2.2_LPCXpresso54608/sdmmc_2.1.2/src/fsl_sdmmc.c + + + + + fsl_host.c + 1 + SDK_2.2_LPCXpresso54608/sdmmc_2.1.2/src/fsl_host.c + + + + + fsl_sd_event.c + 1 + SDK_2.2_LPCXpresso54608/sdmmc_2.1.2/src/fsl_sd_event.c + + + + + fsl_adc.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_adc.c + + + + + fsl_clock.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_clock.c + + + + + fsl_common.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_common.c + + + + + fsl_crc.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_crc.c + + + + + fsl_ctimer.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_ctimer.c + + + + + fsl_dma.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_dma.c + + + + + fsl_dmic.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_dmic.c + + + + + fsl_dmic_dma.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_dmic_dma.c + + + + + fsl_eeprom.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_eeprom.c + + + + + fsl_emc.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_emc.c + + + + + fsl_enet.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_enet.c + + + + + fsl_flashiap.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_flashiap.c + + + + + fsl_flexcomm.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_flexcomm.c + + + + + fsl_fmc.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_fmc.c + + + + + fsl_fmeas.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_fmeas.c + + + + + fsl_gint.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_gint.c + + + + + fsl_gpio.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_gpio.c + + + + + fsl_i2c.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_i2c.c + + + + + fsl_i2c_dma.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_i2c_dma.c + + + + + fsl_i2s.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_i2s.c + + + + + fsl_i2s_dma.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_i2s_dma.c + + + + + fsl_inputmux.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_inputmux.c + + + + + fsl_lcdc.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_lcdc.c + + + + + fsl_mcan.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_mcan.c + + + + + fsl_mrt.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_mrt.c + + + + + fsl_pint.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_pint.c + + + + + fsl_power.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_power.c + + + + + fsl_reset.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_reset.c + + + + + fsl_rit.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_rit.c + + + + + fsl_rtc.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_rtc.c + + + + + fsl_sctimer.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_sctimer.c + + + + + fsl_sdif.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_sdif.c + + + + + fsl_spi.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_spi.c + + + + + fsl_spi_dma.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_spi_dma.c + + + + + fsl_spifi.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_spifi.c + + + + + fsl_spifi_dma.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_spifi_dma.c + + + + + fsl_usart.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_usart.c + + + + + fsl_usart_dma.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_usart_dma.c + + + + + fsl_utick.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_utick.c + + + + + fsl_wwdt.c + 1 + SDK_2.2_LPCXpresso54608/devices/LPC54608/drivers/fsl_wwdt.c @@ -605,332 +909,21 @@ startup_LPC54608.s 2 - SDK_2.2_LPCXpresso54608\devices\LPC54608\arm\startup_LPC54608.s + SDK_2.2_LPCXpresso54608/devices/LPC54608/arm/startup_LPC54608.s system_LPC54608.c 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\system_LPC54608.c + SDK_2.2_LPCXpresso54608/devices/LPC54608/system_LPC54608.c keil_lib_power.lib 4 - SDK_2.2_LPCXpresso54608\devices\LPC54608\arm\keil_lib_power.lib - - - - - Libraries - - - fsl_adc.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_adc.c - - - - - fsl_clock.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_clock.c - - - - - fsl_common.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_common.c - - - - - fsl_crc.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_crc.c - - - - - fsl_ctimer.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_ctimer.c - - - - - fsl_dma.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_dma.c - - - - - fsl_dmic.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_dmic.c - - - - - fsl_dmic_dma.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_dmic_dma.c - - - - - fsl_eeprom.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_eeprom.c - - - - - fsl_emc.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_emc.c - - - - - fsl_enet.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_enet.c - - - - - fsl_flashiap.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_flashiap.c - - - - - fsl_flexcomm.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_flexcomm.c - - - - - fsl_fmc.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_fmc.c - - - - - fsl_fmeas.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_fmeas.c - - - - - fsl_gint.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_gint.c - - - - - fsl_gpio.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_gpio.c - - - - - fsl_i2c.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_i2c.c - - - - - fsl_i2c_dma.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_i2c_dma.c - - - - - fsl_i2s.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_i2s.c - - - - - fsl_i2s_dma.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_i2s_dma.c - - - - - fsl_inputmux.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_inputmux.c - - - - - fsl_lcdc.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_lcdc.c - - - - - fsl_mcan.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_mcan.c - - - - - fsl_mrt.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_mrt.c - - - - - fsl_pint.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_pint.c - - - - - fsl_power.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_power.c - - - - - fsl_reset.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_reset.c - - - - - fsl_rit.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_rit.c - - - - - fsl_rtc.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_rtc.c - - - - - fsl_sctimer.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_sctimer.c - - - - - fsl_sdif.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_sdif.c - - - - - fsl_spi.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_spi.c - - - - - fsl_spi_dma.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_spi_dma.c - - - - - fsl_spifi.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_spifi.c - - - - - fsl_spifi_dma.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_spifi_dma.c - - - - - fsl_usart.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_usart.c - - - - - fsl_usart_dma.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_usart_dma.c - - - - - fsl_utick.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_utick.c - - - - - fsl_wwdt.c - 1 - SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers\fsl_wwdt.c - - - - - fsl_sd.c - 1 - SDK_2.2_LPCXpresso54608\sdmmc_2.1.2\src\fsl_sd.c - - - - - fsl_sdmmc.c - 1 - SDK_2.2_LPCXpresso54608\sdmmc_2.1.2\src\fsl_sdmmc.c - - - - - fsl_host.c - 1 - SDK_2.2_LPCXpresso54608\sdmmc_2.1.2\src\fsl_host.c - - - - - fsl_sd_event.c - 1 - SDK_2.2_LPCXpresso54608\sdmmc_2.1.2\src\fsl_sd_event.c + SDK_2.2_LPCXpresso54608/devices/LPC54608/arm/keil_lib_power.lib @@ -940,73 +933,136 @@ backtrace.c 1 - ..\..\libcpu\arm\common\backtrace.c + ../../libcpu/arm/common/backtrace.c div0.c 1 - ..\..\libcpu\arm\common\div0.c + ../../libcpu/arm/common/div0.c showmem.c 1 - ..\..\libcpu\arm\common\showmem.c + ../../libcpu/arm/common/showmem.c cpuport.c 1 - ..\..\libcpu\arm\cortex-m4\cpuport.c + ../../libcpu/arm/cortex-m4/cpuport.c context_rvds.S 2 - ..\..\libcpu\arm\cortex-m4\context_rvds.S + ../../libcpu/arm/cortex-m4/context_rvds.S - CPlusPlus + finsh - Mutex.cpp - 8 - ..\..\components\cplusplus\Mutex.cpp - - - - - Semaphore.cpp - 8 - ..\..\components\cplusplus\Semaphore.cpp - - - - - Thread.cpp - 8 - ..\..\components\cplusplus\Thread.cpp - - - - - crt.cpp - 8 - ..\..\components\cplusplus\crt.cpp - - - - - crt_init.c + shell.c 1 - ..\..\components\cplusplus\crt_init.c + ../../components/finsh/shell.c + + + + + cmd.c + 1 + ../../components/finsh/cmd.c + + + + + msh.c + 1 + ../../components/finsh/msh.c + + + + + msh_file.c + 1 + ../../components/finsh/msh_file.c + + + + + finsh_compiler.c + 1 + ../../components/finsh/finsh_compiler.c + + + + + finsh_error.c + 1 + ../../components/finsh/finsh_error.c + + + + + finsh_heap.c + 1 + ../../components/finsh/finsh_heap.c + + + + + finsh_init.c + 1 + ../../components/finsh/finsh_init.c + + + + + finsh_node.c + 1 + ../../components/finsh/finsh_node.c + + + + + finsh_ops.c + 1 + ../../components/finsh/finsh_ops.c + + + + + finsh_parser.c + 1 + ../../components/finsh/finsh_parser.c + + + + + finsh_var.c + 1 + ../../components/finsh/finsh_var.c + + + + + finsh_vm.c + 1 + ../../components/finsh/finsh_vm.c + + + + + finsh_token.c + 1 + ../../components/finsh/finsh_token.c @@ -1016,213 +1072,530 @@ dfs.c 1 - ..\..\components\dfs\src\dfs.c + ../../components/dfs/src/dfs.c dfs_file.c 1 - ..\..\components\dfs\src\dfs_file.c + ../../components/dfs/src/dfs_file.c dfs_fs.c 1 - ..\..\components\dfs\src\dfs_fs.c + ../../components/dfs/src/dfs_fs.c dfs_posix.c 1 - ..\..\components\dfs\src\dfs_posix.c + ../../components/dfs/src/dfs_posix.c poll.c 1 - ..\..\components\dfs\src\poll.c + ../../components/dfs/src/poll.c select.c 1 - ..\..\components\dfs\src\select.c - - - - - devfs.c - 1 - ..\..\components\dfs\filesystems\devfs\devfs.c + ../../components/dfs/src/select.c dfs_elm.c 1 - ..\..\components\dfs\filesystems\elmfat\dfs_elm.c + ../../components/dfs/filesystems/elmfat/dfs_elm.c ff.c 1 - ..\..\components\dfs\filesystems\elmfat\ff.c + ../../components/dfs/filesystems/elmfat/ff.c + + + + + devfs.c + 1 + ../../components/dfs/filesystems/devfs/devfs.c + + + + + lwIP + + + sys_arch.c + 1 + ../../components/net/lwip-2.0.2/src/arch/sys_arch.c + + + + + api_lib.c + 1 + ../../components/net/lwip-2.0.2/src/api/api_lib.c + + + + + api_msg.c + 1 + ../../components/net/lwip-2.0.2/src/api/api_msg.c + + + + + err.c + 1 + ../../components/net/lwip-2.0.2/src/api/err.c + + + + + netbuf.c + 1 + ../../components/net/lwip-2.0.2/src/api/netbuf.c + + + + + netdb.c + 1 + ../../components/net/lwip-2.0.2/src/api/netdb.c + + + + + netifapi.c + 1 + ../../components/net/lwip-2.0.2/src/api/netifapi.c + + + + + sockets.c + 1 + ../../components/net/lwip-2.0.2/src/api/sockets.c + + + + + tcpip.c + 1 + ../../components/net/lwip-2.0.2/src/api/tcpip.c + + + + + def.c + 1 + ../../components/net/lwip-2.0.2/src/core/def.c + + + + + dns.c + 1 + ../../components/net/lwip-2.0.2/src/core/dns.c + + + + + inet_chksum.c + 1 + ../../components/net/lwip-2.0.2/src/core/inet_chksum.c + + + + + init.c + 1 + ../../components/net/lwip-2.0.2/src/core/init.c + + + + + ip.c + 1 + ../../components/net/lwip-2.0.2/src/core/ip.c + + + + + memp.c + 1 + ../../components/net/lwip-2.0.2/src/core/memp.c + + + + + netif.c + 1 + ../../components/net/lwip-2.0.2/src/core/netif.c + + + + + pbuf.c + 1 + ../../components/net/lwip-2.0.2/src/core/pbuf.c + + + + + raw.c + 1 + ../../components/net/lwip-2.0.2/src/core/raw.c + + + + + stats.c + 1 + ../../components/net/lwip-2.0.2/src/core/stats.c + + + + + sys.c + 1 + ../../components/net/lwip-2.0.2/src/core/sys.c + + + + + tcp.c + 1 + ../../components/net/lwip-2.0.2/src/core/tcp.c + + + + + tcp_in.c + 1 + ../../components/net/lwip-2.0.2/src/core/tcp_in.c + + + + + tcp_out.c + 1 + ../../components/net/lwip-2.0.2/src/core/tcp_out.c + + + + + timeouts.c + 1 + ../../components/net/lwip-2.0.2/src/core/timeouts.c + + + + + udp.c + 1 + ../../components/net/lwip-2.0.2/src/core/udp.c + + + + + ethernet.c + 1 + ../../components/net/lwip-2.0.2/src/netif/ethernet.c + + + + + ethernetif.c + 1 + ../../components/net/lwip-2.0.2/src/netif/ethernetif.c + + + + + lowpan6.c + 1 + ../../components/net/lwip-2.0.2/src/netif/lowpan6.c + + + + + autoip.c + 1 + ../../components/net/lwip-2.0.2/src/core/ipv4/autoip.c + + + + + dhcp.c + 1 + ../../components/net/lwip-2.0.2/src/core/ipv4/dhcp.c + + + + + etharp.c + 1 + ../../components/net/lwip-2.0.2/src/core/ipv4/etharp.c + + + + + icmp.c + 1 + ../../components/net/lwip-2.0.2/src/core/ipv4/icmp.c + + + + + igmp.c + 1 + ../../components/net/lwip-2.0.2/src/core/ipv4/igmp.c + + + + + ip4.c + 1 + ../../components/net/lwip-2.0.2/src/core/ipv4/ip4.c + + + + + ip4_addr.c + 1 + ../../components/net/lwip-2.0.2/src/core/ipv4/ip4_addr.c + + + + + ip4_frag.c + 1 + ../../components/net/lwip-2.0.2/src/core/ipv4/ip4_frag.c + + + + + ping.c + 1 + ../../components/net/lwip-2.0.2/src/apps/ping/ping.c + + + + + netdev + + + netdev.c + 1 + ../../components/net/netdev/src/netdev.c + + + + + netdev_ipaddr.c + 1 + ../../components/net/netdev/src/netdev_ipaddr.c + + + + + SAL + + + sal_socket.c + 1 + ../../components/net/sal_socket/src/sal_socket.c + + + + + net_netdb.c + 1 + ../../components/net/sal_socket/socket/net_netdb.c + + + + + af_inet_lwip.c + 1 + ../../components/net/sal_socket/impl/af_inet_lwip.c + + + + + net_sockets.c + 1 + ../../components/net/sal_socket/socket/net_sockets.c + + + + + dfs_net.c + 1 + ../../components/net/sal_socket/dfs_net/dfs_net.c DeviceDrivers - - - i2c_core.c - 1 - ..\..\components\drivers\i2c\i2c_core.c - - - - - i2c_dev.c - 1 - ..\..\components\drivers\i2c\i2c_dev.c - - - - - i2c-bit-ops.c - 1 - ..\..\components\drivers\i2c\i2c-bit-ops.c - - - - - pin.c - 1 - ..\..\components\drivers\misc\pin.c - - - - - mtd_nand.c - 1 - ..\..\components\drivers\mtd\mtd_nand.c - - - - - rtc.c - 1 - ..\..\components\drivers\rtc\rtc.c - - block_dev.c 1 - ..\..\components\drivers\sdio\block_dev.c + ../../components/drivers/sdio/block_dev.c mmcsd_core.c 1 - ..\..\components\drivers\sdio\mmcsd_core.c + ../../components/drivers/sdio/mmcsd_core.c sd.c 1 - ..\..\components\drivers\sdio\sd.c + ../../components/drivers/sdio/sd.c sdio.c 1 - ..\..\components\drivers\sdio\sdio.c + ../../components/drivers/sdio/sdio.c mmc.c 1 - ..\..\components\drivers\sdio\mmc.c + ../../components/drivers/sdio/mmc.c - serial.c + rtc.c 1 - ..\..\components\drivers\serial\serial.c + ../../components/drivers/rtc/rtc.c spi_core.c 1 - ..\..\components\drivers\spi\spi_core.c + ../../components/drivers/spi/spi_core.c spi_dev.c 1 - ..\..\components\drivers\spi\spi_dev.c + ../../components/drivers/spi/spi_dev.c + + + + + i2c_core.c + 1 + ../../components/drivers/i2c/i2c_core.c + + + + + i2c_dev.c + 1 + ../../components/drivers/i2c/i2c_dev.c + + + + + i2c-bit-ops.c + 1 + ../../components/drivers/i2c/i2c-bit-ops.c + + + + + serial.c + 1 + ../../components/drivers/serial/serial.c completion.c 1 - ..\..\components\drivers\src\completion.c + ../../components/drivers/src/completion.c dataqueue.c 1 - ..\..\components\drivers\src\dataqueue.c + ../../components/drivers/src/dataqueue.c pipe.c 1 - ..\..\components\drivers\src\pipe.c + ../../components/drivers/src/pipe.c ringblk_buf.c 1 - ..\..\components\drivers\src\ringblk_buf.c + ../../components/drivers/src/ringblk_buf.c ringbuffer.c 1 - ..\..\components\drivers\src\ringbuffer.c + ../../components/drivers/src/ringbuffer.c waitqueue.c 1 - ..\..\components\drivers\src\waitqueue.c + ../../components/drivers/src/waitqueue.c workqueue.c 1 - ..\..\components\drivers\src\workqueue.c + ../../components/drivers/src/workqueue.c + + + + + mtd_nand.c + 1 + ../../components/drivers/mtd/mtd_nand.c + + + + + pin.c + 1 + ../../components/drivers/misc/pin.c @@ -1239,103 +1612,40 @@ - finsh + CPlusPlus - shell.c - 1 - ..\..\components\finsh\shell.c + cxx_Mutex.cpp + 8 + ../../components/cplusplus/cxx_Mutex.cpp - cmd.c - 1 - ..\..\components\finsh\cmd.c + cxx_Semaphore.cpp + 8 + ../../components/cplusplus/cxx_Semaphore.cpp - msh.c - 1 - ..\..\components\finsh\msh.c + cxx_Thread.cpp + 8 + ../../components/cplusplus/cxx_Thread.cpp - msh_file.c - 1 - ..\..\components\finsh\msh_file.c + cxx_crt.cpp + 8 + ../../components/cplusplus/cxx_crt.cpp - finsh_compiler.c + crt_init.c 1 - ..\..\components\finsh\finsh_compiler.c - - - - - finsh_error.c - 1 - ..\..\components\finsh\finsh_error.c - - - - - finsh_heap.c - 1 - ..\..\components\finsh\finsh_heap.c - - - - - finsh_init.c - 1 - ..\..\components\finsh\finsh_init.c - - - - - finsh_node.c - 1 - ..\..\components\finsh\finsh_node.c - - - - - finsh_ops.c - 1 - ..\..\components\finsh\finsh_ops.c - - - - - finsh_parser.c - 1 - ..\..\components\finsh\finsh_parser.c - - - - - finsh_var.c - 1 - ..\..\components\finsh\finsh_var.c - - - - - finsh_vm.c - 1 - ..\..\components\finsh\finsh_vm.c - - - - - finsh_token.c - 1 - ..\..\components\finsh\finsh_token.c + ../../components/cplusplus/crt_init.c @@ -1345,35 +1655,35 @@ libc.c 1 - ..\..\components\libc\compilers\armlibc\libc.c + ../../components/libc/compilers/armlibc/libc.c mem_std.c 1 - ..\..\components\libc\compilers\armlibc\mem_std.c + ../../components/libc/compilers/armlibc/mem_std.c stdio.c 1 - ..\..\components\libc\compilers\armlibc\stdio.c + ../../components/libc/compilers/armlibc/stdio.c stubs.c 1 - ..\..\components\libc\compilers\armlibc\stubs.c + ../../components/libc/compilers/armlibc/stubs.c time.c 1 - ..\..\components\libc\compilers\common\time.c + ../../components/libc/compilers/common/time.c @@ -1383,408 +1693,91 @@ mqueue.c 1 - ..\..\components\libc\pthreads\mqueue.c + ../../components/libc/pthreads/mqueue.c pthread.c 1 - ..\..\components\libc\pthreads\pthread.c + ../../components/libc/pthreads/pthread.c pthread_attr.c 1 - ..\..\components\libc\pthreads\pthread_attr.c + ../../components/libc/pthreads/pthread_attr.c pthread_barrier.c 1 - ..\..\components\libc\pthreads\pthread_barrier.c + ../../components/libc/pthreads/pthread_barrier.c pthread_cond.c 1 - ..\..\components\libc\pthreads\pthread_cond.c + ../../components/libc/pthreads/pthread_cond.c pthread_mutex.c 1 - ..\..\components\libc\pthreads\pthread_mutex.c + ../../components/libc/pthreads/pthread_mutex.c pthread_rwlock.c 1 - ..\..\components\libc\pthreads\pthread_rwlock.c + ../../components/libc/pthreads/pthread_rwlock.c pthread_spin.c 1 - ..\..\components\libc\pthreads\pthread_spin.c + ../../components/libc/pthreads/pthread_spin.c pthread_tls.c 1 - ..\..\components\libc\pthreads\pthread_tls.c + ../../components/libc/pthreads/pthread_tls.c sched.c 1 - ..\..\components\libc\pthreads\sched.c + ../../components/libc/pthreads/sched.c semaphore.c 1 - ..\..\components\libc\pthreads\semaphore.c + ../../components/libc/pthreads/semaphore.c clock_time.c 1 - ..\..\components\libc\time\clock_time.c + ../../components/libc/time/clock_time.c posix_sleep.c 1 - ..\..\components\libc\time\posix_sleep.c - - - - - lwIP - - - sys_arch.c - 1 - ..\..\components\net\lwip-2.0.2\src\arch\sys_arch.c - - - - - api_lib.c - 1 - ..\..\components\net\lwip-2.0.2\src\api\api_lib.c - - - - - api_msg.c - 1 - ..\..\components\net\lwip-2.0.2\src\api\api_msg.c - - - - - err.c - 1 - ..\..\components\net\lwip-2.0.2\src\api\err.c - - - - - netbuf.c - 1 - ..\..\components\net\lwip-2.0.2\src\api\netbuf.c - - - - - netdb.c - 1 - ..\..\components\net\lwip-2.0.2\src\api\netdb.c - - - - - netifapi.c - 1 - ..\..\components\net\lwip-2.0.2\src\api\netifapi.c - - - - - sockets.c - 1 - ..\..\components\net\lwip-2.0.2\src\api\sockets.c - - - - - tcpip.c - 1 - ..\..\components\net\lwip-2.0.2\src\api\tcpip.c - - - - - def.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\def.c - - - - - dns.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\dns.c - - - - - inet_chksum.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\inet_chksum.c - - - - - init.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\init.c - - - - - ip.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\ip.c - - - - - memp.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\memp.c - - - - - netif.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\netif.c - - - - - pbuf.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\pbuf.c - - - - - raw.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\raw.c - - - - - stats.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\stats.c - - - - - sys.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\sys.c - - - - - tcp.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\tcp.c - - - - - tcp_in.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\tcp_in.c - - - - - tcp_out.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\tcp_out.c - - - - - timeouts.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\timeouts.c - - - - - udp.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\udp.c - - - - - ethernet.c - 1 - ..\..\components\net\lwip-2.0.2\src\netif\ethernet.c - - - - - ethernetif.c - 1 - ..\..\components\net\lwip-2.0.2\src\netif\ethernetif.c - - - - - lowpan6.c - 1 - ..\..\components\net\lwip-2.0.2\src\netif\lowpan6.c - - - - - autoip.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\ipv4\autoip.c - - - - - dhcp.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\ipv4\dhcp.c - - - - - etharp.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\ipv4\etharp.c - - - - - icmp.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\ipv4\icmp.c - - - - - igmp.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\ipv4\igmp.c - - - - - ip4.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\ipv4\ip4.c - - - - - ip4_addr.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\ipv4\ip4_addr.c - - - - - ip4_frag.c - 1 - ..\..\components\net\lwip-2.0.2\src\core\ipv4\ip4_frag.c - - - - - ping.c - 1 - ..\..\components\net\lwip-2.0.2\src\apps\ping\ping.c - - - - - netdev - - - netdev.c - 1 - ..\..\components\net\netdev\src\netdev.c - - - - - netdev_ipaddr.c - 1 - ..\..\components\net\netdev\src\netdev_ipaddr.c - - - - - SAL - - - sal_socket.c - 1 - ..\..\components\net\sal_socket\src\sal_socket.c - - - - - net_netdb.c - 1 - ..\..\components\net\sal_socket\socket\net_netdb.c - - - - - af_inet_lwip.c - 1 - ..\..\components\net\sal_socket\impl\af_inet_lwip.c - - - - - net_sockets.c - 1 - ..\..\components\net\sal_socket\socket\net_sockets.c - - - - - dfs_net.c - 1 - ..\..\components\net\sal_socket\dfs_net\dfs_net.c + ../../components/libc/time/posix_sleep.c diff --git a/components/cplusplus/crt_init.c b/components/cplusplus/crt_init.c old mode 100755 new mode 100644 diff --git a/components/cplusplus/Mutex.cpp b/components/cplusplus/cxx_Mutex.cpp similarity index 100% rename from components/cplusplus/Mutex.cpp rename to components/cplusplus/cxx_Mutex.cpp diff --git a/components/cplusplus/Semaphore.cpp b/components/cplusplus/cxx_Semaphore.cpp similarity index 100% rename from components/cplusplus/Semaphore.cpp rename to components/cplusplus/cxx_Semaphore.cpp diff --git a/components/cplusplus/Thread.cpp b/components/cplusplus/cxx_Thread.cpp similarity index 100% rename from components/cplusplus/Thread.cpp rename to components/cplusplus/cxx_Thread.cpp diff --git a/components/cplusplus/crt.cpp b/components/cplusplus/cxx_crt.cpp similarity index 100% rename from components/cplusplus/crt.cpp rename to components/cplusplus/cxx_crt.cpp