├── LICENSE ├── README.md ├── README_Kconfig.md ├── bsp_skeleton ├── .config ├── Kconfig ├── Libraries │ ├── CMSIS │ │ └── startup_xxx.s │ └── SConscript ├── README.md ├── SConscript ├── SConstruct ├── applications │ ├── SConscript │ ├── main.c │ └── mnt.c ├── drivers │ ├── Kconfig │ ├── SConscript │ ├── board.c │ ├── board.h │ ├── drv_adc.c │ ├── drv_adc.h │ ├── drv_cputime.c │ ├── drv_cputime.h │ ├── drv_emac.c │ ├── drv_emac.h │ ├── drv_gpio.c │ ├── drv_gpio.h │ ├── drv_hwtimer.c │ ├── drv_hwtimer.h │ ├── drv_i2c.c │ ├── drv_i2c.h │ ├── drv_i2s.c │ ├── drv_i2s.h │ ├── drv_lcd.c │ ├── drv_lcd.h │ ├── drv_pwm.c │ ├── drv_pwm.h │ ├── drv_rtc.c │ ├── drv_rtc.h │ ├── drv_sdio.c │ ├── drv_sdio.h │ ├── drv_spi.c │ ├── drv_spi.h │ ├── drv_uart.c │ ├── drv_uart.h │ ├── drv_usbd.c │ ├── drv_usbh.c │ ├── drv_wdt.c │ ├── drv_wdt.h │ ├── drv_wlan.c │ ├── drv_wlan.h │ └── linker_scripts │ │ ├── link.icf │ │ ├── link.lds │ │ └── link.sct ├── libcpu │ ├── SConscript │ ├── context_gcc.S │ ├── port.c │ ├── port.h │ └── startup_gcc.S ├── project.ewd ├── project.ewp ├── project.eww ├── project.uvopt ├── project.uvoptx ├── project.uvproj ├── project.uvprojx ├── rtconfig.h ├── rtconfig.py ├── template.ewp ├── template.eww ├── template.uvopt ├── template.uvoptx ├── template.uvproj └── template.uvprojx ├── drivers ├── README.md └── skeleton.md ├── git_pr.md ├── imgs ├── README.md ├── git_pr1.png └── git_pr2.png ├── name-specification.md ├── package.md ├── porting └── README.md └── smp_skeleton ├── .config ├── Kconfig ├── README.md ├── SConscript ├── SConstruct ├── applications ├── SConscript ├── main.c └── mnt.c ├── driver ├── Kconfig ├── SConscript ├── board.c ├── board.h ├── drv_adc.c ├── drv_adc.h ├── drv_cputime.c ├── drv_cputime.h ├── drv_emac.c ├── drv_emac.h ├── drv_gpio.c ├── drv_gpio.h ├── drv_hwtimer.c ├── drv_hwtimer.h ├── drv_i2c.c ├── drv_i2c.h ├── drv_i2s.c ├── drv_i2s.h ├── drv_lcd.c ├── drv_lcd.h ├── drv_pwm.c ├── drv_pwm.h ├── drv_rtc.c ├── drv_rtc.h ├── drv_sdio.c ├── drv_sdio.h ├── drv_spi.c ├── drv_spi.h ├── drv_uart.c ├── drv_uart.h ├── drv_usbd.c ├── drv_usbh.c ├── drv_wdt.c ├── drv_wdt.h ├── drv_wlan.c └── drv_wlan.h ├── libcpu ├── SConscript ├── context_gcc.S ├── cpuport.c ├── cpuport.h ├── interrupt.c ├── interrupt.h ├── secondary_cpu.c ├── startup_gcc.S └── traps_gcc.S ├── link.lds ├── rtconfig.h └── rtconfig.py /README.md: -------------------------------------------------------------------------------- 1 | # RT-Thread 移植、设备驱动接口实现规范 2 | 3 | 标签: RT-Thread规范 4 | 5 | --- 6 | 7 | 本文档描述了如何进行RT-Thread针对一个芯片架构的移植,以及设备驱动的接口规范。系统工程师根据本文档进行RT-Thread对不同芯片的移植,并编写对应的外设驱动,集成到RT-Thread系统中。 8 | 9 | ## 目录结构 10 | 11 | | 目录名 | 说明 | 12 | | ------ | ---- | 13 | | [porting][1] | 和CPU移植相关的文档 | 14 | | [drivers][2] | 和外设驱动移植相关的文档 | 15 | | [bsp_skeleton][3] | 一份空白的BSP模版,包括SConscript编译脚本等 | 16 | 17 | ## 名字 18 | 19 | 对一份BSP移植,需要遵循一定的命名规范,请参阅[这份文档][4]。 20 | 21 | ## 板级支持包配置Kconfig 22 | 23 | 自RT-Thread 3.0.x以来,推荐使用Kconfig来进行系统、外设的配置,详细情况请看 [Kconfig][5] 说明。 24 | 25 | ## 提交PR 26 | 27 | 当完成一份BSP移植并需要提交到RT-Thread的git repo时,请参阅和PR相关的[文档][6]。 28 | 29 | 30 | [1]: porting/README.md 31 | [2]: drivers/README.md 32 | [3]: bsp_skeleton/ 33 | [4]: name-specification.md 34 | [5]: README_Kconfig.md 35 | [6]: git_pr.md 36 | -------------------------------------------------------------------------------- /README_Kconfig.md: -------------------------------------------------------------------------------- 1 | # BSP中的Kconfig文件说明 2 | 3 | 标签: RT-Thread规范 4 | 5 | --- 6 | 7 | 自从RT-Thread 3.0.0开始,BSP中推荐使用menuconfig方式来进行系统配置,同时包管理器也附着在menuconfig上。所以RT-Thread 3.0.x后续的版本,[env工具][1]变成一份必不可少的工具。 8 | 9 | 本篇文档主要说明BSP包中和Kconfig相关的部分。 10 | 11 | ## Kconfig 语法 12 | 13 | Kconfig源自Linux Kernel,是Linux Kernel的典型、成熟配置方式,也广泛被其他开源项目所使用,[例如buildroot][2],Kconfig的完整语法放置于[Linux Kernel][3]中。 14 | 15 | ## BSP中的Kconfig文件说明 16 | 17 | 一份BSP中典型的Kconfig文件如下所示 18 | 19 | ```Kconfig 20 | mainmenu "RT-Thread Project Configuration" 21 | 22 | config BSP_DIR 23 | string 24 | option env="BSP_ROOT" 25 | default "." 26 | 27 | config RTT_DIR 28 | string 29 | option env="RTT_ROOT" 30 | default "../.." 31 | 32 | config PKGS_DIR 33 | string 34 | option env="PKGS_ROOT" 35 | default "packages" 36 | 37 | source "$RTT_DIR/Kconfig" 38 | source "$PKGS_DIR/Kconfig" 39 | source "$BSP_DIR/drivers/Kconfig" 40 | 41 | config SOC_IMXRT1052 42 | bool 43 | select ARCH_ARM_CORTEX_M7 44 | default y 45 | 46 | ``` 47 | 48 | 其中, 49 | 50 | * BSP_DIR变量定义了BSP根目录,默认是`.` (因为上面一份Kconfig文件放置于BSP板级支持包目录下),除非Host系统中定义了`BSP_ROOT`的环境变量; 51 | * RTT_DIR变量定义了RT-Thread **根目录**,因为板级包目录默认放置在`rt-thread/bsp`目录下,所以这个变量的默认值是`../..`,除非系统中定义了`RTT_ROOT`的环境变量; 52 | * PKGS_DIR变量定义了RT-Thread包根目录,一般它会从系统的环境变量`PKGS_ROOT`中获得,而如果使用RT-Thread/env工具,env工具在启动console终端时会默认地定义这个环境变量; 53 | 54 | 这份Kconfig文件的后面部分则把相关的Kconfig文件都包含到这个Kconfig文件中来,最关键的是RT-Thread主干Kconfig文件 `$RTT_DIR/Kconfig` 和包Kconfig文件 `$PKGS_DIR/Kconfig` 。而`$BSP_DIR/drivers/Kconfig`文件则是把驱动的Kconfig配置文件添加进来。 55 | 56 | 更后面的配置项: 57 | 58 | ```kconfig 59 | config SOC_IMXRT1052 60 | bool 61 | select ARCH_ARM_CORTEX_M7 62 | default y 63 | ``` 64 | 65 | 它定义了芯片的型号`(SOC_IMXRT1052)`,同时选择了对应的芯片架构`(ARCH_ARM_CORTEX_M7)`。建议BSP的配置文件都做相应的定义,以反映芯片的型号,架构情况。因为在Kconfig的其他配置中,可能会有架构级的依赖项。缺少架构的定义,一些配置可能会变得不可见。 66 | 67 | ## 驱动中的Kconfig文件 68 | 69 | 一般建议在`$BSP_DIR/drivers`目录下加入Kconfig配置文件,从而不需要总是修改`BSP_DIR/Kconfig`文件,一份简单的驱动Kconfig如下所示: 70 | 71 | ```kconfig 72 | config RT_USING_UART0 73 | bool "Enable UART0" 74 | default n 75 | 76 | config RT_USING_UART1 77 | bool "Enable UART1" 78 | default y 79 | 80 | config BSP_DRV_CLCD 81 | bool "CLCD driver" 82 | depends on RT_USING_GUIENGINE 83 | default y 84 | 85 | config BSP_DRV_EMAC 86 | bool "EMAC driver" 87 | depends on RT_USING_LWIP 88 | default y 89 | ``` 90 | 91 | 其中一些需要着重说明的部分: 92 | 93 | * **配置项是属于RT-Thread本身的,还是属于这个BSP所特有的?** 94 | - 如果是RT-Thread本身的,那么配置项应该放在RT-Thread中,而不是BSP目录下;<如果RT-Thread确实缺少对应的一些配置项,请向RT-Thread github提交PR> 95 | - 如果是BSP本身的,则在`$BSP_DIR/Kconfig`文件中添加相应的配置项;如果对应配置项还是默认必须的,那么可直接添加一个无提示、默认是选择的配置项。 96 | * 针对于外设驱动配置项,可以多考虑携带`depends`或`select`的配置项: 97 | - `depends on OPTION` 表示这个配置项依赖于OPTION,只有当OPTION被选择时,这个配置项才有效; 98 | - `select OPTION` 表示当当前配置项被选择时,OPTION会被自动选择上; 99 | * 另外,请注意外设配置在`$RTT_DIR/components/drivers/Kconfig`中还存在一份;这份配置可以定义出系统中哪些抽象型的外设驱动框架已经定义了,可以由这份配置来做BSP板级支持包驱动的依赖 `depends on` ;也可以由BSP板级支持包外设驱动来做选择 `select`。 100 | 101 | [1]: https://www.rt-thread.org/page/download.html 102 | [2]: https://buildroot.org/ 103 | [3]: https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt 104 | -------------------------------------------------------------------------------- /bsp_skeleton/.config: -------------------------------------------------------------------------------- 1 | # 2 | # Automatically generated file; DO NOT EDIT. 3 | # RT-Thread Project Configuration 4 | # 5 | 6 | # 7 | # RT-Thread Kernel 8 | # 9 | CONFIG_RT_NAME_MAX=8 10 | # CONFIG_RT_USING_SMP is not set 11 | CONFIG_RT_ALIGN_SIZE=4 12 | # CONFIG_RT_THREAD_PRIORITY_8 is not set 13 | CONFIG_RT_THREAD_PRIORITY_32=y 14 | # CONFIG_RT_THREAD_PRIORITY_256 is not set 15 | CONFIG_RT_THREAD_PRIORITY_MAX=32 16 | CONFIG_RT_TICK_PER_SECOND=100 17 | CONFIG_RT_USING_OVERFLOW_CHECK=y 18 | CONFIG_RT_USING_HOOK=y 19 | CONFIG_RT_USING_IDLE_HOOK=y 20 | CONFIG_RT_IDEL_HOOK_LIST_SIZE=4 21 | CONFIG_IDLE_THREAD_STACK_SIZE=256 22 | # CONFIG_RT_USING_TIMER_SOFT is not set 23 | CONFIG_RT_DEBUG=y 24 | CONFIG_RT_DEBUG_COLOR=y 25 | # CONFIG_RT_DEBUG_INIT_CONFIG is not set 26 | # CONFIG_RT_DEBUG_THREAD_CONFIG is not set 27 | # CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set 28 | # CONFIG_RT_DEBUG_IPC_CONFIG is not set 29 | # CONFIG_RT_DEBUG_TIMER_CONFIG is not set 30 | # CONFIG_RT_DEBUG_IRQ_CONFIG is not set 31 | # CONFIG_RT_DEBUG_MEM_CONFIG is not set 32 | # CONFIG_RT_DEBUG_SLAB_CONFIG is not set 33 | # CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set 34 | # CONFIG_RT_DEBUG_MODULE_CONFIG is not set 35 | 36 | # 37 | # Inter-Thread communication 38 | # 39 | CONFIG_RT_USING_SEMAPHORE=y 40 | CONFIG_RT_USING_MUTEX=y 41 | CONFIG_RT_USING_EVENT=y 42 | CONFIG_RT_USING_MAILBOX=y 43 | CONFIG_RT_USING_MESSAGEQUEUE=y 44 | # CONFIG_RT_USING_SIGNALS is not set 45 | 46 | # 47 | # Memory Management 48 | # 49 | CONFIG_RT_USING_MEMPOOL=y 50 | # CONFIG_RT_USING_MEMHEAP is not set 51 | # CONFIG_RT_USING_NOHEAP is not set 52 | CONFIG_RT_USING_SMALL_MEM=y 53 | # CONFIG_RT_USING_SLAB is not set 54 | # CONFIG_RT_USING_MEMTRACE is not set 55 | CONFIG_RT_USING_HEAP=y 56 | 57 | # 58 | # Kernel Device Object 59 | # 60 | CONFIG_RT_USING_DEVICE=y 61 | # CONFIG_RT_USING_DEVICE_OPS is not set 62 | # CONFIG_RT_USING_INTERRUPT_INFO is not set 63 | CONFIG_RT_USING_CONSOLE=y 64 | CONFIG_RT_CONSOLEBUF_SIZE=128 65 | CONFIG_RT_CONSOLE_DEVICE_NAME="uart" 66 | CONFIG_RT_VER_NUM=0x40001 67 | # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set 68 | 69 | # 70 | # RT-Thread Components 71 | # 72 | CONFIG_RT_USING_COMPONENTS_INIT=y 73 | CONFIG_RT_USING_USER_MAIN=y 74 | CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 75 | CONFIG_RT_MAIN_THREAD_PRIORITY=10 76 | 77 | # 78 | # C++ features 79 | # 80 | # CONFIG_RT_USING_CPLUSPLUS is not set 81 | 82 | # 83 | # Command shell 84 | # 85 | CONFIG_RT_USING_FINSH=y 86 | CONFIG_FINSH_THREAD_NAME="tshell" 87 | CONFIG_FINSH_USING_HISTORY=y 88 | CONFIG_FINSH_HISTORY_LINES=5 89 | CONFIG_FINSH_USING_SYMTAB=y 90 | CONFIG_FINSH_USING_DESCRIPTION=y 91 | # CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set 92 | CONFIG_FINSH_THREAD_PRIORITY=20 93 | CONFIG_FINSH_THREAD_STACK_SIZE=4096 94 | CONFIG_FINSH_CMD_SIZE=80 95 | # CONFIG_FINSH_USING_AUTH is not set 96 | CONFIG_FINSH_USING_MSH=y 97 | CONFIG_FINSH_USING_MSH_DEFAULT=y 98 | # CONFIG_FINSH_USING_MSH_ONLY is not set 99 | CONFIG_FINSH_ARG_MAX=10 100 | 101 | # 102 | # Device virtual file system 103 | # 104 | # CONFIG_RT_USING_DFS is not set 105 | 106 | # 107 | # Device Drivers 108 | # 109 | CONFIG_RT_USING_DEVICE_IPC=y 110 | CONFIG_RT_PIPE_BUFSZ=512 111 | CONFIG_RT_USING_SERIAL=y 112 | # CONFIG_RT_SERIAL_USING_DMA is not set 113 | CONFIG_RT_SERIAL_RB_BUFSZ=64 114 | # CONFIG_RT_USING_CAN is not set 115 | # CONFIG_RT_USING_HWTIMER is not set 116 | # CONFIG_RT_USING_CPUTIME is not set 117 | # CONFIG_RT_USING_I2C is not set 118 | CONFIG_RT_USING_PIN=y 119 | # CONFIG_RT_USING_ADC is not set 120 | # CONFIG_RT_USING_PWM is not set 121 | # CONFIG_RT_USING_MTD_NOR is not set 122 | # CONFIG_RT_USING_MTD_NAND is not set 123 | # CONFIG_RT_USING_MTD is not set 124 | # CONFIG_RT_USING_PM is not set 125 | # CONFIG_RT_USING_RTC is not set 126 | # CONFIG_RT_USING_SDIO is not set 127 | # CONFIG_RT_USING_SPI is not set 128 | # CONFIG_RT_USING_WDT is not set 129 | # CONFIG_RT_USING_AUDIO is not set 130 | # CONFIG_RT_USING_SENSOR is not set 131 | 132 | # 133 | # Using WiFi 134 | # 135 | # CONFIG_RT_USING_WIFI is not set 136 | 137 | # 138 | # Using USB 139 | # 140 | # CONFIG_RT_USING_USB_HOST is not set 141 | # CONFIG_RT_USING_USB_DEVICE is not set 142 | 143 | # 144 | # POSIX layer and C standard library 145 | # 146 | # CONFIG_RT_USING_LIBC is not set 147 | # CONFIG_RT_USING_PTHREADS is not set 148 | 149 | # 150 | # Network 151 | # 152 | 153 | # 154 | # Socket abstraction layer 155 | # 156 | # CONFIG_RT_USING_SAL is not set 157 | 158 | # 159 | # light weight TCP/IP stack 160 | # 161 | # CONFIG_RT_USING_LWIP is not set 162 | 163 | # 164 | # Modbus master and slave stack 165 | # 166 | # CONFIG_RT_USING_MODBUS is not set 167 | 168 | # 169 | # AT commands 170 | # 171 | # CONFIG_RT_USING_AT is not set 172 | 173 | # 174 | # VBUS(Virtual Software BUS) 175 | # 176 | # CONFIG_RT_USING_VBUS is not set 177 | 178 | # 179 | # Utilities 180 | # 181 | # CONFIG_RT_USING_LOGTRACE is not set 182 | # CONFIG_RT_USING_RYM is not set 183 | # CONFIG_RT_USING_ULOG is not set 184 | # CONFIG_RT_USING_UTEST is not set 185 | 186 | # 187 | # RT-Thread online packages 188 | # 189 | 190 | # 191 | # IoT - internet of things 192 | # 193 | # CONFIG_PKG_USING_PAHOMQTT is not set 194 | # CONFIG_PKG_USING_WEBCLIENT is not set 195 | # CONFIG_PKG_USING_WEBNET is not set 196 | # CONFIG_PKG_USING_MONGOOSE is not set 197 | # CONFIG_PKG_USING_WEBTERMINAL is not set 198 | # CONFIG_PKG_USING_CJSON is not set 199 | # CONFIG_PKG_USING_JSMN is not set 200 | # CONFIG_PKG_USING_LJSON is not set 201 | # CONFIG_PKG_USING_EZXML is not set 202 | # CONFIG_PKG_USING_NANOPB is not set 203 | 204 | # 205 | # Wi-Fi 206 | # 207 | 208 | # 209 | # Marvell WiFi 210 | # 211 | # CONFIG_PKG_USING_WLANMARVELL is not set 212 | 213 | # 214 | # Wiced WiFi 215 | # 216 | # CONFIG_PKG_USING_WLAN_WICED is not set 217 | # CONFIG_PKG_USING_COAP is not set 218 | # CONFIG_PKG_USING_NOPOLL is not set 219 | # CONFIG_PKG_USING_NETUTILS is not set 220 | # CONFIG_PKG_USING_AT_DEVICE is not set 221 | # CONFIG_PKG_USING_WIZNET is not set 222 | 223 | # 224 | # IoT Cloud 225 | # 226 | # CONFIG_PKG_USING_ONENET is not set 227 | # CONFIG_PKG_USING_GAGENT_CLOUD is not set 228 | # CONFIG_PKG_USING_ALI_IOTKIT is not set 229 | # CONFIG_PKG_USING_AZURE is not set 230 | # CONFIG_PKG_USING_TENCENT_IOTKIT is not set 231 | 232 | # 233 | # security packages 234 | # 235 | # CONFIG_PKG_USING_MBEDTLS is not set 236 | # CONFIG_PKG_USING_libsodium is not set 237 | # CONFIG_PKG_USING_TINYCRYPT is not set 238 | 239 | # 240 | # language packages 241 | # 242 | # CONFIG_PKG_USING_LUA is not set 243 | # CONFIG_PKG_USING_JERRYSCRIPT is not set 244 | # CONFIG_PKG_USING_MICROPYTHON is not set 245 | 246 | # 247 | # multimedia packages 248 | # 249 | # CONFIG_PKG_USING_OPENMV is not set 250 | # CONFIG_PKG_USING_MUPDF is not set 251 | 252 | # 253 | # tools packages 254 | # 255 | # CONFIG_PKG_USING_CMBACKTRACE is not set 256 | # CONFIG_PKG_USING_EASYFLASH is not set 257 | # CONFIG_PKG_USING_EASYLOGGER is not set 258 | # CONFIG_PKG_USING_SYSTEMVIEW is not set 259 | # CONFIG_PKG_USING_RDB is not set 260 | # CONFIG_PKG_USING_QRCODE is not set 261 | # CONFIG_PKG_USING_ULOG_EASYFLASH is not set 262 | 263 | # 264 | # system packages 265 | # 266 | # CONFIG_PKG_USING_GUIENGINE is not set 267 | # CONFIG_PKG_USING_GUIENGINE_LATEST_VERSION is not set 268 | # CONFIG_PKG_USING_GUIENGINE_V200 is not set 269 | # CONFIG_PKG_USING_RGB888_PIXEL_BITS_32 is not set 270 | # CONFIG_PKG_USING_RGB888_PIXEL_BITS_24 is not set 271 | # CONFIG_GUIENGINE_IMAGE_LODEPNG is not set 272 | # CONFIG_GUIENGINE_IMAGE_PNG is not set 273 | # CONFIG_PKG_USING_CAIRO is not set 274 | # CONFIG_PKG_USING_PIXMAN is not set 275 | # CONFIG_PKG_USING_LWEXT4 is not set 276 | # CONFIG_PKG_USING_PARTITION is not set 277 | # CONFIG_PKG_USING_FAL is not set 278 | # CONFIG_PKG_USING_SQLITE is not set 279 | # CONFIG_PKG_USING_RTI is not set 280 | # CONFIG_PKG_USING_LITTLEVGL2RTT is not set 281 | # CONFIG_PKG_USING_CMSIS is not set 282 | # CONFIG_PKG_USING_DFS_YAFFS is not set 283 | # CONFIG_PKG_USING_LITTLEFS is not set 284 | 285 | # 286 | # peripheral libraries and drivers 287 | # 288 | # CONFIG_PKG_USING_REALTEK_AMEBA is not set 289 | # CONFIG_PKG_USING_SHT2X is not set 290 | # CONFIG_PKG_USING_AHT10 is not set 291 | # CONFIG_PKG_USING_AP3216C is not set 292 | # CONFIG_PKG_USING_STM32_SDIO is not set 293 | # CONFIG_PKG_USING_ICM20608 is not set 294 | # CONFIG_PKG_USING_U8G2 is not set 295 | # CONFIG_PKG_USING_BUTTON is not set 296 | # CONFIG_PKG_USING_MPU6XXX is not set 297 | # CONFIG_PKG_USING_PCF8574 is not set 298 | # CONFIG_PKG_USING_KENDRYTE_SDK is not set 299 | 300 | # 301 | # miscellaneous packages 302 | # 303 | # CONFIG_PKG_USING_LIBCSV is not set 304 | # CONFIG_PKG_USING_OPTPARSE is not set 305 | # CONFIG_PKG_USING_FASTLZ is not set 306 | # CONFIG_PKG_USING_MINILZO is not set 307 | # CONFIG_PKG_USING_QUICKLZ is not set 308 | # CONFIG_PKG_USING_MULTIBUTTON is not set 309 | # CONFIG_PKG_USING_CANFESTIVAL is not set 310 | # CONFIG_PKG_USING_ZLIB is not set 311 | # CONFIG_PKG_USING_DSTR is not set 312 | # CONFIG_PKG_USING_TINYFRAME is not set 313 | # CONFIG_PKG_USING_KENDRYTE_DEMO is not set 314 | 315 | # 316 | # samples: kernel and components samples 317 | # 318 | # CONFIG_PKG_USING_KERNEL_SAMPLES is not set 319 | # CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set 320 | # CONFIG_PKG_USING_NETWORK_SAMPLES is not set 321 | # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set 322 | # CONFIG_PKG_USING_HELLO is not set 323 | # CONFIG_PKG_USING_VI is not set 324 | 325 | # 326 | # Hardware Drivers Config 327 | # 328 | 329 | # 330 | # On-chip Peripheral Drivers 331 | # 332 | CONFIG_BSP_USING_GPIO=y 333 | # CONFIG_BSP_USING_LCD is not set 334 | # CONFIG_BSP_USING_RTC is not set 335 | # CONFIG_BSP_USING_WDT is not set 336 | # CONFIG_BSP_USING_ADC is not set 337 | # CONFIG_BSP_USING_CPUTIME is not set 338 | # CONFIG_BSP_USING_WIFI is not set 339 | # CONFIG_BSP_USING_EMAC is not set 340 | 341 | # 342 | # HWtimer Drivers 343 | # 344 | # CONFIG_BSP_USING_HWTIMER0 is not set 345 | # CONFIG_BSP_USING_HWTIMER1 is not set 346 | 347 | # 348 | # I2C Drivers 349 | # 350 | # CONFIG_BSP_USING_I2C0 is not set 351 | # CONFIG_BSP_USING_I2C1 is not set 352 | 353 | # 354 | # PWM Drivers 355 | # 356 | # CONFIG_BSP_USING_PWM0 is not set 357 | # CONFIG_BSP_USING_PWM1 is not set 358 | 359 | # 360 | # SPI Drivers 361 | # 362 | # CONFIG_BSP_USING_SPI0 is not set 363 | # CONFIG_BSP_USING_SPI1 is not set 364 | 365 | # 366 | # UART Drivers 367 | # 368 | CONFIG_BSP_USING_UART0=y 369 | # CONFIG_BSP_USING_UART1 is not set 370 | 371 | # 372 | # Onboard Peripheral Drivers 373 | # 374 | 375 | # 376 | # Offboard Peripheral Drivers 377 | # 378 | CONFIG_BOARD_SKELETON=y 379 | -------------------------------------------------------------------------------- /bsp_skeleton/Kconfig: -------------------------------------------------------------------------------- 1 | mainmenu "RT-Thread Project Configuration" 2 | 3 | config BSP_DIR 4 | string 5 | option env="BSP_ROOT" 6 | default "." 7 | 8 | config RTT_DIR 9 | string 10 | option env="RTT_ROOT" 11 | default "../.." 12 | 13 | config PKGS_DIR 14 | string 15 | option env="PKGS_ROOT" 16 | default "packages" 17 | 18 | source "$RTT_DIR/Kconfig" 19 | source "$PKGS_DIR/Kconfig" 20 | source "drivers/Kconfig" 21 | 22 | config BOARD_SKELETON 23 | bool 24 | select ARCH_ARM_CORTEX_M4 25 | default y 26 | 27 | -------------------------------------------------------------------------------- /bsp_skeleton/Libraries/CMSIS/startup_xxx.s: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | .global Reset_Handler 11 | .section ".start", "ax" 12 | Reset_Handler: 13 | nop 14 | -------------------------------------------------------------------------------- /bsp_skeleton/Libraries/SConscript: -------------------------------------------------------------------------------- 1 | from building import * 2 | import rtconfig 3 | 4 | cwd = GetCurrentDir() 5 | CPPPATH = [cwd + '/CMSIS/CoreSupport', cwd + '/CMSIS/DeviceSupport', cwd + '/XXX_StdPeriph_Driver'] 6 | src = Glob('CMSIS/DeviceSupport/*.c') 7 | src += Glob('XXX_StdPeriph_Driver/*.c') 8 | 9 | if rtconfig.CROSS_TOOL == 'gcc': 10 | src += ['CMSIS/startup_xxx.s'] 11 | elif rtconfig.CROSS_TOOL == 'keil': 12 | src += ['CMSIS/startup_xxx.s'] 13 | elif rtconfig.CROSS_TOOL == 'iar': 14 | src += ['CMSIS/startup_xxx.s'] 15 | 16 | group = DefineGroup('Libraries', src, depend = [''], CPPPATH = CPPPATH) 17 | 18 | Return('group') 19 | -------------------------------------------------------------------------------- /bsp_skeleton/README.md: -------------------------------------------------------------------------------- 1 | # skeleton 开发板 BSP 说明 2 | 3 | 标签: ARM Cortex-M0、xxx 4 | 5 | --- 6 | 7 | ## 简介 8 | 9 | 本文档为 xxx 开发团队为 xxx 开发板提供的 BSP (板级支持包) 说明。 10 | 11 | 主要内容如下: 12 | 13 | - 开发板资源介绍 14 | - BSP 快速上手 15 | - 进阶使用方法 16 | 17 | 通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 18 | 19 | ## 开发板介绍 20 | 21 | skeleton 开发板是 xxx 公司推出的一款基于 ARM Cortex-M0 内核的开发板,最高主频为 48MHz,xxx 开发板外观如下图所示: 22 | 23 | ![开发板外观](figures/board.jpg) 24 | 25 | 该开发板常用**板载资源**如下: 26 | 27 | - MCU:xxx,主频 48MHz,32KB SRAM,256KB FLASH,54 GPIOs 28 | - 外部模块:SPI FLASH (MX25L64,8MB)、I2C EEPROM (M24C04,512B) 29 | - 常用外设 30 | - LED:2 个,(PA12/PC12) 31 | - 液晶屏:1 个 32 | - 按键:3 个,K1(PF00),K2(PF01),RESET(MRST) 33 | - 常用接口:GPIO、UART、SPI、I2C 34 | - 调试接口: 标准 JTAG/SWD 35 | 36 | 开发板更多详细信息请参考【厂商名】[xxx 开发板介绍](https://xxx.com/index.htm)。 37 | 38 | ## 外设支持 39 | 40 | 本 BSP 目前对外设的支持情况如下: 41 | 42 | |**片上外设** |**支持情况**|**备注** | 43 | | :----------------- | :----------: | :------------------------------------- | 44 | | GPIO | 支持 | PA0, PA1... PK15 ---> PIN: 0, 1...176 | 45 | | UART | 支持 | UART1/x/x | 46 | | SPI | 支持 | SPI1/x/x | 47 | | I2C | 支持 | 软件 I2C | 48 | | SDIO | 暂不支持 | 即将支持 | 49 | | RTC | 暂不支持 | 即将支持 | 50 | | PWM | 暂不支持 | 即将支持 | 51 | | USB Device | 暂不支持 | 即将支持 | 52 | | USB Host | 暂不支持 | 即将支持 | 53 | | IWG | 暂不支持 | 即将支持 | 54 | | xxx | 暂不支持 | 即将支持 | 55 | |**板载外设** |**支持情况**|**备注** | 56 | | USB 转串口 | 支持 | | 57 | | SPI Flash | 支持 | | 58 | | 以太网 | 支持 | | 59 | | SD 卡 | 暂不支持 | | 60 | | CAN | 暂不支持 | | 61 | |**扩展模块** |**支持情况**|**备注** | 62 | | xxx 模块 | 支持 | | 63 | 64 | ## 使用说明 65 | 66 | 使用说明分为如下两个章节: 67 | 68 | - 快速上手 69 | 70 | 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 71 | 72 | - 进阶使用 73 | 74 | 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 75 | 76 | ### 快速上手 77 | 78 | 本 BSP 为开发者提供 MDK4、MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 79 | 80 | #### 硬件连接 81 | 82 | 使用数据线连接开发板到 PC,并连接开发板对应串口到 PC。 83 | 84 | #### 编译下载 85 | 86 | 双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 87 | 88 | > 工程默认配置使用 xxx 仿真器下载程序,在通过 xxx 连接开发板的基础上,点击下载按钮即可下载程序到开发板。 89 | 90 | #### 运行结果 91 | 92 | 下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,红色 LED 常亮、绿色 LED 会周期性闪烁。 93 | 94 | 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: 95 | 96 | ```c 97 | \ | / 98 | - RT - Thread Operating System 99 | / | \ 4.0.1 build Jan 19 2019 100 | 2006 - 2018 Copyright by rt-thread team 101 | msh > 102 | ``` 103 | 104 | ### 进阶使用 105 | 106 | 此 BSP 默认只开启了 GPIO 和 串口 的功能,如果需使用更多功能,需要利用 ENV 工具对 BSP 进行配置,步骤如下: 107 | 108 | 1. 在 bsp 下打开 env 工具。 109 | 110 | 2. 输入 `menuconfig` 命令配置工程,配置好之后保存退出。 111 | 112 | 3. 输入 `pkgs --update` 命令更新软件包。 113 | 114 | 4. 输入 `scons --target=mdk4/mdk5/iar` 命令重新生成工程。 115 | 116 | ## 注意事项 117 | 118 | xxx 119 | 120 | ## 维护人信息 121 | 122 | - [xxx](https://github.com/xxx) 123 | - [邮箱](xxx@xxx.com) 124 | 125 | ## 参考资料 126 | 127 | * [RT-Thread 文档中心](https://www.rt-thread.org/document/site/) 128 | 129 | * [xxx 开发板数据手册](http://abc.com/datasheet.pdf) 130 | 131 | * [xxx 开发板参考手册](http://abc.com/reference.pdf) 132 | 133 | * [xxx 芯片数据手册](http://abc.com/um.pdf) 134 | 135 | -------------------------------------------------------------------------------- /bsp_skeleton/SConscript: -------------------------------------------------------------------------------- 1 | # for module compiling 2 | import os 3 | from building import * 4 | 5 | cwd = GetCurrentDir() 6 | objs = [] 7 | list = os.listdir(cwd) 8 | 9 | for d in list: 10 | path = os.path.join(cwd, d) 11 | if os.path.isfile(os.path.join(path, 'SConscript')): 12 | objs = objs + SConscript(os.path.join(d, 'SConscript')) 13 | 14 | Return('objs') 15 | -------------------------------------------------------------------------------- /bsp_skeleton/SConstruct: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import rtconfig 4 | 5 | if os.getenv('RTT_ROOT'): 6 | RTT_ROOT = os.getenv('RTT_ROOT') 7 | else: 8 | RTT_ROOT = os.path.normpath(os.getcwd() + '/../..') 9 | 10 | sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] 11 | 12 | try: 13 | from building import * 14 | except: 15 | print('Cannot found RT-Thread root directory, please check RTT_ROOT') 16 | print(RTT_ROOT) 17 | exit(-1) 18 | 19 | TARGET = 'rtthread.' + rtconfig.TARGET_EXT 20 | 21 | env = Environment(tools = ['mingw'], 22 | AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, 23 | CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, 24 | CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, 25 | AR = rtconfig.AR, ARFLAGS = '-rc', 26 | LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) 27 | env.PrependENVPath('PATH', rtconfig.EXEC_PATH) 28 | 29 | if rtconfig.PLATFORM == 'iar': 30 | env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) 31 | env.Replace(ARFLAGS = ['']) 32 | env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map') 33 | 34 | Export('RTT_ROOT') 35 | Export('rtconfig') 36 | 37 | # prepare building environment 38 | objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) 39 | 40 | # make a building 41 | DoBuilding(TARGET, objs) 42 | -------------------------------------------------------------------------------- /bsp_skeleton/applications/SConscript: -------------------------------------------------------------------------------- 1 | from building import * 2 | 3 | cwd = GetCurrentDir() 4 | CPPPATH = [cwd] 5 | src = Glob('*.c') + Glob('*.cpp') 6 | 7 | group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) 8 | 9 | Return('group') 10 | -------------------------------------------------------------------------------- /bsp_skeleton/applications/main.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | /* defined the LED0 pin: PB1 */ 14 | #define LED0_PIN 60 15 | 16 | int main(void) 17 | { 18 | int count = 1; 19 | /* set LED0 pin mode to output */ 20 | rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); 21 | 22 | while (count++) 23 | { 24 | rt_pin_write(LED0_PIN, PIN_HIGH); 25 | rt_thread_mdelay(500); 26 | rt_pin_write(LED0_PIN, PIN_LOW); 27 | rt_thread_mdelay(500); 28 | } 29 | 30 | return RT_EOK; 31 | } 32 | -------------------------------------------------------------------------------- /bsp_skeleton/applications/mnt.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | 12 | #ifdef RT_USING_DFS 13 | #include 14 | 15 | int mnt_init(void) 16 | { 17 | rt_thread_delay(RT_TICK_PER_SECOND); 18 | 19 | if (dfs_mount("sd0", "/", "elm", 0, 0) == 0) 20 | { 21 | rt_kprintf("file system initialization done!\n"); 22 | } 23 | 24 | return 0; 25 | } 26 | INIT_ENV_EXPORT(mnt_init); 27 | #endif 28 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/Kconfig: -------------------------------------------------------------------------------- 1 | menu "Hardware Drivers Config" 2 | 3 | menu "On-chip Peripheral Drivers" 4 | 5 | config BSP_USING_GPIO 6 | bool "Enable GPIO" 7 | select RT_USING_PIN 8 | default y 9 | 10 | config BSP_USING_LCD 11 | bool "Enable LCD" 12 | select BSP_USING_LTDC 13 | select BSP_USING_SDRAM 14 | default n 15 | 16 | config BSP_USING_RTC 17 | bool "Enable RTC" 18 | select RT_USING_RTC 19 | default n 20 | 21 | config BSP_USING_WDT 22 | bool "Enable Watch Dog" 23 | select RT_USING_WDT 24 | default n 25 | 26 | config BSP_USING_ADC 27 | bool "Enable ADC" 28 | select RT_USING_ADC 29 | default n 30 | 31 | config BSP_USING_CPUTIME 32 | bool "Enable CPUTIME" 33 | select RT_USING_CPUTIME 34 | default n 35 | 36 | config BSP_USING_WIFI 37 | bool "Enable WIFI" 38 | select RT_USING_WIFI 39 | default n 40 | 41 | config BSP_USING_EMAC 42 | bool "Enable EMAC" 43 | select RT_USING_LWIP 44 | default n 45 | 46 | menu "HWtimer Drivers" 47 | config BSP_USING_HWTIMER0 48 | bool "Using timer0" 49 | select RT_USING_HWTIMER 50 | default n 51 | 52 | config BSP_USING_HWTIMER1 53 | bool "Using timer1" 54 | select RT_USING_HWTIMER 55 | default n 56 | endmenu 57 | 58 | menu "I2C Drivers" 59 | config BSP_USING_I2C0 60 | bool "Enable I2C0 BUS (software simulation)" 61 | select RT_USING_I2C 62 | select RT_USING_PIN 63 | select RT_USING_I2C_BITOPS 64 | default n 65 | 66 | if BSP_USING_I2C0 67 | config BSP_I2C0_SCL_PIN 68 | int "i2c0 SCL Pin number" 69 | default 98 70 | 71 | config BSP_I2C0_SDA_PIN 72 | int "i2c0 SDA Pin number" 73 | default 99 74 | endif 75 | 76 | config BSP_USING_I2C1 77 | bool "Enable I2C1 BUS (PB10/11,SCL/SDA)" 78 | select RT_USING_I2C 79 | default n 80 | endmenu 81 | 82 | menu "PWM Drivers" 83 | config BSP_USING_PWM0 84 | bool "Using PWM0 (PA8/9,CH1/CH2)" 85 | select RT_USING_PWM 86 | default n 87 | 88 | config BSP_USING_PWM1 89 | bool "Using PWM1 (PB6/7,CH1/CH2))" 90 | select RT_USING_PWM 91 | default n 92 | endmenu 93 | 94 | menu "SPI Drivers" 95 | config BSP_USING_SPI0 96 | bool "Enable SPI0 BUS (PC4/5/6,SCLK/MOSI/MISO)" 97 | select RT_USING_SPI 98 | select RT_USING_PIN 99 | default n 100 | 101 | config BSP_USING_SPI1 102 | bool "Enable SPI1 BUS (PC5/2/3,SCLK/MOSI/MISO)" 103 | select RT_USING_SPI 104 | select RT_USING_PIN 105 | default n 106 | endmenu 107 | 108 | menu "UART Drivers" 109 | config BSP_USING_UART0 110 | bool "Enable UART0 (PA2/3,RX/TX)" 111 | select RT_USING_SERIAL 112 | default y 113 | 114 | config BSP_USING_UART1 115 | bool "Enable UART1 (PC2/3,RX/TX)" 116 | select RT_USING_SERIAL 117 | default n 118 | endmenu 119 | 120 | endmenu 121 | 122 | menu "Onboard Peripheral Drivers" 123 | 124 | endmenu 125 | 126 | menu "Offboard Peripheral Drivers" 127 | 128 | endmenu 129 | 130 | endmenu 131 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/SConscript: -------------------------------------------------------------------------------- 1 | from building import * 2 | 3 | cwd = GetCurrentDir() 4 | CPPPATH = [cwd] 5 | src = Split(''' 6 | board.c 7 | drv_uart.c 8 | ''') 9 | 10 | if GetDepend('BSP_USING_ADC'): 11 | src += ['drv_adc.c'] 12 | 13 | if GetDepend('BSP_USING_CPUTIME'): 14 | src += ['drv_cputime.c'] 15 | 16 | if GetDepend('BSP_USING_EMAC'): 17 | src += ['drv_emac.c'] 18 | 19 | if GetDepend('BSP_USING_PIN'): 20 | src += ['drv_gpio.c'] 21 | 22 | if GetDepend('BSP_USING_HWTIMER0') or GetDepend('BSP_USING_HWTIMER1'): 23 | src += ['drv_hwtimer.c'] 24 | 25 | if GetDepend('BSP_USING_I2C0') or GetDepend('BSP_USING_I2C1'): 26 | src += ['drv_i2c.c'] 27 | 28 | if GetDepend('PKG_USING_GUIENGINE'): 29 | src += ['drv_lcd.c'] 30 | 31 | if GetDepend('BSP_USING_PWM0')or GetDepend('BSP_USING_PWM1'): 32 | src += ['drv_pwm.c'] 33 | 34 | if GetDepend('BSP_USING_RTC'): 35 | src += ['drv_rtc.c'] 36 | 37 | if GetDepend('BSP_USING_SDIO'): 38 | src += ['drv_sdio.c'] 39 | 40 | if GetDepend('BSP_USING_SPI0') or GetDepend('BSP_USING_SPI0'): 41 | src += ['drv_spi.c'] 42 | 43 | if GetDepend('BSP_USING_WDT'): 44 | src += ['drv_wdt.c'] 45 | 46 | if GetDepend(['BSP_USING_WIFI']): 47 | src += ['drv_wlan.c'] 48 | 49 | group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH) 50 | 51 | Return('group') 52 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/board.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "board.h" 13 | 14 | /** 15 | * This function is used to display a string on console, normally, it's 16 | * invoked by rt_kprintf 17 | * 18 | * @param str the displayed string 19 | */ 20 | void rt_hw_console_output(const char *str) 21 | { 22 | while (*str) 23 | { 24 | if (*str == '\n') 25 | { 26 | /* Todo:write data (\r) to serial hardware */ 27 | } 28 | /* Todo:write data (*str) to serial hardware */ 29 | str++; 30 | } 31 | } 32 | 33 | void rt_hw_board_init(void) 34 | { 35 | 36 | #ifdef RT_USING_HEAP 37 | /* initialize memory system */ 38 | rt_system_heap_init(HEAP_BEGIN,HEAP_END); 39 | #endif 40 | 41 | #ifdef RT_USING_COMPONENTS_INIT 42 | rt_components_board_init(); 43 | #endif 44 | 45 | #ifdef RT_USING_CONSOLE 46 | /* set console device */ 47 | rt_console_set_device(RT_CONSOLE_DEVICE_NAME); 48 | #endif 49 | } 50 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/board.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | * 2017-5-30 Bernard the first version 9 | */ 10 | 11 | #ifndef __BOARD_H__ 12 | #define __BOARD_H__ 13 | 14 | #include 15 | 16 | #define BOARD_SRAM_SIZE 0x8000 17 | #define BOARD_SRAM_END (void *)(0x20000000 + BOARD_SRAM_SIZE) 18 | 19 | #ifdef __CC_ARM 20 | extern int Image$$RW_IRAM1$$ZI$$Limit; 21 | #define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) 22 | #elif __ICCARM__ 23 | #pragma section="HEAP" 24 | #define HEAP_BEGIN (__segment_end("HEAP")) 25 | #else 26 | extern int __bss_end; 27 | #define HEAP_BEGIN ((void *)&__bss_end) 28 | #endif 29 | 30 | #define HEAP_END BOARD_SRAM_END 31 | 32 | void rt_hw_board_init(void); 33 | 34 | #endif 35 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_adc.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "board.h" 13 | #include "drv_adc.h" 14 | 15 | #ifdef RT_USING_ADC 16 | 17 | #define SKT_ADC_DEVICE(adc_dev) (struct skt_adc_dev *)(adc_dev) 18 | 19 | static struct skt_adc_dev adc_dev0; 20 | 21 | struct skt_adc_dev 22 | { 23 | struct rt_adc_device parent; 24 | rt_uint32_t adc_periph; 25 | rt_uint32_t channel; 26 | }; 27 | 28 | static rt_err_t skt_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled) 29 | { 30 | rt_err_t ret = RT_EOK; 31 | struct skt_adc_dev *adc = SKT_ADC_DEVICE(device); 32 | 33 | RT_ASSERT(adc != RT_NULL); 34 | 35 | if (enabled) 36 | { 37 | /* Todo: enable adc->adc_periph */ 38 | } 39 | else 40 | { 41 | /* Todo: disable adc->adc_periph */ 42 | } 43 | return ret; 44 | } 45 | static rt_err_t skt_adc_convert(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value) 46 | { 47 | rt_err_t ret = RT_EOK; 48 | struct skt_adc_dev *adc = SKT_ADC_DEVICE(device); 49 | 50 | RT_ASSERT(adc != RT_NULL); 51 | 52 | /* Todo: convert adc->adc_periph */ 53 | 54 | return ret; 55 | } 56 | 57 | const static struct rt_adc_ops skt_adc_ops = 58 | { 59 | skt_adc_enabled, 60 | skt_adc_convert 61 | }; 62 | 63 | int rt_hw_adc_init(void) 64 | { 65 | rt_err_t ret = RT_EOK; 66 | 67 | /* Todo: Init adc Hardware */ 68 | 69 | ret = rt_hw_adc_register(&adc_dev0.parent, "adc0", &skt_adc_ops, &adc_dev0); 70 | 71 | return ret; 72 | } 73 | INIT_DEVICE_EXPORT(rt_hw_adc_init); 74 | 75 | #endif /* RT_USING_ADC */ 76 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_adc.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_ADC_H__ 11 | #define DRV_ADC_H__ 12 | 13 | int rt_hw_adc_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_cputime.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "drv_cputime.h" 13 | #include 14 | 15 | #ifdef RT_USING_CPUTIME 16 | 17 | static float skt_cputime_getres(void) 18 | { 19 | return 0; 20 | } 21 | 22 | static uint32_t skt_cputime_gettime(void) 23 | { 24 | return 0; 25 | } 26 | 27 | const static struct rt_clock_cputime_ops skt_cputime_ops = 28 | { 29 | skt_cputime_getres, 30 | skt_cputime_gettime 31 | }; 32 | 33 | int rt_hw_cputime_init(void) 34 | { 35 | clock_cpu_setops(&skt_cputime_ops); 36 | 37 | return 0; 38 | } 39 | INIT_BOARD_EXPORT(rt_hw_cputime_init); 40 | 41 | #endif /* RT_USING_CPUTIME */ 42 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_cputime.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_CPUTIME_H__ 11 | #define DRV_CPUTIME_H__ 12 | 13 | int rt_hw_cputime_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_emac.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "drv_emac.h" 15 | 16 | #ifdef RT_USING_LWIP 17 | 18 | #define MAX_ADDR_LEN 6 19 | #define SKT_EMAC_DEVICE(eth) (struct skt_emac_dev*)(eth) 20 | 21 | static struct skt_emac_dev emac_dev; 22 | 23 | struct skt_emac_dev 24 | { 25 | struct eth_device parent; 26 | 27 | rt_uint8_t dev_addr[MAX_ADDR_LEN]; /* MAC address */ 28 | }; 29 | 30 | static rt_err_t skt_emac_init(rt_device_t dev) 31 | { 32 | rt_err_t ret = RT_EOK; 33 | struct skt_emac_dev *emac = SKT_EMAC_DEVICE(dev); 34 | 35 | RT_ASSERT(emac != RT_NULL); 36 | 37 | /* Todo:init emac */ 38 | return ret; 39 | } 40 | 41 | static rt_err_t skt_emac_open(rt_device_t dev, rt_uint16_t oflag) 42 | { 43 | rt_err_t ret = RT_EOK; 44 | struct skt_emac_dev *emac = SKT_EMAC_DEVICE(dev); 45 | 46 | RT_ASSERT(emac != RT_NULL); 47 | 48 | /* Todo:enable emac */ 49 | return ret; 50 | } 51 | 52 | static rt_err_t skt_emac_close(rt_device_t dev) 53 | { 54 | rt_err_t ret = RT_EOK; 55 | struct skt_emac_dev *emac = SKT_EMAC_DEVICE(dev); 56 | 57 | RT_ASSERT(emac != RT_NULL); 58 | 59 | /* Todo:close emac */ 60 | return ret; 61 | } 62 | 63 | static rt_err_t skt_emac_control(rt_device_t dev, int cmd, void *args) 64 | { 65 | rt_err_t ret = RT_EOK; 66 | struct skt_emac_dev *emac = SKT_EMAC_DEVICE(dev); 67 | 68 | RT_ASSERT(emac != RT_NULL); 69 | 70 | switch (cmd) 71 | { 72 | case NIOCTL_GADDR: 73 | /* get MAC address */ 74 | if (args) 75 | { 76 | rt_memcpy(args, emac->dev_addr, 6); 77 | } 78 | else 79 | { 80 | ret = -RT_ERROR; 81 | } 82 | break; 83 | 84 | default : 85 | break; 86 | } 87 | 88 | return ret; 89 | } 90 | 91 | /* Ethernet device interface */ 92 | /* transmit packet */ 93 | static rt_err_t skt_emac_tx(rt_device_t dev, struct pbuf *p) 94 | { 95 | rt_err_t ret = RT_EOK; 96 | struct skt_emac_dev *emac = SKT_EMAC_DEVICE(dev); 97 | 98 | RT_ASSERT(emac != RT_NULL); 99 | 100 | /* copy pbuf to a whole ETH frame */ 101 | /* pbuf_copy_partial(p, eth_frame, p->tot_len, 0); */ 102 | 103 | /* send it out */ 104 | 105 | return ret; 106 | } 107 | 108 | /* reception packet */ 109 | static struct pbuf *skt_emac_rx(rt_device_t dev) 110 | { 111 | struct pbuf *p = RT_NULL; 112 | struct skt_emac_dev *emac = SKT_EMAC_DEVICE(dev); 113 | 114 | RT_ASSERT(emac != RT_NULL); 115 | 116 | /* take the emac buffer to the pbuf */ 117 | { 118 | int length = 0; 119 | 120 | /* get frame length */ 121 | 122 | /* allocate pbuf */ 123 | p = pbuf_alloc(PBUF_LINK, length, PBUF_RAM); 124 | if (p) 125 | { 126 | /* pbuf_take(p, buffer, length); */ 127 | } 128 | } 129 | 130 | return p; 131 | } 132 | 133 | #ifdef RT_USING_DEVICE_OPS 134 | const static struct rt_device_ops skt_emac_ops = 135 | { 136 | skt_emac_init, 137 | skt_emac_open, 138 | skt_emac_close, 139 | RT_NULL, 140 | RT_NULL, 141 | skt_emac_control 142 | }; 143 | #endif 144 | 145 | int rt_hw_emac_init(void) 146 | { 147 | rt_err_t ret = RT_EOK; 148 | /* test MAC address */ 149 | emac_dev.dev_addr[0] = 0x00; 150 | emac_dev.dev_addr[1] = 0x11; 151 | emac_dev.dev_addr[2] = 0x22; 152 | emac_dev.dev_addr[3] = 0x33; 153 | emac_dev.dev_addr[4] = 0x44; 154 | emac_dev.dev_addr[5] = 0x55; 155 | 156 | #ifdef RT_USING_DEVICE_OPS 157 | emac_dev.parent.parent.ops = &skt_emac_ops; 158 | #else 159 | emac_dev.parent.parent.init = skt_emac_init; 160 | emac_dev.parent.parent.open = skt_emac_open; 161 | emac_dev.parent.parent.close = skt_emac_close; 162 | emac_dev.parent.parent.read = RT_NULL; 163 | emac_dev.parent.parent.write = RT_NULL; 164 | emac_dev.parent.parent.control = skt_emac_control; 165 | #endif 166 | 167 | emac_dev.parent.parent.user_data = RT_NULL; 168 | emac_dev.parent.eth_rx = skt_emac_rx; 169 | emac_dev.parent.eth_tx = skt_emac_tx; 170 | 171 | /* register ETH device */ 172 | ret = eth_device_init(&(emac_dev.parent), "e0"); 173 | 174 | return ret; 175 | } 176 | INIT_DEVICE_EXPORT(rt_hw_emac_init); 177 | 178 | #endif /* RT_USING_LWIP */ 179 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_emac.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_EMAC_H__ 11 | #define DRV_EMAC_H__ 12 | 13 | int rt_hw_emac_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_gpio.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "drv_gpio.h" 13 | 14 | #ifdef RT_USING_PIN 15 | 16 | static void skt_pin_mode(struct rt_device *device, rt_base_t pin, rt_base_t mode) 17 | { 18 | /* Todo:set pin mode */ 19 | } 20 | 21 | static void skt_pin_write(struct rt_device *device, rt_base_t pin, rt_base_t value) 22 | { 23 | /* Todo:set pin low or high */ 24 | } 25 | 26 | static int skt_pin_read(struct rt_device *device, rt_base_t pin) 27 | { 28 | /* Todo:get pin status and return status value */ 29 | return 0; 30 | } 31 | 32 | static rt_err_t skt_pin_attach_irq(struct rt_device *device, rt_int32_t pin, 33 | rt_uint32_t mode, void (*hdr)(void *args), void *args) 34 | { 35 | rt_err_t ret = RT_EOK; 36 | 37 | /* Todo:attach hdr to pin ISR */ 38 | 39 | return ret; 40 | } 41 | 42 | static rt_err_t skt_pin_detach_irq(struct rt_device *device, rt_int32_t pin) 43 | { 44 | rt_err_t ret = RT_EOK; 45 | 46 | /* Todo:detach hdr from pin ISR */ 47 | 48 | return ret; 49 | } 50 | 51 | static rt_err_t skt_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled) 52 | { 53 | rt_err_t ret = RT_EOK; 54 | 55 | /* Todo:enable pin ISR */ 56 | 57 | return ret; 58 | } 59 | 60 | const static struct rt_pin_ops skt_pin_ops = 61 | { 62 | skt_pin_mode, 63 | skt_pin_write, 64 | skt_pin_read, 65 | 66 | skt_pin_attach_irq, 67 | skt_pin_detach_irq, 68 | skt_pin_irq_enable 69 | }; 70 | 71 | int rt_hw_pin_init(void) 72 | { 73 | rt_err_t ret = RT_EOK; 74 | 75 | ret = rt_device_pin_register("pin", &skt_pin_ops, RT_NULL); 76 | 77 | return ret; 78 | } 79 | INIT_BOARD_EXPORT(rt_hw_pin_init); 80 | 81 | #endif /* RT_USING_PIN */ 82 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_gpio.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_GPIO_H__ 11 | #define DRV_GPIO_H__ 12 | 13 | int rt_hw_pin_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_hwtimer.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include 13 | #include "drv_hwtimer.h" 14 | 15 | #ifdef RT_USING_HWTIMER 16 | 17 | #define SKT_HWTIMER_DEVICE(hwtimer) (struct skt_hwtimer_dev *)(hwtimer) 18 | 19 | static struct skt_hwtimer_dev hwtimer0; 20 | 21 | struct skt_hwtimer_dev 22 | { 23 | rt_hwtimer_t parent; 24 | rt_uint32_t hwtimer_periph; 25 | rt_uint32_t irqno; 26 | }; 27 | 28 | void skt_hwtimer_isr(int irqno, void *param) 29 | { 30 | struct skt_hwtimer_dev *hwtimer = SKT_HWTIMER_DEVICE(param); 31 | 32 | RT_ASSERT(hwtimer != RT_NULL); 33 | 34 | rt_device_hwtimer_isr(&hwtimer->parent); 35 | } 36 | 37 | static rt_err_t skt_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) 38 | { 39 | rt_err_t ret = RT_EOK; 40 | struct skt_hwtimer_dev *hwtimer = SKT_HWTIMER_DEVICE(timer->parent.user_data); 41 | 42 | RT_ASSERT(hwtimer != RT_NULL); 43 | 44 | switch (cmd) 45 | { 46 | case HWTIMER_CTRL_FREQ_SET: 47 | 48 | /* Todo:set the count frequency */ 49 | break; 50 | 51 | case HWTIMER_CTRL_STOP: 52 | 53 | /* Todo:stop timer */ 54 | break; 55 | 56 | case HWTIMER_CTRL_INFO_GET: 57 | 58 | /* Todo:get a timer feature information */ 59 | break; 60 | 61 | case HWTIMER_CTRL_MODE_SET: 62 | 63 | /* Todo:Set the timing mode(oneshot/period) */ 64 | break; 65 | default: 66 | 67 | break; 68 | } 69 | return ret; 70 | } 71 | 72 | static rt_uint32_t skt_hwtimer_count_get(rt_hwtimer_t *timer) 73 | { 74 | struct skt_hwtimer_dev *hwtimer = SKT_HWTIMER_DEVICE(timer->parent.user_data); 75 | 76 | RT_ASSERT(hwtimer != RT_NULL); 77 | 78 | /* Todo: get hwtimer(hwtimer->hwtimer_periph) counter value*/ 79 | return 0; 80 | } 81 | 82 | static void skt_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) 83 | { 84 | struct skt_hwtimer_dev *hwtimer = SKT_HWTIMER_DEVICE(timer->parent.user_data); 85 | 86 | RT_ASSERT(hwtimer != RT_NULL); 87 | 88 | /* Todo:init hwtimer(hwtimer->hwtimer_periph)*/ 89 | } 90 | 91 | static rt_err_t skt_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) 92 | { 93 | rt_err_t ret = RT_EOK; 94 | struct skt_hwtimer_dev *hwtimer = SKT_HWTIMER_DEVICE(timer->parent.user_data); 95 | 96 | RT_ASSERT(hwtimer != RT_NULL); 97 | 98 | /* Todo:start hwtimer(hwtimer->hwtimer_periph)*/ 99 | 100 | /* install interrupt */ 101 | /* 102 | rt_hw_interrupt_install(hwtimer->irqno, skt_hwtimer_isr, 103 | hwtimer, hwtimer->parent.parent.parent.name); 104 | */ 105 | /* Enable Interrupt */ 106 | /* rt_hw_interrupt_umask(hwtimer->irqno);*/ 107 | 108 | return ret; 109 | } 110 | 111 | static void skt_hwtimer_stop(rt_hwtimer_t *timer) 112 | { 113 | struct skt_hwtimer_dev *hwtimer = SKT_HWTIMER_DEVICE(timer->parent.user_data); 114 | 115 | RT_ASSERT(hwtimer != RT_NULL); 116 | 117 | /* Todo:stop hwtimer(hwtimer->hwtimer_periph)*/ 118 | } 119 | 120 | const static struct rt_hwtimer_ops hwtimer_ops = 121 | { 122 | skt_hwtimer_init, 123 | skt_hwtimer_start, 124 | skt_hwtimer_stop, 125 | skt_hwtimer_count_get, 126 | skt_hwtimer_control 127 | }; 128 | 129 | const static struct rt_hwtimer_info hwtimer_info = 130 | { 131 | 25000000, /* the maximum count frequency can be set */ 132 | 6103, /* the minimum count frequency can be set */ 133 | 0xFFFFFFFF, /* counter maximum value */ 134 | HWTIMER_CNTMODE_UP, /* count mode (inc/dec) */ 135 | }; 136 | 137 | int rt_hw_hwtimer_init(void) 138 | { 139 | rt_err_t ret = RT_EOK; 140 | hwtimer0.parent.info = &hwtimer_info; 141 | hwtimer0.parent.ops = &hwtimer_ops; 142 | 143 | ret = rt_device_hwtimer_register(&hwtimer0.parent, "timer0", &hwtimer0); 144 | 145 | return ret; 146 | } 147 | INIT_DEVICE_EXPORT(rt_hw_hwtimer_init); 148 | 149 | #endif /* RT_USING_HWTIMER */ 150 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_hwtimer.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_HWTIMER_H__ 11 | #define DRV_HWTIMER_H__ 12 | 13 | int rt_hw_hwtimer_init(void); 14 | 15 | #endif 16 | 17 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_i2c.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "drv_i2c.h" 13 | 14 | #ifdef RT_USING_I2C 15 | 16 | #define SKT_I2C_DEVICE(i2c_bus) (struct skt_i2c_bus *)(i2c_bus) 17 | 18 | static struct skt_i2c_bus i2c_bus0; 19 | 20 | struct skt_i2c_bus 21 | { 22 | struct rt_i2c_bus_device parent; 23 | rt_uint32_t i2c_periph; 24 | }; 25 | 26 | static rt_size_t skt_i2c_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num) 27 | { 28 | struct skt_i2c_bus *i2c_bus = SKT_I2C_DEVICE(bus); 29 | 30 | RT_ASSERT(i2c_bus != RT_NULL); 31 | 32 | /* Todo: transfer msgs[] via I2C hardware(bus->i2c_periph) */ 33 | return 0; 34 | } 35 | 36 | const static struct rt_i2c_bus_device_ops skt_i2c_ops = 37 | { 38 | skt_i2c_xfer, 39 | RT_NULL, 40 | RT_NULL 41 | }; 42 | 43 | int rt_hw_i2c_init(void) 44 | { 45 | rt_err_t ret = RT_EOK; 46 | 47 | i2c_bus0.parent.ops = &skt_i2c_ops; 48 | 49 | /* Todo: Init I2C Hardware */ 50 | 51 | ret = rt_i2c_bus_device_register(&i2c_bus0.parent, "i2c0"); 52 | 53 | return ret; 54 | } 55 | INIT_DEVICE_EXPORT(rt_hw_i2c_init); 56 | 57 | #endif /* RT_USING_I2C */ 58 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_i2c.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_I2C_H__ 11 | #define DRV_I2C_H__ 12 | 13 | int rt_hw_i2c_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_i2s.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_i2s.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_I2S_H__ 11 | #define DRV_I2S_H__ 12 | 13 | 14 | #endif 15 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_lcd.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "drv_lcd.h" 13 | 14 | static struct rt_device_graphic_info lcd_info; 15 | static struct rt_device lcd_dev; 16 | 17 | static rt_err_t skt_lcd_init(rt_device_t dev) 18 | { 19 | rt_err_t ret = RT_EOK; 20 | 21 | RT_ASSERT(dev != RT_NULL); 22 | 23 | /* Todo: init LCD */ 24 | 25 | return ret; 26 | } 27 | 28 | static rt_err_t skt_lcd_open(rt_device_t dev, rt_uint16_t oflag) 29 | { 30 | rt_err_t ret = RT_EOK; 31 | 32 | RT_ASSERT(dev != RT_NULL); 33 | 34 | /* Todo: enable LCD */ 35 | 36 | return ret; 37 | } 38 | 39 | static rt_err_t skt_lcd_close(rt_device_t dev) 40 | { 41 | rt_err_t ret = RT_EOK; 42 | 43 | RT_ASSERT(dev != RT_NULL); 44 | 45 | /* Todo: close LCD */ 46 | 47 | return ret; 48 | } 49 | 50 | static rt_size_t skt_lcd_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) 51 | { 52 | RT_ASSERT(dev != RT_NULL); 53 | 54 | /* Todo: read LCD */ 55 | 56 | return 0; 57 | } 58 | 59 | static rt_size_t skt_lcd_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) 60 | { 61 | RT_ASSERT(dev != RT_NULL); 62 | 63 | /* Todo: write LCD */ 64 | return 0; 65 | } 66 | 67 | static rt_err_t skt_lcd_control(rt_device_t dev, int cmd, void *args) 68 | { 69 | rt_err_t ret = RT_EOK; 70 | 71 | RT_ASSERT(dev != RT_NULL); 72 | 73 | switch (cmd) 74 | { 75 | case RTGRAPHIC_CTRL_RECT_UPDATE: 76 | 77 | /* Todo: update LCD data */ 78 | break; 79 | 80 | case RTGRAPHIC_CTRL_POWERON: 81 | /* Todo: power on */ 82 | break; 83 | 84 | case RTGRAPHIC_CTRL_POWEROFF: 85 | /* Todo: power off */ 86 | break; 87 | 88 | case RTGRAPHIC_CTRL_GET_INFO: 89 | /* Todo: get lcd_info and store to args*/ 90 | break; 91 | 92 | case RTGRAPHIC_CTRL_SET_MODE: 93 | 94 | break; 95 | default: 96 | break; 97 | } 98 | 99 | return ret; 100 | } 101 | 102 | #ifdef RT_USING_DEVICE_OPS 103 | const static struct rt_device_ops skt_lcd_ops = 104 | { 105 | skt_lcd_init, 106 | skt_lcd_open, 107 | skt_lcd_close, 108 | skt_lcd_read, 109 | skt_lcd_write, 110 | skt_lcd_control 111 | }; 112 | #endif 113 | 114 | int rt_hw_lcd_init(void) 115 | { 116 | rt_err_t ret = RT_EOK; 117 | 118 | /* Todo: Init lcd_info */ 119 | 120 | lcd_dev.type = RT_Device_Class_Graphic; 121 | lcd_dev.rx_indicate = RT_NULL; 122 | lcd_dev.tx_complete = RT_NULL; 123 | 124 | #ifdef RT_USING_DEVICE_OPS 125 | lcd_dev.ops = &skt_lcd_ops; 126 | #else 127 | lcd_dev.init = skt_lcd_init; 128 | lcd_dev.open = skt_lcd_open; 129 | lcd_dev.close = skt_lcd_close; 130 | lcd_dev.read = skt_lcd_read; 131 | lcd_dev.write = skt_lcd_write; 132 | lcd_dev.control = skt_lcd_control; 133 | #endif 134 | 135 | lcd_dev.user_data = (void *)&lcd_info; 136 | 137 | ret = rt_device_register(&lcd_dev, "lcd", RT_DEVICE_FLAG_RDWR); 138 | 139 | return ret; 140 | } 141 | INIT_DEVICE_EXPORT(rt_hw_lcd_init); 142 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_lcd.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_LCD_H__ 11 | #define DRV_LCD_H__ 12 | 13 | int rt_hw_lcd_init(void); 14 | #endif 15 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_pwm.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "drv_pwm.h" 13 | 14 | #ifdef RT_USING_PWM 15 | 16 | #define SKT_PWM_DEVICE(pwm) (struct skt_pwm_dev *)(pwm) 17 | 18 | static struct skt_pwm_dev pwm_dev0; 19 | 20 | struct skt_pwm_dev 21 | { 22 | struct rt_device_pwm parent; 23 | rt_uint32_t pwm_periph; 24 | }; 25 | 26 | static rt_err_t skt_pwm_enable(void *user_data, struct rt_pwm_configuration *cfg, rt_bool_t enable) 27 | { 28 | rt_err_t ret = RT_EOK; 29 | 30 | /* start/stop pwm_x chanel_x output */ 31 | return ret; 32 | } 33 | 34 | static rt_err_t skt_pwm_get(void *user_data, struct rt_pwm_configuration *cfg) 35 | { 36 | rt_err_t ret = RT_EOK; 37 | 38 | /* get pluse ,period ... */ 39 | return ret; 40 | } 41 | static rt_err_t skt_pwm_set(void *user_data, struct rt_pwm_configuration *cfg) 42 | { 43 | rt_err_t ret = RT_EOK; 44 | 45 | /* set pluse ,period ... */ 46 | return ret; 47 | } 48 | 49 | static rt_err_t skt_pwm_control(struct rt_device_pwm *device, int cmd, void *arg) 50 | { 51 | rt_err_t ret = RT_EOK; 52 | struct skt_pwm_dev *pwm = SKT_PWM_DEVICE(device->parent.user_data); 53 | struct rt_pwm_configuration *cfg = (struct rt_pwm_configuration *)arg; 54 | 55 | RT_ASSERT(pwm != RT_NULL); 56 | 57 | switch (cmd) 58 | { 59 | case PWM_CMD_ENABLE: 60 | 61 | ret = skt_pwm_enable((void *)pwm->pwm_periph, cfg, RT_TRUE); 62 | break; 63 | case PWM_CMD_DISABLE: 64 | 65 | ret = skt_pwm_enable((void *)pwm->pwm_periph, cfg, RT_FALSE); 66 | break; 67 | case PWM_CMD_SET: 68 | 69 | ret = skt_pwm_set((void *)pwm->pwm_periph, cfg); 70 | break; 71 | case PWM_CMD_GET: 72 | 73 | ret = skt_pwm_get((void *)pwm->pwm_periph, cfg); 74 | break; 75 | default: 76 | ret = RT_EINVAL; 77 | break; 78 | } 79 | 80 | return ret; 81 | } 82 | 83 | const static struct rt_pwm_ops skt_pwm_ops = 84 | { 85 | skt_pwm_control 86 | }; 87 | 88 | int rt_hw_pwm_init(void) 89 | { 90 | rt_err_t ret = RT_EOK; 91 | 92 | /* Todo: Init PWM Hardware */ 93 | 94 | ret = rt_device_pwm_register(&pwm_dev0.parent, "pwm0", &skt_pwm_ops, &pwm_dev0); 95 | 96 | return ret; 97 | } 98 | INIT_DEVICE_EXPORT(rt_hw_pwm_init); 99 | 100 | #endif /* RT_USING_PWM */ 101 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_pwm.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_PWM_H__ 11 | #define DRV_PWM_H__ 12 | 13 | int rt_hw_pwm_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_rtc.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "drv_rtc.h" 13 | 14 | #ifdef RT_USING_RTC 15 | 16 | static struct rt_device rtc_dev; 17 | 18 | static rt_err_t skt_rtc_control(rt_device_t dev, int cmd, void *args) 19 | { 20 | rt_err_t ret = RT_EOK; 21 | 22 | RT_ASSERT(dev != RT_NULL); 23 | 24 | /* Todo:control RTC */ 25 | return ret; 26 | } 27 | 28 | #ifdef RT_USING_DEVICE_OPS 29 | const static struct rt_device_ops skt_rtc_ops = 30 | { 31 | RT_NULL, 32 | RT_NULL, 33 | RT_NULL, 34 | RT_NULL, 35 | RT_NULL, 36 | skt_rtc_control 37 | }; 38 | #endif 39 | 40 | int rt_hw_rtc_init(void) 41 | { 42 | rt_err_t ret = RT_EOK; 43 | 44 | rtc_dev.type = RT_Device_Class_RTC; 45 | rtc_dev.rx_indicate = RT_NULL; 46 | rtc_dev.tx_complete = RT_NULL; 47 | 48 | #ifdef RT_USING_DEVICE_OPS 49 | rtc_dev.ops = &skt_rtc_ops; 50 | #else 51 | rtc_dev.init = RT_NULL; 52 | rtc_dev.open = RT_NULL; 53 | rtc_dev.close = RT_NULL; 54 | rtc_dev.read = RT_NULL; 55 | rtc_dev.write = RT_NULL; 56 | rtc_dev.control = skt_rtc_control; 57 | #endif 58 | 59 | rtc_dev.user_data = RT_NULL; 60 | 61 | ret = rt_device_register(&rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR); 62 | 63 | return ret; 64 | } 65 | INIT_BOARD_EXPORT(rt_hw_rtc_init); 66 | 67 | #endif /* RT_USING_RTC */ 68 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_rtc.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_RTC_H__ 11 | #define DRV_RTC_H__ 12 | 13 | int rt_hw_rtc_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_sdio.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | #include "drv_sdio.h" 14 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_sdio.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_SDIO_H__ 11 | #define DRV_SDIO_H__ 12 | 13 | #endif 14 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_spi.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "drv_spi.h" 13 | 14 | #ifdef RT_USING_SPI 15 | 16 | #define SKT_SPI_DEVICE(spi_bus) (struct skt_spi_bus *)(spi_bus) 17 | 18 | static struct skt_spi_bus spi_bus0; 19 | 20 | struct skt_spi_bus 21 | { 22 | struct rt_spi_bus parent; 23 | rt_uint32_t spi_periph; 24 | }; 25 | 26 | static rt_err_t skt_spi_configure(struct rt_spi_device *device, 27 | struct rt_spi_configuration *configuration) 28 | { 29 | rt_err_t ret = RT_EOK; 30 | struct skt_spi_bus *bus = SKT_SPI_DEVICE(device->bus); 31 | 32 | RT_ASSERT(bus != RT_NULL); 33 | 34 | /* Todo:according to (configuration) set (bus->spi_periph) data_width, prescale, mode. */ 35 | 36 | /* Todo:enable SPI (bus->spi_periph) */ 37 | 38 | return ret; 39 | } 40 | 41 | static rt_uint32_t skt_spi_xfer(struct rt_spi_device *device, struct rt_spi_message *message) 42 | { 43 | struct skt_spi_bus *bus = SKT_SPI_DEVICE(device->bus); 44 | struct rt_spi_configuration *cfg = &device->config; 45 | rt_base_t cs_pin = (rt_base_t)device->parent.user_data; 46 | 47 | RT_ASSERT(bus != RT_NULL); 48 | 49 | (void)cs_pin; 50 | (void)cfg; 51 | /* Todo: transfer message via SPI Hardware(bus->spi_periph) */ 52 | 53 | return 0; 54 | } 55 | 56 | const static struct rt_spi_ops skt_spi_ops = 57 | { 58 | skt_spi_configure, 59 | skt_spi_xfer 60 | }; 61 | 62 | int rt_hw_spi_init(void) 63 | { 64 | rt_err_t ret = RT_EOK; 65 | 66 | /* Todo: Init SPI Hardware */ 67 | 68 | ret = rt_spi_bus_register(&spi_bus0.parent, "spi0", &skt_spi_ops); 69 | 70 | return ret; 71 | } 72 | INIT_DEVICE_EXPORT(rt_hw_spi_init); 73 | 74 | #endif /* RT_USING_SPI */ 75 | 76 | 77 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_spi.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_SPI_H__ 11 | #define DRV_SPI_H__ 12 | 13 | int rt_hw_spi_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_uart.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include 13 | #include "board.h" 14 | #include "drv_uart.h" 15 | 16 | #ifdef RT_USING_SERIAL 17 | 18 | #define SKT_UART_DEVICE(uart) (struct skt_uart_dev *)(uart) 19 | 20 | static struct skt_uart_dev uart0_dev; 21 | 22 | struct skt_uart_dev 23 | { 24 | struct rt_serial_device parent; 25 | rt_uint32_t uart_periph; 26 | rt_uint32_t irqno; 27 | }; 28 | 29 | void skt_uart_isr(int irqno, void *param) 30 | { 31 | struct skt_uart_dev *uart = SKT_UART_DEVICE(param); 32 | 33 | RT_ASSERT(uart != RT_NULL); 34 | 35 | /* read interrupt status and clear it */ 36 | if (0) /* rx ind */ 37 | { 38 | rt_hw_serial_isr(&uart->parent, RT_SERIAL_EVENT_RX_IND); 39 | } 40 | 41 | if (0) /* tx done */ 42 | { 43 | rt_hw_serial_isr(&uart->parent, RT_SERIAL_EVENT_TX_DONE); 44 | } 45 | } 46 | 47 | /* 48 | * UART interface 49 | */ 50 | static rt_err_t skt_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg) 51 | { 52 | rt_err_t ret = RT_EOK; 53 | struct skt_uart_dev *uart; 54 | 55 | RT_ASSERT(serial != RT_NULL); 56 | 57 | serial->config = *cfg; 58 | 59 | uart = SKT_UART_DEVICE(serial->parent.user_data); 60 | RT_ASSERT(uart != RT_NULL); 61 | 62 | /* Init UART Hardware(uart->uart_periph) */ 63 | 64 | /* Enable UART clock */ 65 | 66 | /* Set both receiver and transmitter in UART mode (not SIR) */ 67 | 68 | /* according to (cfg) set databits, baudrate, stopbits and parity. (8-bit data, 1 stopbit, no parity) */ 69 | 70 | return ret; 71 | } 72 | 73 | static rt_err_t skt_uart_control(struct rt_serial_device *serial, int cmd, void *arg) 74 | { 75 | rt_err_t ret = RT_EOK; 76 | struct skt_uart_dev *uart = SKT_UART_DEVICE(serial->parent.user_data); 77 | 78 | RT_ASSERT(uart != RT_NULL); 79 | 80 | rt_ubase_t ctrl_arg = (rt_ubase_t)arg; 81 | 82 | switch (cmd) 83 | { 84 | case RT_DEVICE_CTRL_CLR_INT: 85 | /* Disable the UART Interrupt */ 86 | /* rt_hw_interrupt_mask(uart->irqno); */ 87 | break; 88 | 89 | case RT_DEVICE_CTRL_SET_INT: 90 | /* install interrupt */ 91 | /* 92 | rt_hw_interrupt_install(uart->irqno, skt_uart_isr, 93 | serial, serial->parent.parent.name); 94 | */ 95 | /* Enable the UART Interrupt */ 96 | /* rt_hw_interrupt_umask(uart->irqno);*/ 97 | 98 | break; 99 | 100 | case RT_DEVICE_CTRL_CONFIG: 101 | if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX) 102 | { 103 | /* Todo: DMA configuration */ 104 | } 105 | break; 106 | } 107 | 108 | return ret; 109 | } 110 | 111 | static int skt_uart_putc(struct rt_serial_device *serial, char c) 112 | { 113 | struct skt_uart_dev *uart = SKT_UART_DEVICE(serial->parent.user_data); 114 | 115 | RT_ASSERT(uart != RT_NULL); 116 | 117 | /* FIFO status, contain valid data */ 118 | 119 | /* Todo:write data (ch) to (uart->uart_periph) */ 120 | 121 | return 1; 122 | } 123 | 124 | static int skt_uart_getc(struct rt_serial_device *serial) 125 | { 126 | int ch; 127 | struct skt_uart_dev *uart = SKT_UART_DEVICE(serial->parent.user_data); 128 | 129 | RT_ASSERT(uart != RT_NULL); 130 | 131 | ch = -1; 132 | 133 | /* Todo:receive data from (uart->uart_periph) and store it in (ch) */ 134 | 135 | return ch; 136 | } 137 | 138 | static rt_size_t skt_uart_dma_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction) 139 | { 140 | struct skt_uart_dev *uart = SKT_UART_DEVICE(serial->parent.user_data); 141 | 142 | RT_ASSERT(uart != RT_NULL); 143 | 144 | return 0; 145 | } 146 | 147 | const static struct rt_uart_ops _uart_ops = 148 | { 149 | skt_uart_configure, 150 | skt_uart_control, 151 | skt_uart_putc, 152 | skt_uart_getc, 153 | skt_uart_dma_transmit 154 | }; 155 | 156 | /* 157 | * UART Initiation 158 | */ 159 | int rt_hw_uart_init(void) 160 | { 161 | rt_err_t ret = RT_EOK; 162 | 163 | struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; 164 | 165 | uart0_dev.parent.ops = &_uart_ops; 166 | uart0_dev.parent.config = config; 167 | 168 | /* Todo: Init uart0_dev other data */ 169 | 170 | /* Todo: Init uart0 hardware */ 171 | 172 | ret = rt_hw_serial_register(&uart0_dev.parent, 173 | "uart0", 174 | RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, 175 | &uart0_dev); 176 | 177 | return ret; 178 | } 179 | INIT_DEVICE_EXPORT(rt_hw_uart_init); 180 | 181 | #endif /* RT_USING_SERIAL */ 182 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_uart.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_UART_H__ 11 | #define DRV_UART_H__ 12 | 13 | int rt_hw_uart_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_usbd.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_usbh.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_wdt.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "drv_wdt.h" 13 | 14 | #ifdef RT_USING_WDT 15 | 16 | static struct rt_watchdog_device wdt_dev; 17 | 18 | static rt_err_t skt_wdt_init(rt_watchdog_t *wdt) 19 | { 20 | rt_err_t ret = RT_EOK; 21 | 22 | /* Todo: init watchdog */ 23 | return ret; 24 | } 25 | 26 | static rt_err_t skt_wdt_control(rt_watchdog_t *wdt, int cmd, void *arg) 27 | { 28 | rt_err_t ret = RT_EOK; 29 | 30 | switch (cmd) 31 | { 32 | case RT_DEVICE_CTRL_WDT_SET_TIMEOUT: 33 | 34 | /* Todo:set wdt timeout value */ 35 | break; 36 | case RT_DEVICE_CTRL_WDT_START: 37 | 38 | /* Todo:enable wdt */ 39 | break; 40 | case RT_DEVICE_CTRL_WDT_STOP: 41 | 42 | /* Todo:stop wdt */ 43 | break; 44 | 45 | case RT_DEVICE_CTRL_WDT_KEEPALIVE: 46 | 47 | /* Todo:refresh wdt */ 48 | break; 49 | default: 50 | 51 | break; 52 | } 53 | 54 | return ret; 55 | } 56 | 57 | const static struct rt_watchdog_ops skt_wdt_ops = 58 | { 59 | skt_wdt_init, 60 | skt_wdt_control 61 | }; 62 | 63 | int rt_hw_wdt_init(void) 64 | { 65 | rt_err_t ret = RT_EOK; 66 | 67 | wdt_dev.ops = &skt_wdt_ops; 68 | 69 | ret = rt_hw_watchdog_register(&wdt_dev, "wdt", RT_DEVICE_FLAG_STANDALONE, RT_NULL); 70 | 71 | return ret; 72 | } 73 | INIT_BOARD_EXPORT(rt_hw_wdt_init); 74 | 75 | #endif /* RT_USING_WDT */ 76 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_wdt.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_WDT_H__ 11 | #define DRV_WDT_H__ 12 | 13 | int rt_hw_wdt_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/drv_wlan.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_WLAN_H__ 11 | #define DRV_WLAN_H__ 12 | 13 | int rt_hw_wlan_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/linker_scripts/link.icf: -------------------------------------------------------------------------------- 1 | /*###ICF### Section handled by ICF editor, don't touch! ****/ 2 | /*-Editor annotation file-*/ 3 | /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ 4 | /*-Specials-*/ 5 | define symbol __ICFEDIT_intvec_start__ = 0x08000000; 6 | /*-Memory Regions-*/ 7 | define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; 8 | define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; 9 | define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; 10 | define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; 11 | /*-Sizes-*/ 12 | define symbol __ICFEDIT_size_cstack__ = 0x0400; 13 | define symbol __ICFEDIT_size_heap__ = 0x0000; 14 | /**** End of ICF editor section. ###ICF###*/ 15 | 16 | define memory mem with size = 4G; 17 | define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; 18 | define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; 19 | 20 | define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; 21 | 22 | initialize by copy { readwrite }; 23 | do not initialize { section .noinit }; 24 | 25 | place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; 26 | 27 | place in ROM_region { readonly }; 28 | place in RAM_region { readwrite, last block CSTACK}; -------------------------------------------------------------------------------- /bsp_skeleton/drivers/linker_scripts/link.lds: -------------------------------------------------------------------------------- 1 | /* Program Entry, set to mark it as "used" and avoid gc */ 2 | MEMORY 3 | { 4 | ROM (rx) : ORIGIN = 0x08000000, LENGTH = 512k /* 512KB flash */ 5 | RAM (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128K sram */ 6 | } 7 | ENTRY(Reset_Handler) 8 | _system_stack_size = 0x200; 9 | 10 | SECTIONS 11 | { 12 | .text : 13 | { 14 | . = ALIGN(4); 15 | _stext = .; 16 | KEEP(*(.isr_vector)) /* Startup code */ 17 | 18 | . = ALIGN(4); 19 | *(.text) /* remaining code */ 20 | *(.text.*) /* remaining code */ 21 | *(.rodata) /* read-only data (constants) */ 22 | *(.rodata*) 23 | *(.glue_7) 24 | *(.glue_7t) 25 | *(.gnu.linkonce.t*) 26 | 27 | /* section information for finsh shell */ 28 | . = ALIGN(4); 29 | __fsymtab_start = .; 30 | KEEP(*(FSymTab)) 31 | __fsymtab_end = .; 32 | 33 | . = ALIGN(4); 34 | __vsymtab_start = .; 35 | KEEP(*(VSymTab)) 36 | __vsymtab_end = .; 37 | 38 | /* section information for initial. */ 39 | . = ALIGN(4); 40 | __rt_init_start = .; 41 | KEEP(*(SORT(.rti_fn*))) 42 | __rt_init_end = .; 43 | 44 | PROVIDE(__ctors_start__ = .); 45 | /* old GCC version uses .ctors */ 46 | KEEP(*(SORT(.ctors.*))) 47 | KEEP(*(.ctors)) 48 | /* new GCC version uses .init_array */ 49 | KEEP (*(SORT(.init_array.*))) 50 | KEEP (*(.init_array)) 51 | PROVIDE(__ctors_end__ = .); 52 | . = ALIGN(4); 53 | 54 | . = ALIGN(4); 55 | _etext = .; 56 | } > ROM = 0 57 | 58 | /* .ARM.exidx is sorted, so has to go in its own output section. */ 59 | __exidx_start = .; 60 | .ARM.exidx : 61 | { 62 | *(.ARM.exidx* .gnu.linkonce.armexidx.*) 63 | 64 | /* This is used by the startup in order to initialize the .data secion */ 65 | _sidata = .; 66 | } > ROM 67 | __exidx_end = .; 68 | 69 | /* .data section which is used for initialized data */ 70 | 71 | .data : AT (_sidata) 72 | { 73 | . = ALIGN(4); 74 | /* This is used by the startup in order to initialize the .data secion */ 75 | _sdata = . ; 76 | 77 | *(.data) 78 | *(.data.*) 79 | *(.gnu.linkonce.d*) 80 | 81 | . = ALIGN(4); 82 | PROVIDE(__dtors_start__ = .); 83 | KEEP(*(SORT(.dtors.*))) 84 | KEEP(*(.dtors)) 85 | PROVIDE(__dtors_end__ = .); 86 | 87 | . = ALIGN(4); 88 | /* This is used by the startup in order to initialize the .data secion */ 89 | _edata = . ; 90 | } >RAM 91 | 92 | .stack : 93 | { 94 | . = ALIGN(4); 95 | _sstack = .; 96 | . = . + _system_stack_size; 97 | . = ALIGN(4); 98 | _estack = .; 99 | } >RAM 100 | 101 | __bss_start = .; 102 | .bss : 103 | { 104 | . = ALIGN(4); 105 | /* This is used by the startup in order to initialize the .bss secion */ 106 | _sbss = .; 107 | 108 | *(.bss) 109 | *(.bss.*) 110 | *(COMMON) 111 | 112 | . = ALIGN(4); 113 | /* This is used by the startup in order to initialize the .bss secion */ 114 | _ebss = . ; 115 | 116 | *(.bss.init) 117 | } > RAM 118 | __bss_end = .; 119 | 120 | _end = .; 121 | 122 | /* Stabs debugging sections. */ 123 | .stab 0 : { *(.stab) } 124 | .stabstr 0 : { *(.stabstr) } 125 | .stab.excl 0 : { *(.stab.excl) } 126 | .stab.exclstr 0 : { *(.stab.exclstr) } 127 | .stab.index 0 : { *(.stab.index) } 128 | .stab.indexstr 0 : { *(.stab.indexstr) } 129 | .comment 0 : { *(.comment) } 130 | /* DWARF debug sections. 131 | * Symbols in the DWARF debugging sections are relative to the beginning 132 | * of the section so we begin them at 0. */ 133 | /* DWARF 1 */ 134 | .debug 0 : { *(.debug) } 135 | .line 0 : { *(.line) } 136 | /* GNU DWARF 1 extensions */ 137 | .debug_srcinfo 0 : { *(.debug_srcinfo) } 138 | .debug_sfnames 0 : { *(.debug_sfnames) } 139 | /* DWARF 1.1 and DWARF 2 */ 140 | .debug_aranges 0 : { *(.debug_aranges) } 141 | .debug_pubnames 0 : { *(.debug_pubnames) } 142 | /* DWARF 2 */ 143 | .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } 144 | .debug_abbrev 0 : { *(.debug_abbrev) } 145 | .debug_line 0 : { *(.debug_line) } 146 | .debug_frame 0 : { *(.debug_frame) } 147 | .debug_str 0 : { *(.debug_str) } 148 | .debug_loc 0 : { *(.debug_loc) } 149 | .debug_macinfo 0 : { *(.debug_macinfo) } 150 | /* SGI/MIPS DWARF 2 extensions */ 151 | .debug_weaknames 0 : { *(.debug_weaknames) } 152 | .debug_funcnames 0 : { *(.debug_funcnames) } 153 | .debug_typenames 0 : { *(.debug_typenames) } 154 | .debug_varnames 0 : { *(.debug_varnames) } 155 | } 156 | -------------------------------------------------------------------------------- /bsp_skeleton/drivers/linker_scripts/link.sct: -------------------------------------------------------------------------------- 1 | ; ************************************************************* 2 | ; *** Scatter-Loading Description File generated by uVision *** 3 | ; ************************************************************* 4 | 5 | LR_IROM1 0x08000000 0x00080000 { ; load region size_region 6 | ER_IROM1 0x08000000 0x00080000 { ; load address = execution address 7 | *.o (RESET, +First) 8 | *(InRoot$$Sections) 9 | .ANY (+RO) 10 | } 11 | RW_IRAM1 0x20000000 0x00020000 { ; RW data 12 | .ANY (+RW +ZI) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /bsp_skeleton/libcpu/SConscript: -------------------------------------------------------------------------------- 1 | Import('rtconfig') 2 | from building import * 3 | 4 | cwd = GetCurrentDir() 5 | CPPPATH = [cwd] 6 | src = Glob('*.c') 7 | 8 | if rtconfig.PLATFORM == 'iar': 9 | src += Glob('*_iar.S') 10 | elif rtconfig.PLATFORM == 'gcc': 11 | src += Glob('*_gcc.S') 12 | elif rtconfig.PLATFORM == 'armcc': 13 | src += Glob('*_rvds.S') 14 | 15 | group = DefineGroup('CPU', src, depend = [''], CPPPATH = CPPPATH) 16 | 17 | Return('group') 18 | -------------------------------------------------------------------------------- /bsp_skeleton/libcpu/context_gcc.S: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | /* 11 | * void rt_hw_context_switch_to(rt_uint32 to)/* 12 | * a0 --> to 13 | */ 14 | .globl rt_hw_context_switch_to 15 | rt_hw_context_switch_to: 16 | nop 17 | 18 | /* 19 | * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to) 20 | * a0 --> from 21 | * a1 --> to 22 | */ 23 | .globl rt_hw_context_switch 24 | rt_hw_context_switch: 25 | nop 26 | 27 | /* 28 | * void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to) 29 | * a0 --> from 30 | * a1 --> to 31 | */ 32 | .globl rt_hw_context_switch_interrupt 33 | rt_hw_context_switch_interrupt: 34 | nop 35 | -------------------------------------------------------------------------------- /bsp_skeleton/libcpu/port.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | rt_base_t rt_hw_interrupt_disable(void) 14 | { 15 | return 0; 16 | } 17 | 18 | void rt_hw_interrupt_enable(rt_base_t level) 19 | { 20 | return ; 21 | } 22 | 23 | rt_uint8_t *rt_hw_stack_init(void *entry, 24 | void *parameter, 25 | rt_uint8_t *stack_addr, 26 | void *exit) 27 | { 28 | return RT_NULL; 29 | } 30 | 31 | -------------------------------------------------------------------------------- /bsp_skeleton/libcpu/port.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef PORT_H__ 11 | #define PORT_H__ 12 | 13 | #endif 14 | -------------------------------------------------------------------------------- /bsp_skeleton/libcpu/startup_gcc.S: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | .global Reset_Handler 11 | .section ".start", "ax" 12 | Reset_Handler: 13 | nop 14 | -------------------------------------------------------------------------------- /bsp_skeleton/project.eww: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | $WS_DIR$\project.ewp 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /bsp_skeleton/project.uvopt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.0 5 | 6 |
### uVision Project, (C) Keil Software
7 | 8 | 9 | *.c 10 | *.s*; *.src; *.a* 11 | *.obj 12 | *.lib 13 | *.txt; *.h; *.inc 14 | *.plm 15 | *.cpp 16 | 17 | 18 | 19 | 0 20 | 0 21 | 22 | 23 | 24 | rtthread 25 | 0x4 26 | ARM-ADS 27 | 28 | 25000000 29 | 30 | 1 31 | 1 32 | 1 33 | 0 34 | 35 | 36 | 1 37 | 65535 38 | 0 39 | 0 40 | 0 41 | 42 | 43 | 79 44 | 66 45 | 8 46 | .\build\keil\List\ 47 | 48 | 49 | 1 50 | 1 51 | 1 52 | 0 53 | 1 54 | 1 55 | 0 56 | 1 57 | 0 58 | 0 59 | 0 60 | 0 61 | 62 | 63 | 1 64 | 1 65 | 1 66 | 1 67 | 1 68 | 1 69 | 1 70 | 0 71 | 0 72 | 73 | 74 | 0 75 | 0 76 | 1 77 | 78 | 255 79 | 80 | 0 81 | 1 82 | 1 83 | 1 84 | 1 85 | 1 86 | 1 87 | 1 88 | 1 89 | 1 90 | 1 91 | 1 92 | 1 93 | 1 94 | 0 95 | 1 96 | 0 97 | 1 98 | 1 99 | 0 100 | 0 101 | 0 102 | 6 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | Segger\JL2CM3.dll 114 | 115 | 116 | 117 | 0 118 | JL2CM3 119 | -U30000299 -O207 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 120 | 121 | 122 | 0 123 | UL2CM3 124 | UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) 125 | 126 | 127 | 128 | 129 | 0 130 | 131 | 132 | 0 133 | 0 134 | 0 135 | 0 136 | 0 137 | 0 138 | 0 139 | 0 140 | 0 141 | 0 142 | 0 143 | 0 144 | 0 145 | 0 146 | 0 147 | 0 148 | 0 149 | 0 150 | 0 151 | 0 152 | 0 153 | 0 154 | 0 155 | 0 156 | 157 | 158 | 159 | 160 | 161 | 162 |
163 | -------------------------------------------------------------------------------- /bsp_skeleton/rtconfig.h: -------------------------------------------------------------------------------- 1 | #ifndef RT_CONFIG_H__ 2 | #define RT_CONFIG_H__ 3 | 4 | /* Automatically generated file; DO NOT EDIT. */ 5 | /* RT-Thread Project Configuration */ 6 | 7 | /* RT-Thread Kernel */ 8 | 9 | #define RT_NAME_MAX 8 10 | #define RT_ALIGN_SIZE 4 11 | #define RT_THREAD_PRIORITY_32 12 | #define RT_THREAD_PRIORITY_MAX 32 13 | #define RT_TICK_PER_SECOND 100 14 | #define RT_USING_OVERFLOW_CHECK 15 | #define RT_USING_HOOK 16 | #define RT_USING_IDLE_HOOK 17 | #define RT_IDEL_HOOK_LIST_SIZE 4 18 | #define IDLE_THREAD_STACK_SIZE 256 19 | #define RT_DEBUG 20 | #define RT_DEBUG_COLOR 21 | 22 | /* Inter-Thread communication */ 23 | 24 | #define RT_USING_SEMAPHORE 25 | #define RT_USING_MUTEX 26 | #define RT_USING_EVENT 27 | #define RT_USING_MAILBOX 28 | #define RT_USING_MESSAGEQUEUE 29 | 30 | /* Memory Management */ 31 | 32 | #define RT_USING_MEMPOOL 33 | #define RT_USING_SMALL_MEM 34 | #define RT_USING_HEAP 35 | 36 | /* Kernel Device Object */ 37 | 38 | #define RT_USING_DEVICE 39 | #define RT_USING_CONSOLE 40 | #define RT_CONSOLEBUF_SIZE 128 41 | #define RT_CONSOLE_DEVICE_NAME "uart" 42 | #define RT_VER_NUM 0x40001 43 | 44 | /* RT-Thread Components */ 45 | 46 | #define RT_USING_COMPONENTS_INIT 47 | #define RT_USING_USER_MAIN 48 | #define RT_MAIN_THREAD_STACK_SIZE 2048 49 | #define RT_MAIN_THREAD_PRIORITY 10 50 | 51 | /* C++ features */ 52 | 53 | 54 | /* Command shell */ 55 | 56 | #define RT_USING_FINSH 57 | #define FINSH_THREAD_NAME "tshell" 58 | #define FINSH_USING_HISTORY 59 | #define FINSH_HISTORY_LINES 5 60 | #define FINSH_USING_SYMTAB 61 | #define FINSH_USING_DESCRIPTION 62 | #define FINSH_THREAD_PRIORITY 20 63 | #define FINSH_THREAD_STACK_SIZE 4096 64 | #define FINSH_CMD_SIZE 80 65 | #define FINSH_USING_MSH 66 | #define FINSH_USING_MSH_DEFAULT 67 | #define FINSH_ARG_MAX 10 68 | 69 | /* Device virtual file system */ 70 | 71 | 72 | /* Device Drivers */ 73 | 74 | #define RT_USING_DEVICE_IPC 75 | #define RT_PIPE_BUFSZ 512 76 | #define RT_USING_SERIAL 77 | #define RT_SERIAL_RB_BUFSZ 64 78 | #define RT_USING_PIN 79 | 80 | /* Using WiFi */ 81 | 82 | 83 | /* Using USB */ 84 | 85 | 86 | /* POSIX layer and C standard library */ 87 | 88 | 89 | /* Network */ 90 | 91 | /* Socket abstraction layer */ 92 | 93 | 94 | /* light weight TCP/IP stack */ 95 | 96 | 97 | /* Modbus master and slave stack */ 98 | 99 | 100 | /* AT commands */ 101 | 102 | 103 | /* VBUS(Virtual Software BUS) */ 104 | 105 | 106 | /* Utilities */ 107 | 108 | 109 | /* RT-Thread online packages */ 110 | 111 | /* IoT - internet of things */ 112 | 113 | 114 | /* Wi-Fi */ 115 | 116 | /* Marvell WiFi */ 117 | 118 | 119 | /* Wiced WiFi */ 120 | 121 | 122 | /* IoT Cloud */ 123 | 124 | 125 | /* security packages */ 126 | 127 | 128 | /* language packages */ 129 | 130 | 131 | /* multimedia packages */ 132 | 133 | 134 | /* tools packages */ 135 | 136 | 137 | /* system packages */ 138 | 139 | 140 | /* peripheral libraries and drivers */ 141 | 142 | 143 | /* miscellaneous packages */ 144 | 145 | 146 | /* samples: kernel and components samples */ 147 | 148 | 149 | /* Hardware Drivers Config */ 150 | 151 | /* On-chip Peripheral Drivers */ 152 | 153 | #define BSP_USING_GPIO 154 | 155 | /* HWtimer Drivers */ 156 | 157 | 158 | /* I2C Drivers */ 159 | 160 | 161 | /* PWM Drivers */ 162 | 163 | 164 | /* SPI Drivers */ 165 | 166 | 167 | /* UART Drivers */ 168 | 169 | #define BSP_USING_UART0 170 | 171 | /* Onboard Peripheral Drivers */ 172 | 173 | /* Offboard Peripheral Drivers */ 174 | 175 | #define BOARD_SKELETON 176 | 177 | #endif 178 | -------------------------------------------------------------------------------- /bsp_skeleton/rtconfig.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | # toolchains options 4 | ARCH='arm' 5 | CPU='cortex-m4' 6 | CROSS_TOOL='gcc' 7 | 8 | if os.getenv('RTT_CC'): 9 | CROSS_TOOL = os.getenv('RTT_CC') 10 | if os.getenv('RTT_ROOT'): 11 | RTT_ROOT = os.getenv('RTT_ROOT') 12 | 13 | # EXEC_PATH is the compiler execute path, for example, GCC, Keil MDK, IAR 14 | if CROSS_TOOL == 'gcc': 15 | PLATFORM = 'gcc' 16 | EXEC_PATH = r'C:\Users\XXYYZZ' 17 | elif CROSS_TOOL == 'keil': 18 | PLATFORM = 'armcc' 19 | EXEC_PATH = r'C:/Keil_v5' 20 | elif CROSS_TOOL == 'iar': 21 | PLATFORM = 'iar' 22 | EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' 23 | 24 | if os.getenv('RTT_EXEC_PATH'): 25 | EXEC_PATH = os.getenv('RTT_EXEC_PATH') 26 | 27 | BUILD = 'debug' 28 | #BUILD = 'release' 29 | 30 | if PLATFORM == 'gcc': 31 | PREFIX = 'arm-none-eabi-' 32 | CC = PREFIX + 'gcc' 33 | AS = PREFIX + 'gcc' 34 | AR = PREFIX + 'ar' 35 | CXX = PREFIX + 'g++' 36 | LINK = PREFIX + 'gcc' 37 | SIZE = PREFIX + 'size' 38 | OBJDUMP = PREFIX + 'objdump' 39 | OBJCPY = PREFIX + 'objcopy' 40 | 41 | TARGET_EXT = 'elf' 42 | DEVICE = ' -mcpu=' + CPU + ' -mthumb -ffunction-sections -fdata-sections' 43 | CFLAGS = DEVICE + ' -g -Wall' 44 | AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' 45 | LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,Reset_Handler -T drivers/linker_scripts/link.lds' 46 | 47 | CPATH = '' 48 | LPATH = '' 49 | 50 | if BUILD == 'debug': 51 | CFLAGS += ' -O0 -gdwarf-2 -g' 52 | AFLAGS += ' -gdwarf-2' 53 | else: 54 | CFLAGS += ' -O2' 55 | 56 | CXXFLAGS = CFLAGS 57 | 58 | POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' 59 | 60 | elif PLATFORM == 'armcc': 61 | CC = 'armcc' 62 | CXX = 'armcc' 63 | AS = 'armasm' 64 | AR = 'armar' 65 | LINK = 'armlink' 66 | TARGET_EXT = 'axf' 67 | 68 | DEVICE = ' --cpu ' + CPU 69 | CFLAGS = '-c ' + DEVICE + ' --apcs=interwork' 70 | AFLAGS = DEVICE + ' --apcs=interwork ' 71 | LFLAGS = DEVICE + ' --scatter "drivers/linker_scripts/link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' 72 | 73 | CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' 74 | LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' 75 | 76 | CFLAGS += ' -D__MICROLIB ' 77 | AFLAGS += ' --pd "__MICROLIB SETA 1" ' 78 | LFLAGS += ' --library_type=microlib ' 79 | EXEC_PATH += '/ARM/ARMCC/bin/' 80 | 81 | if BUILD == 'debug': 82 | CFLAGS += ' -g -O0' 83 | AFLAGS += ' -g' 84 | else: 85 | CFLAGS += ' -O2' 86 | 87 | CXXFLAGS = CFLAGS 88 | CFLAGS += ' --c99' 89 | 90 | POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' 91 | 92 | elif PLATFORM == 'iar': 93 | CC = 'iccarm' 94 | CXX = 'iccarm' 95 | AS = 'iasmarm' 96 | AR = 'iarchive' 97 | LINK = 'ilinkarm' 98 | TARGET_EXT = 'out' 99 | DEVICE = '-Dewarm' 100 | 101 | CFLAGS = DEVICE 102 | CFLAGS += ' --diag_suppress Pa050' 103 | CFLAGS += ' --no_cse' 104 | CFLAGS += ' --no_unroll' 105 | CFLAGS += ' --no_inline' 106 | CFLAGS += ' --no_code_motion' 107 | CFLAGS += ' --no_tbaa' 108 | CFLAGS += ' --no_clustering' 109 | CFLAGS += ' --no_scheduling' 110 | CFLAGS += ' --debug' 111 | CFLAGS += ' --endian=little' 112 | CFLAGS += ' --cpu=' + CPU 113 | CFLAGS += ' -e' 114 | CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' 115 | CFLAGS += ' --silent' 116 | 117 | AFLAGS = DEVICE 118 | AFLAGS += ' -s+' 119 | AFLAGS += ' -w+' 120 | AFLAGS += ' -r' 121 | AFLAGS += ' --cpu ' + CPU 122 | AFLAGS += ' -S' 123 | 124 | if BUILD == 'debug': 125 | CFLAGS += ' --debug' 126 | CFLAGS += ' -On' 127 | else: 128 | CFLAGS += ' -Oh' 129 | 130 | CXXFLAGS = CFLAGS 131 | LFLAGS = ' --config "drivers/linker_scripts/link.icf"' 132 | LFLAGS += ' --entry __iar_program_start' 133 | 134 | EXEC_PATH = EXEC_PATH + '/arm/bin/' 135 | POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' 136 | -------------------------------------------------------------------------------- /bsp_skeleton/template.eww: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | $WS_DIR$\template.ewp 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /bsp_skeleton/template.uvopt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.0 5 | 6 |
### uVision Project, (C) Keil Software
7 | 8 | 9 | *.c 10 | *.s*; *.src; *.a* 11 | *.obj 12 | *.lib 13 | *.txt; *.h; *.inc 14 | *.plm 15 | *.cpp 16 | 17 | 18 | 19 | 0 20 | 0 21 | 22 | 23 | 24 | rtthread 25 | 0x4 26 | ARM-ADS 27 | 28 | 25000000 29 | 30 | 1 31 | 1 32 | 1 33 | 0 34 | 35 | 36 | 1 37 | 65535 38 | 0 39 | 0 40 | 0 41 | 42 | 43 | 79 44 | 66 45 | 8 46 | .\build\keil\List\ 47 | 48 | 49 | 1 50 | 1 51 | 1 52 | 0 53 | 1 54 | 1 55 | 0 56 | 1 57 | 0 58 | 0 59 | 0 60 | 0 61 | 62 | 63 | 1 64 | 1 65 | 1 66 | 1 67 | 1 68 | 1 69 | 1 70 | 0 71 | 0 72 | 73 | 74 | 0 75 | 0 76 | 1 77 | 78 | 255 79 | 80 | 0 81 | 1 82 | 1 83 | 1 84 | 1 85 | 1 86 | 1 87 | 1 88 | 1 89 | 1 90 | 1 91 | 1 92 | 1 93 | 1 94 | 0 95 | 1 96 | 0 97 | 1 98 | 1 99 | 0 100 | 0 101 | 0 102 | 6 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | Segger\JL2CM3.dll 114 | 115 | 116 | 117 | 0 118 | JL2CM3 119 | -U30000299 -O207 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 120 | 121 | 122 | 0 123 | UL2CM3 124 | UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) 125 | 126 | 127 | 128 | 129 | 0 130 | 131 | 132 | 0 133 | 0 134 | 0 135 | 0 136 | 0 137 | 0 138 | 0 139 | 0 140 | 0 141 | 0 142 | 0 143 | 0 144 | 0 145 | 0 146 | 0 147 | 0 148 | 0 149 | 0 150 | 0 151 | 0 152 | 0 153 | 0 154 | 0 155 | 0 156 | 157 | 158 | 159 | 160 | 161 | 162 |
163 | -------------------------------------------------------------------------------- /bsp_skeleton/template.uvoptx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.0 5 | 6 |
### uVision Project, (C) Keil Software
7 | 8 | 9 | *.c 10 | *.s*; *.src; *.a* 11 | *.obj; *.o 12 | *.lib 13 | *.txt; *.h; *.inc 14 | *.plm 15 | *.cpp 16 | 0 17 | 18 | 19 | 20 | 0 21 | 0 22 | 23 | 24 | 25 | rtthread 26 | 0x4 27 | ARM-ADS 28 | 29 | 12000000 30 | 31 | 1 32 | 1 33 | 0 34 | 1 35 | 0 36 | 37 | 38 | 1 39 | 65535 40 | 0 41 | 0 42 | 0 43 | 44 | 45 | 79 46 | 66 47 | 8 48 | .\build\keil\List\ 49 | 50 | 51 | 1 52 | 1 53 | 1 54 | 0 55 | 1 56 | 1 57 | 0 58 | 1 59 | 0 60 | 0 61 | 0 62 | 0 63 | 64 | 65 | 1 66 | 1 67 | 1 68 | 1 69 | 1 70 | 1 71 | 1 72 | 0 73 | 0 74 | 75 | 76 | 0 77 | 0 78 | 1 79 | 80 | 18 81 | 82 | 0 83 | 1 84 | 1 85 | 1 86 | 1 87 | 1 88 | 1 89 | 1 90 | 1 91 | 1 92 | 1 93 | 1 94 | 1 95 | 1 96 | 0 97 | 1 98 | 1 99 | 1 100 | 1 101 | 0 102 | 0 103 | 1 104 | 0 105 | 0 106 | 4 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | Segger\JL2CM3.dll 118 | 119 | 120 | 121 | 0 122 | JL2CM3 123 | -U30000299 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) 124 | 125 | 126 | 0 127 | UL2CM3 128 | UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) 129 | 130 | 131 | 132 | 133 | 0 134 | 135 | 136 | 0 137 | 0 138 | 0 139 | 0 140 | 0 141 | 0 142 | 0 143 | 0 144 | 0 145 | 0 146 | 0 147 | 0 148 | 0 149 | 0 150 | 0 151 | 0 152 | 0 153 | 0 154 | 0 155 | 0 156 | 0 157 | 0 158 | 0 159 | 0 160 | 161 | 162 | 163 | 0 164 | 0 165 | 0 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 1 176 | 0 177 | 2 178 | 10000000 179 | 180 | 181 | 182 | 183 | 184 | Source Group 1 185 | 0 186 | 0 187 | 0 188 | 0 189 | 190 | 191 |
192 | -------------------------------------------------------------------------------- /bsp_skeleton/template.uvprojx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 2.1 5 | 6 |
### uVision Project, (C) Keil Software
7 | 8 | 9 | 10 | rtthread 11 | 0x4 12 | ARM-ADS 13 | 5060750::V5.06 update 6 (build 750)::ARMCC 14 | 0 15 | 16 | 17 | STM32F407ZGTx 18 | STMicroelectronics 19 | Keil.STM32F4xx_DFP.2.13.0 20 | http://www.keil.com/pack 21 | IRAM(0x20000000,0x20000) IRAM2(0x10000000,0x10000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE 22 | 23 | 24 | UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) 25 | 0 26 | $$Device:STM32F407ZGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | $$Device:STM32F407ZGTx$CMSIS\SVD\STM32F40x.svd 37 | 0 38 | 0 39 | 40 | 41 | 42 | 43 | 44 | 45 | 0 46 | 0 47 | 0 48 | 0 49 | 1 50 | 51 | .\build\keil\Obj\ 52 | rtthread 53 | 1 54 | 0 55 | 0 56 | 1 57 | 0 58 | .\build\keil\List\ 59 | 1 60 | 0 61 | 0 62 | 63 | 0 64 | 0 65 | 66 | 67 | 0 68 | 0 69 | 0 70 | 0 71 | 72 | 73 | 0 74 | 0 75 | 76 | 77 | 0 78 | 0 79 | 0 80 | 0 81 | 82 | 83 | 1 84 | 0 85 | fromelf --bin !L --output rtthread.bin 86 | 87 | 0 88 | 0 89 | 0 90 | 0 91 | 92 | 0 93 | 94 | 95 | 96 | 0 97 | 0 98 | 0 99 | 0 100 | 0 101 | 1 102 | 0 103 | 0 104 | 0 105 | 0 106 | 3 107 | 108 | 109 | 1 110 | 111 | 112 | SARMCM3.DLL 113 | -REMAP -MPU 114 | DCM.DLL 115 | -pCM4 116 | SARMCM3.DLL 117 | -MPU 118 | TCM.DLL 119 | -pCM4 120 | 121 | 122 | 123 | 1 124 | 0 125 | 0 126 | 0 127 | 16 128 | 129 | 130 | 131 | 132 | 1 133 | 0 134 | 0 135 | 1 136 | 1 137 | 4096 138 | 139 | 1 140 | BIN\UL2CM3.DLL 141 | "" () 142 | 143 | 144 | 145 | 146 | 0 147 | 148 | 149 | 150 | 0 151 | 1 152 | 1 153 | 1 154 | 1 155 | 1 156 | 1 157 | 1 158 | 0 159 | 1 160 | 1 161 | 0 162 | 1 163 | 1 164 | 0 165 | 0 166 | 1 167 | 1 168 | 1 169 | 1 170 | 1 171 | 1 172 | 1 173 | 1 174 | 1 175 | 0 176 | 0 177 | "Cortex-M4" 178 | 179 | 0 180 | 0 181 | 0 182 | 1 183 | 1 184 | 0 185 | 0 186 | 2 187 | 1 188 | 0 189 | 8 190 | 0 191 | 0 192 | 0 193 | 0 194 | 3 195 | 4 196 | 0 197 | 0 198 | 0 199 | 0 200 | 0 201 | 0 202 | 0 203 | 0 204 | 0 205 | 0 206 | 1 207 | 0 208 | 0 209 | 0 210 | 0 211 | 0 212 | 1 213 | 214 | 215 | 0 216 | 0x0 217 | 0x0 218 | 219 | 220 | 0 221 | 0x0 222 | 0x0 223 | 224 | 225 | 0 226 | 0x0 227 | 0x0 228 | 229 | 230 | 0 231 | 0x0 232 | 0x0 233 | 234 | 235 | 0 236 | 0x0 237 | 0x0 238 | 239 | 240 | 0 241 | 0x0 242 | 0x0 243 | 244 | 245 | 0 246 | 0x20000000 247 | 0x20000 248 | 249 | 250 | 1 251 | 0x8000000 252 | 0x100000 253 | 254 | 255 | 0 256 | 0x0 257 | 0x0 258 | 259 | 260 | 1 261 | 0x0 262 | 0x0 263 | 264 | 265 | 1 266 | 0x0 267 | 0x0 268 | 269 | 270 | 1 271 | 0x0 272 | 0x0 273 | 274 | 275 | 1 276 | 0x8000000 277 | 0x100000 278 | 279 | 280 | 1 281 | 0x0 282 | 0x0 283 | 284 | 285 | 0 286 | 0x0 287 | 0x0 288 | 289 | 290 | 0 291 | 0x0 292 | 0x0 293 | 294 | 295 | 0 296 | 0x0 297 | 0x0 298 | 299 | 300 | 0 301 | 0x20000000 302 | 0x20000 303 | 304 | 305 | 0 306 | 0x10000000 307 | 0x10000 308 | 309 | 310 | 311 | 312 | 313 | 1 314 | 1 315 | 0 316 | 0 317 | 1 318 | 0 319 | 0 320 | 0 321 | 0 322 | 0 323 | 2 324 | 0 325 | 0 326 | 1 327 | 0 328 | 0 329 | 1 330 | 1 331 | 1 332 | 1 333 | 0 334 | 0 335 | 0 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 1 345 | 0 346 | 0 347 | 0 348 | 0 349 | 0 350 | 0 351 | 0 352 | 0 353 | 0 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 0 363 | 0 364 | 0 365 | 0 366 | 1 367 | 0 368 | 0x08000000 369 | 0x20000000 370 | 371 | .\drivers\linker_scripts\link.sct 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | Source Group 1 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 |
395 | -------------------------------------------------------------------------------- /drivers/README.md: -------------------------------------------------------------------------------- 1 | # 驱动实现接口规范 2 | 3 | 本文档规定出RT-Thread下各个外设驱动的接口规范。驱动工程师可以根据本规范描述,实现对应的外设接口,从而对接到RT-Thread系统中。 4 | -------------------------------------------------------------------------------- /drivers/skeleton.md: -------------------------------------------------------------------------------- 1 | # 外设接口规范 2 | 3 | 标签: RT-Thread规范 文档模版 4 | 5 | --- 6 | 7 | > 文档面向专业的BSP驱动工程师,所以在文档中并不需要详细介绍外设工作原理,也不需要介绍太多上层应用使用方法; 8 | 9 | ## 外设 10 | 11 | > 外设的简单介绍; 12 | > 最简单的数据、控制交互逻辑是什么样的; 13 | 14 | ### 驱动需要实现的接口 15 | 16 | > 以驱动ops模式介绍外设驱动需要实现什么样的接口; 17 | > 对于接口中的配置、数据结构体需要进行详细的解释; 18 | 19 | ### RT-Thread Device接口 20 | 21 | > 如果要实现 `rt_device_*` 的接口,需要依次进行说明; 22 | 23 | ### 注意事项 24 | 25 | > 可以结合skeleton中的代码模版,说明相关的一些注意事项; 26 | -------------------------------------------------------------------------------- /git_pr.md: -------------------------------------------------------------------------------- 1 | # 向RT-Thread的Github仓库提交代码 2 | 3 | 标签: RT-Thread规范 4 | 5 | --- 6 | 7 | 在github上向RT-Thread的仓库提交代码,提交PR请遵循以下事项: 8 | 9 | * 不同的功能请分开来提交,不要把不相关的修改一次性都提交; 10 | * 提交时的message尽可能的使用英文描述,当然使用中文也问题不大; 11 | * 提交message分两部分,一个是message title,请以"[module] messsage"方式进行"[module]"部分,请填写正确的名称,可以参见以下的说明: 12 | 13 | | 前缀 | 说明 | 14 | | ---- | ---- | 15 | | [Kernel] | 内核或者"rt-thread/include"部分修改;| 16 | | [shell] | 命令行部分修改;| 17 | | [DFS] | 设备虚拟文件系统部分修改;| 18 | | [lwIP] | 网络协议栈部分修改;| 19 | | [DeviceDrivers] | 设备驱动框架部分修改;| 20 | | [Tools] | `rt-thread/tools`中相关修改;| 21 | | [examples] | `rt-thread/examples`例子的修改;| 22 | | [BSP][stm32f10x] | `rt-thread/bsp/stm32f10x` 移植包的修改;| 23 | 24 | * message内容主体,请尽可能详细描述为什么要做这样的修改,以及修改了什么; 25 | * PR的标题请简单说明这次提交PR的内容。 26 | 27 | ## PR提交代码重点注意事项 28 | 29 | * 请优先检查代码风格: 30 | - 移植的代码,请尽量保持原有代码,改动部分尽量少; 31 | - 和RT-Thread适配的代码,请遵循RT-Thread的代码风格; 32 | 33 | 以下代码是不妥的,会被拒绝合并到PR中: 34 | 35 | 1. 缩进不一致 36 | ```c 37 | void func(int parameter) 38 | { 39 | int a; 40 | 41 | if (parameter < 0) 42 | { 43 | /* ... */ 44 | } 45 | } 46 | ``` 47 | 48 | `if`语句和前面的缩进不一致; 49 | 50 | 2. 包含不必要的代码 51 | 52 | ```c 53 | void func(int parameter) 54 | { 55 | #if 0 56 | /* ... */ 57 | #endif 58 | 59 | #if 1 60 | /* ... */ 61 | #endif 62 | } 63 | ``` 64 | 65 | 代码中不管是`#if 0`还是`#if 1`,都不应该存在。提交上来的代码,都代表着这是一份正式的代码。 66 | 67 | ## 自己的git分支维护 68 | 69 | 向github项目提交PR的通常做法是: 70 | ![git pr][1] 71 | 72 | 从upstream主线总fork一份代码到自己的github仓库中。然后在自己的github仓库中进行修改,并进行提交(注意,**这里只能提交到自己的github仓库中,而upstream仓库一般并无直接提交修改的权限**)。当进行到一定时候,希望自己的修改能更新到upstream主干中,这个时候可以在github上发起一份PR(pull request),请求upstream的维护人合并这部分的修改。如果upstream维护人确认没问题,修改的补丁将自动合并到upstream主干中。 73 | 74 | 但有的时候,自己维护的git仓库可能会出现混乱。例如:当upstream仓库已经进行改动了,然后再把upstream的改动合并到自己的仓库,这样有可能出现冲突(例如修改了相同的一份文件)。当冲突解决时,再提PR到upstream时,可能会携带一系列的提交记录。 75 | 76 | 当要把自己的改动提PR到upstream去进行合并时,可能就会出现这样反复修改的记录。 77 | 78 | 一般比较好的做法是,保留master分支不动,在自己的仓库中另外创建一个分支,例如你自己的dev分支: 79 | 80 | # 创建一份dev分支,并切换过去 81 | git checkout -b dev 82 | 83 | 后续相关的修改都在你自己的分支上进行,而不牵涉到master分支。当需要合并到master分支时,先把upstream的最新更改合并到master分支上,然后再在master分支上做rebase,如下图所示。 84 | 85 | ![git pr2][2] 86 | 87 | 相关的一些git命令说明: 88 | 89 | ```sh 90 | # 先切换回master分支 91 | git checkout master 92 | 93 | # 抓取upstream更改,然后合并到本地master分支上 94 | git fetch upstream 95 | git merge upstream/master 96 | 97 | # 把dev分支的更改rebase合并到master分支上 98 | git rebase dev 99 | 100 | # 把本地更改提交到github上自己的分支 101 | git push origin 102 | ``` 103 | 104 | [1]: imgs/git_pr1.png 105 | [2]: imgs/git_pr2.png 106 | -------------------------------------------------------------------------------- /imgs/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /imgs/git_pr1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RT-Thread/rtthread-specification/aa44bd154f58fb50e4d70c4d1a1bc39444e348f6/imgs/git_pr1.png -------------------------------------------------------------------------------- /imgs/git_pr2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RT-Thread/rtthread-specification/aa44bd154f58fb50e4d70c4d1a1bc39444e348f6/imgs/git_pr2.png -------------------------------------------------------------------------------- /name-specification.md: -------------------------------------------------------------------------------- 1 | # 系统移植的文件夹、文件命名规范 2 | 3 | 标签: RT-Thread规范 4 | 5 | --- 6 | 7 | 针对配置相关的Kconfig文件,相关文件都命名为 `Kconfig` (注意大小写情况)。 8 | 9 | ## BSP文件夹 10 | 11 | 一个新的移植,默认会添加到`rt-thread/bsp`目录下,在进行bsp文件夹命名时,请以如下规则进行: 12 | 13 | MCU型号名称-BOARD名称 14 | 15 | 例如STM32的nucleo开发板BSP,如`NUCLEO-L476RG`,它使用的是64pin的STM32L476RG MCU,这个时候BSP可以命名为: 16 | 17 | `stm32l476-nucleo` 18 | 19 | 20 | 21 | ### BSP文件下的子文件夹名及文件名 22 | 23 | 对一份BSP,建议其下包含如下的子文件夹: 24 | 25 | | 目录名 | 说明 | 26 | | ------ | ---- | 27 | | applications | 放置用户入口,例如main.c,及用户应用;| 28 | | drivers | 放置板载驱动;| 29 | | libraries | 和MCU相关的固件库,一般由芯片厂商提供;| 30 | 31 | BSP文件夹下需要包含一份本BSP的说明README.md,至少包括: 32 | 33 | * BSP针对的MCU情况; 34 | * 开发板简介 35 | * 当要在这块开发板上使用RT-Thread时,相关的注意事项。<例如串口用法(波特率,哪个串口等),烧写,调试等> 36 | 37 | 可以参见BSP模版中的[README.md][1]情况。 38 | 39 | #### applications文件夹 40 | 41 | `bsp/applications` 文件夹下放置用户程序入口,包括: 42 | 43 | * main.c -- 用户程序主入口 44 | * mnt.c -- 文件系统装载表相关初始化; 45 | 46 | #### drivers文件夹 47 | 48 | `bsp/drivers` 文件夹下放置和板子相关的驱动(可能也包括一部分芯片外设驱动),文件命名风格请按照以下的方式: 49 | 50 | drv_*.c/.h 51 | 52 | 同时也存在板级初始化相关的文件,命名为 `board.c/.h`。 53 | 54 | ## libcpu文件夹 55 | 56 | libcpu文件夹主要是和芯片相关的移植部分,请按照`架构/芯片`的方式进行命名。 57 | 58 | [1]: bsp_skeleton/README.md 59 | -------------------------------------------------------------------------------- /package.md: -------------------------------------------------------------------------------- 1 | # package规范 2 | 3 | 一个package应该包含以下几个部分: 4 | 5 | * pkginfo,有关于这个包的介绍,配置等,需要提交、添加到 [RT-Thread/packages包索引仓库](https://github.com/RT-Thread/packages) 中。应该包括两个文件Kconfig,package.json 6 | * package本身的代码。 7 | 8 | 例如针对一个最简单的hello的package,这两部分分别是: 9 | 10 | * [pkginfo](https://github.com/RT-Thread/packages/tree/master/misc/hello) 11 | * [package代码](https://github.com/BernardXiong/hello/) 12 | 13 | ## pkginfo 14 | 15 | ### Kconfig 16 | 17 | 软件包的Kconfig主要由menuconfig(包括软件包管理器)进行使用,所以一些选项必须在Kconfig中定义出来: 18 | 19 | * 一个软件包(package)必须包含一个以`PKG_USING_`开头的配置项,这样RT-Thread的包管理器才能正确识别这个是一个软件包; 20 | * 假设这个包的名称叫做SOFTA,那么软件包总选项应该是`PKG_USING_SOFTA`,如果被定义,那么代表这个软件包被加入到系统中; 21 | * 和这个SOFTA软件包相关的其他选项,需要以`SOFTA_`开头的配置项进行定义,可以是`SOFTA_USING_A`或者`SOFTA_ENABLE_A`等的方式。 22 | * 针对软件包是放于git仓库的包,可以使用`latest`代表最终的`master`最新版。但支持`latest`方式,必须也加入某个固定版本,以防止在某个时候找不到合适的版本。 23 | 24 | ### package.json 25 | 26 | package.json是package软件包的描述信息文件,包括例如软件包名称,软件包描述,作者等信息,以及必须的package代码下载链接。另外,请务必包含许可证的说明,使用了哪种许可证(GPLv2,LGPLv2.1,MIT,Apache license v2.0,BSD等)。 27 | 28 | 一个简单的package.json如下: 29 | ```json 30 | { 31 | "name": "EasyLogger", 32 | "description": "A ultra-lightweight(ROM<1.6K, RAM<0.3k), high-performance C/C++ log library", 33 | "keywords": [ 34 | "logger", "C", "high-performance", "lightweight", "C/C++" 35 | ], 36 | "readme": "A ultra-lightweight(ROM<1.6K, RAM<0.3k), high-performance C/C++ log library. More information on https://github.com/armink/EasyLogger", 37 | "author": { 38 | "name": "armink", 39 | "email": "armink.ztl@gmail.com" 40 | }, 41 | "repository": "https://github.com/armink-rtt-pkgs/EasyLogger", 42 | "site" : [ 43 | {"version": "v2.0.0", "URL": "https://github.com/armink-rtt-pkgs/EasyLogger/archive/2.0.0.zip", "filename": "EasyLogger-2.0.0.zip"}, 44 | {"version": "latest", "URL": "https://github.com/armink-rtt-pkgs/EasyLogger.git", "filename": "EasyLogger.zip", "VER_SHA": "master" } 45 | ] 46 | } 47 | ``` 48 | 49 | ## package 50 | 51 | 一个package代码应该由以下部分组成: 52 | 53 | * 根目录下的README.md文件,以说明这个package用于什么; 54 | * 根目录下的docs文件夹,包括一份使用说明; 55 | * 根目录下的SConscript文件,用于和RT-Thread环境一起进行编译; 56 | * 根目录下的examples文件夹,用于提供一份使用的例子; 57 | * package软件包的其他代码; 58 | * 如果需要加入submodule,则可以直接在这个根目录下添加。 59 | -------------------------------------------------------------------------------- /porting/README.md: -------------------------------------------------------------------------------- 1 | # RT-Thread芯片架构移植规范 2 | 3 | ## 1. 启动文件 4 | 5 | ## 2. 切换上下文 6 | 7 | ## 3. 中断相关处理 8 | 9 | ### 3.1 关闭/打开中断 10 | 11 | ### 3.2 中断处理 12 | 13 | ### 3.3 OS时钟中断 14 | 15 | ## 4. 串口驱动 16 | -------------------------------------------------------------------------------- /smp_skeleton/.config: -------------------------------------------------------------------------------- 1 | # 2 | # Automatically generated file; DO NOT EDIT. 3 | # RT-Thread Project Configuration 4 | # 5 | 6 | # 7 | # RT-Thread Kernel 8 | # 9 | CONFIG_RT_NAME_MAX=8 10 | CONFIG_RT_USING_SMP=y 11 | CONFIG_RT_CPUS_NR=2 12 | CONFIG_RT_ALIGN_SIZE=4 13 | # CONFIG_RT_THREAD_PRIORITY_8 is not set 14 | CONFIG_RT_THREAD_PRIORITY_32=y 15 | # CONFIG_RT_THREAD_PRIORITY_256 is not set 16 | CONFIG_RT_THREAD_PRIORITY_MAX=32 17 | CONFIG_RT_TICK_PER_SECOND=100 18 | CONFIG_RT_USING_OVERFLOW_CHECK=y 19 | CONFIG_RT_USING_HOOK=y 20 | CONFIG_RT_USING_IDLE_HOOK=y 21 | CONFIG_RT_IDEL_HOOK_LIST_SIZE=4 22 | CONFIG_IDLE_THREAD_STACK_SIZE=256 23 | # CONFIG_RT_USING_TIMER_SOFT is not set 24 | CONFIG_RT_DEBUG=y 25 | # CONFIG_RT_DEBUG_INIT_CONFIG is not set 26 | # CONFIG_RT_DEBUG_THREAD_CONFIG is not set 27 | # CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set 28 | # CONFIG_RT_DEBUG_IPC_CONFIG is not set 29 | # CONFIG_RT_DEBUG_TIMER_CONFIG is not set 30 | # CONFIG_RT_DEBUG_IRQ_CONFIG is not set 31 | # CONFIG_RT_DEBUG_MEM_CONFIG is not set 32 | # CONFIG_RT_DEBUG_SLAB_CONFIG is not set 33 | # CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set 34 | # CONFIG_RT_DEBUG_MODULE_CONFIG is not set 35 | 36 | # 37 | # Inter-Thread communication 38 | # 39 | CONFIG_RT_USING_SEMAPHORE=y 40 | CONFIG_RT_USING_MUTEX=y 41 | CONFIG_RT_USING_EVENT=y 42 | CONFIG_RT_USING_MAILBOX=y 43 | CONFIG_RT_USING_MESSAGEQUEUE=y 44 | # CONFIG_RT_USING_SIGNALS is not set 45 | 46 | # 47 | # Memory Management 48 | # 49 | CONFIG_RT_USING_MEMPOOL=y 50 | # CONFIG_RT_USING_MEMHEAP is not set 51 | # CONFIG_RT_USING_NOHEAP is not set 52 | CONFIG_RT_USING_SMALL_MEM=y 53 | # CONFIG_RT_USING_SLAB is not set 54 | # CONFIG_RT_USING_MEMTRACE is not set 55 | CONFIG_RT_USING_HEAP=y 56 | 57 | # 58 | # Kernel Device Object 59 | # 60 | CONFIG_RT_USING_DEVICE=y 61 | # CONFIG_RT_USING_DEVICE_OPS is not set 62 | # CONFIG_RT_USING_INTERRUPT_INFO is not set 63 | CONFIG_RT_USING_CONSOLE=y 64 | CONFIG_RT_CONSOLEBUF_SIZE=128 65 | CONFIG_RT_CONSOLE_DEVICE_NAME="uart" 66 | CONFIG_RT_VER_NUM=0x40000 67 | CONFIG_ARCH_ARM=y 68 | CONFIG_ARCH_ARM_CORTEX_A=y 69 | CONFIG_ARCH_ARM_CORTEX_A9=y 70 | # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set 71 | 72 | # 73 | # RT-Thread Components 74 | # 75 | CONFIG_RT_USING_COMPONENTS_INIT=y 76 | CONFIG_RT_USING_USER_MAIN=y 77 | CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 78 | CONFIG_RT_MAIN_THREAD_PRIORITY=10 79 | 80 | # 81 | # C++ features 82 | # 83 | # CONFIG_RT_USING_CPLUSPLUS is not set 84 | 85 | # 86 | # Command shell 87 | # 88 | CONFIG_RT_USING_FINSH=y 89 | CONFIG_FINSH_THREAD_NAME="tshell" 90 | CONFIG_FINSH_USING_HISTORY=y 91 | CONFIG_FINSH_HISTORY_LINES=5 92 | CONFIG_FINSH_USING_SYMTAB=y 93 | CONFIG_FINSH_USING_DESCRIPTION=y 94 | # CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set 95 | CONFIG_FINSH_THREAD_PRIORITY=20 96 | CONFIG_FINSH_THREAD_STACK_SIZE=4096 97 | CONFIG_FINSH_CMD_SIZE=80 98 | # CONFIG_FINSH_USING_AUTH is not set 99 | CONFIG_FINSH_USING_MSH=y 100 | CONFIG_FINSH_USING_MSH_DEFAULT=y 101 | # CONFIG_FINSH_USING_MSH_ONLY is not set 102 | CONFIG_FINSH_ARG_MAX=10 103 | 104 | # 105 | # Device virtual file system 106 | # 107 | CONFIG_RT_USING_DFS=y 108 | CONFIG_DFS_USING_WORKDIR=y 109 | CONFIG_DFS_FILESYSTEMS_MAX=2 110 | CONFIG_DFS_FILESYSTEM_TYPES_MAX=2 111 | CONFIG_DFS_FD_MAX=16 112 | # CONFIG_RT_USING_DFS_MNTTABLE is not set 113 | # CONFIG_RT_USING_DFS_ELMFAT is not set 114 | CONFIG_RT_USING_DFS_DEVFS=y 115 | # CONFIG_RT_USING_DFS_ROMFS is not set 116 | # CONFIG_RT_USING_DFS_RAMFS is not set 117 | # CONFIG_RT_USING_DFS_UFFS is not set 118 | # CONFIG_RT_USING_DFS_JFFS2 is not set 119 | 120 | # 121 | # Device Drivers 122 | # 123 | CONFIG_RT_USING_DEVICE_IPC=y 124 | CONFIG_RT_PIPE_BUFSZ=512 125 | CONFIG_RT_USING_SERIAL=y 126 | CONFIG_RT_SERIAL_USING_DMA=y 127 | # CONFIG_RT_USING_CAN is not set 128 | # CONFIG_RT_USING_HWTIMER is not set 129 | # CONFIG_RT_USING_CPUTIME is not set 130 | # CONFIG_RT_USING_I2C is not set 131 | CONFIG_RT_USING_PIN=y 132 | # CONFIG_RT_USING_ADC is not set 133 | # CONFIG_RT_USING_PWM is not set 134 | # CONFIG_RT_USING_MTD_NOR is not set 135 | # CONFIG_RT_USING_MTD_NAND is not set 136 | # CONFIG_RT_USING_MTD is not set 137 | # CONFIG_RT_USING_PM is not set 138 | # CONFIG_RT_USING_RTC is not set 139 | # CONFIG_RT_USING_SDIO is not set 140 | # CONFIG_RT_USING_SPI is not set 141 | # CONFIG_RT_USING_WDT is not set 142 | # CONFIG_RT_USING_AUDIO is not set 143 | 144 | # 145 | # Using WiFi 146 | # 147 | # CONFIG_RT_USING_WIFI is not set 148 | 149 | # 150 | # Using USB 151 | # 152 | # CONFIG_RT_USING_USB_HOST is not set 153 | # CONFIG_RT_USING_USB_DEVICE is not set 154 | 155 | # 156 | # POSIX layer and C standard library 157 | # 158 | CONFIG_RT_USING_LIBC=y 159 | # CONFIG_RT_USING_PTHREADS is not set 160 | CONFIG_RT_USING_POSIX=y 161 | # CONFIG_RT_USING_POSIX_MMAP is not set 162 | # CONFIG_RT_USING_POSIX_TERMIOS is not set 163 | # CONFIG_RT_USING_POSIX_AIO is not set 164 | # CONFIG_RT_USING_MODULE is not set 165 | 166 | # 167 | # Network 168 | # 169 | 170 | # 171 | # Socket abstraction layer 172 | # 173 | # CONFIG_RT_USING_SAL is not set 174 | 175 | # 176 | # light weight TCP/IP stack 177 | # 178 | # CONFIG_RT_USING_LWIP is not set 179 | 180 | # 181 | # Modbus master and slave stack 182 | # 183 | # CONFIG_RT_USING_MODBUS is not set 184 | 185 | # 186 | # AT commands 187 | # 188 | # CONFIG_RT_USING_AT is not set 189 | 190 | # 191 | # VBUS(Virtual Software BUS) 192 | # 193 | # CONFIG_RT_USING_VBUS is not set 194 | 195 | # 196 | # Utilities 197 | # 198 | # CONFIG_RT_USING_LOGTRACE is not set 199 | # CONFIG_RT_USING_RYM is not set 200 | # CONFIG_RT_USING_ULOG is not set 201 | # CONFIG_RT_USING_LWP is not set 202 | 203 | # 204 | # RT-Thread online packages 205 | # 206 | 207 | # 208 | # IoT - internet of things 209 | # 210 | # CONFIG_PKG_USING_PAHOMQTT is not set 211 | # CONFIG_PKG_USING_WEBCLIENT is not set 212 | # CONFIG_PKG_USING_WEBNET is not set 213 | # CONFIG_PKG_USING_MONGOOSE is not set 214 | # CONFIG_PKG_USING_WEBTERMINAL is not set 215 | # CONFIG_PKG_USING_CJSON is not set 216 | # CONFIG_PKG_USING_JSMN is not set 217 | # CONFIG_PKG_USING_LJSON is not set 218 | # CONFIG_PKG_USING_EZXML is not set 219 | # CONFIG_PKG_USING_NANOPB is not set 220 | 221 | # 222 | # Wi-Fi 223 | # 224 | 225 | # 226 | # Marvell WiFi 227 | # 228 | # CONFIG_PKG_USING_WLANMARVELL is not set 229 | 230 | # 231 | # Wiced WiFi 232 | # 233 | # CONFIG_PKG_USING_WLAN_WICED is not set 234 | # CONFIG_PKG_USING_COAP is not set 235 | # CONFIG_PKG_USING_NOPOLL is not set 236 | # CONFIG_PKG_USING_NETUTILS is not set 237 | # CONFIG_PKG_USING_AT_DEVICE is not set 238 | # CONFIG_PKG_USING_WIZNET is not set 239 | 240 | # 241 | # IoT Cloud 242 | # 243 | # CONFIG_PKG_USING_ONENET is not set 244 | # CONFIG_PKG_USING_GAGENT_CLOUD is not set 245 | # CONFIG_PKG_USING_ALI_IOTKIT is not set 246 | # CONFIG_PKG_USING_AZURE is not set 247 | # CONFIG_PKG_USING_TENCENT_IOTKIT is not set 248 | 249 | # 250 | # security packages 251 | # 252 | # CONFIG_PKG_USING_MBEDTLS is not set 253 | # CONFIG_PKG_USING_libsodium is not set 254 | # CONFIG_PKG_USING_TINYCRYPT is not set 255 | 256 | # 257 | # language packages 258 | # 259 | # CONFIG_PKG_USING_LUA is not set 260 | # CONFIG_PKG_USING_JERRYSCRIPT is not set 261 | # CONFIG_PKG_USING_MICROPYTHON is not set 262 | 263 | # 264 | # multimedia packages 265 | # 266 | # CONFIG_PKG_USING_OPENMV is not set 267 | # CONFIG_PKG_USING_MUPDF is not set 268 | 269 | # 270 | # tools packages 271 | # 272 | # CONFIG_PKG_USING_CMBACKTRACE is not set 273 | # CONFIG_PKG_USING_EASYFLASH is not set 274 | # CONFIG_PKG_USING_EASYLOGGER is not set 275 | # CONFIG_PKG_USING_SYSTEMVIEW is not set 276 | # CONFIG_PKG_USING_RDB is not set 277 | # CONFIG_PKG_USING_QRCODE is not set 278 | # CONFIG_PKG_USING_ULOG_EASYFLASH is not set 279 | 280 | # 281 | # system packages 282 | # 283 | # CONFIG_PKG_USING_GUIENGINE is not set 284 | # CONFIG_PKG_USING_PERSIMMON is not set 285 | # CONFIG_PKG_USING_CAIRO is not set 286 | # CONFIG_PKG_USING_PIXMAN is not set 287 | # CONFIG_PKG_USING_LWEXT4 is not set 288 | # CONFIG_PKG_USING_PARTITION is not set 289 | # CONFIG_PKG_USING_FAL is not set 290 | # CONFIG_PKG_USING_SQLITE is not set 291 | # CONFIG_PKG_USING_RTI is not set 292 | # CONFIG_PKG_USING_LITTLEVGL2RTT is not set 293 | # CONFIG_PKG_USING_CMSIS is not set 294 | # CONFIG_PKG_USING_DFS_YAFFS is not set 295 | # CONFIG_PKG_USING_LITTLEFS is not set 296 | 297 | # 298 | # peripheral libraries and drivers 299 | # 300 | # CONFIG_PKG_USING_REALTEK_AMEBA is not set 301 | # CONFIG_PKG_USING_SHT2X is not set 302 | # CONFIG_PKG_USING_AHT10 is not set 303 | # CONFIG_PKG_USING_AP3216C is not set 304 | # CONFIG_PKG_USING_STM32_SDIO is not set 305 | # CONFIG_PKG_USING_ICM20608 is not set 306 | # CONFIG_PKG_USING_U8G2 is not set 307 | # CONFIG_PKG_USING_BUTTON is not set 308 | # CONFIG_PKG_USING_MPU6XXX is not set 309 | # CONFIG_PKG_USING_PCF8574 is not set 310 | # CONFIG_PKG_USING_KENDRYTE_SDK is not set 311 | 312 | # 313 | # miscellaneous packages 314 | # 315 | # CONFIG_PKG_USING_LIBCSV is not set 316 | # CONFIG_PKG_USING_OPTPARSE is not set 317 | # CONFIG_PKG_USING_FASTLZ is not set 318 | # CONFIG_PKG_USING_MINILZO is not set 319 | # CONFIG_PKG_USING_QUICKLZ is not set 320 | # CONFIG_PKG_USING_MULTIBUTTON is not set 321 | # CONFIG_PKG_USING_CANFESTIVAL is not set 322 | # CONFIG_PKG_USING_ZLIB is not set 323 | # CONFIG_PKG_USING_DSTR is not set 324 | # CONFIG_PKG_USING_TINYFRAME is not set 325 | 326 | # 327 | # samples: kernel and components samples 328 | # 329 | # CONFIG_PKG_USING_KERNEL_SAMPLES is not set 330 | # CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set 331 | # CONFIG_PKG_USING_NETWORK_SAMPLES is not set 332 | # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set 333 | # CONFIG_PKG_USING_HELLO is not set 334 | 335 | # 336 | # Privated Packages of RealThread 337 | # 338 | # CONFIG_PKG_USING_CODEC is not set 339 | # CONFIG_PKG_USING_PLAYER is not set 340 | # CONFIG_PKG_USING_PERSIMMON_SRC is not set 341 | # CONFIG_PKG_USING_JS_PERSIMMON is not set 342 | # CONFIG_PKG_USING_JERRYSCRIPT_WIN32 is not set 343 | 344 | # 345 | # Network Utilities 346 | # 347 | # CONFIG_PKG_USING_WICED is not set 348 | # CONFIG_PKG_USING_CLOUDSDK is not set 349 | # CONFIG_PKG_USING_COREMARK is not set 350 | # CONFIG_PKG_USING_POWER_MANAGER is not set 351 | # CONFIG_PKG_USING_RT_OTA is not set 352 | # CONFIG_PKG_USING_RDBD_SRC is not set 353 | # CONFIG_PKG_USING_RTINSIGHT is not set 354 | # CONFIG_PKG_USING_SMARTCONFIG is not set 355 | # CONFIG_PKG_USING_RTX is not set 356 | CONFIG_BOARD_SKELETON=y 357 | 358 | # 359 | # Hardware Drivers Config 360 | # 361 | 362 | # 363 | # On-chip Peripheral Drivers 364 | # 365 | CONFIG_BSP_USING_UART1=y 366 | # CONFIG_BSP_USING_UART2 is not set 367 | # CONFIG_BSP_USING_SPI1 is not set 368 | # CONFIG_BSP_USING_SPI2 is not set 369 | # CONFIG_BSP_USING_I2C1 is not set 370 | 371 | # 372 | # Onboard Peripheral Drivers 373 | # 374 | 375 | # 376 | # Offboard Peripheral Drivers 377 | # 378 | -------------------------------------------------------------------------------- /smp_skeleton/Kconfig: -------------------------------------------------------------------------------- 1 | mainmenu "RT-Thread Project Configuration" 2 | 3 | config BSP_DIR 4 | string 5 | option env="BSP_ROOT" 6 | default "." 7 | 8 | config RTT_DIR 9 | string 10 | option env="RTT_ROOT" 11 | default "../.." 12 | 13 | config PKGS_DIR 14 | string 15 | option env="PKGS_ROOT" 16 | default "packages" 17 | 18 | source "$RTT_DIR/Kconfig" 19 | source "$PKGS_DIR/Kconfig" 20 | 21 | config BOARD_SKELETON 22 | bool 23 | select ARCH_ARM_CORTEX_A9 24 | select RT_USING_SMP 25 | default y 26 | 27 | source "$BSP_DIR/driver/Kconfig" 28 | -------------------------------------------------------------------------------- /smp_skeleton/README.md: -------------------------------------------------------------------------------- 1 | # skeleton板级支持包 2 | 3 | 标签: 文档模版 4 | 5 | --- 6 | 7 | ## 1. 简介 8 | 9 | [说明硬件平台的基本情况,包括芯片情况,频率,RAM空间,Flash空间等,最好也提供一份照片图] 10 | 11 | skeleton芯片 是 cc 公司的一款面向 nn 等领域的芯片。包括如下硬件特性: 12 | 13 | | 硬件 | 描述 | 14 | | -- | -- | 15 | |芯片型号| XXX或XX系列 | 16 | |CPU| ARM Cortex-A9 | 17 | |主频| 1GHz | 18 | |片内SRAM| 1GB | 19 | |片内Flash| 8MB | 20 | 21 | ## 2. 编译说明 22 | 23 | [说明测试的编译器版本,或env版本情况] 24 | 25 | 推荐使用[env工具][1],可以在console下进入到`bsp/skeleton`目录中,运行以下命令: 26 | 27 | `scons` 28 | 29 | 来编译这个板级支持包。如果编译正确无误,会产生rtthread.elf、rtthread.bin文件。其中rtthread.bin需要烧写到设备中进行运行。 30 | 31 | ## 3. 烧写及执行 32 | 33 | [需要说明电源连接情况,串口连接情况] 34 | 35 | 连接好串口,可以使用115200-N-8-1的配置方式连接到设备上。设备使用的串口引脚是:`[PA1/PA2]` 36 | 37 | 当正确编译产生出rtthread.bin映像文件后,可以使用...的方式来烧写到设备中。 38 | 39 | ### 3.1 运行结果 40 | 41 | 如果编译 & 烧写无误,当复位设备后,会在串口上看到RT-Thread的启动logo信息: 42 | 43 | ## 4. 驱动支持情况及计划 44 | 45 | | 驱动 | 支持情况 | 备注 | 46 | | ------ | ---- | :------: | 47 | | UART | 支持 | UART0/1 | 48 | | clock | 支持 | | 49 | | SPI | | SPI0/1,预计在2018/Q2支持 | 50 | 51 | ### 4.1 IO在板级支持包中的映射情况 52 | 53 | | IO号 | 板级包中的定义 | 54 | | -- | -- | 55 | | PA1 | LED1 | 56 | 57 | ## 5. 联系人信息 58 | 59 | 维护人:xxx < abc@name.com > 60 | 61 | ## 6. 参考 62 | 63 | * 板子[数据手册][2] 64 | * 芯片[数据手册][3] 65 | 66 | [1]: https://www.rt-thread.org/page/download.html 67 | [2]: http://abc.com/datasheet.pdf 68 | [3]: http://abc.com/um.pdf 69 | -------------------------------------------------------------------------------- /smp_skeleton/SConscript: -------------------------------------------------------------------------------- 1 | # for module compiling 2 | import os 3 | from building import * 4 | 5 | cwd = GetCurrentDir() 6 | objs = [] 7 | list = os.listdir(cwd) 8 | 9 | for d in list: 10 | path = os.path.join(cwd, d) 11 | if os.path.isfile(os.path.join(path, 'SConscript')): 12 | objs = objs + SConscript(os.path.join(d, 'SConscript')) 13 | 14 | Return('objs') 15 | -------------------------------------------------------------------------------- /smp_skeleton/SConstruct: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import rtconfig 4 | 5 | if os.getenv('RTT_ROOT'): 6 | RTT_ROOT = os.getenv('RTT_ROOT') 7 | else: 8 | RTT_ROOT = os.path.normpath(os.getcwd() + '/../..') 9 | 10 | sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] 11 | try: 12 | from building import * 13 | except: 14 | print('Cannot found RT-Thread root directory, please check RTT_ROOT') 15 | print(RTT_ROOT) 16 | exit(-1) 17 | 18 | TARGET = 'rtthread.' + rtconfig.TARGET_EXT 19 | 20 | env = Environment(tools = ['mingw'], 21 | AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, 22 | CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, 23 | CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, 24 | AR = rtconfig.AR, ARFLAGS = '-rc', 25 | LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) 26 | env.PrependENVPath('PATH', rtconfig.EXEC_PATH) 27 | 28 | Export('RTT_ROOT') 29 | Export('rtconfig') 30 | 31 | # prepare building environment 32 | objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=True) 33 | 34 | # make a building 35 | DoBuilding(TARGET, objs) 36 | -------------------------------------------------------------------------------- /smp_skeleton/applications/SConscript: -------------------------------------------------------------------------------- 1 | from building import * 2 | 3 | cwd = GetCurrentDir() 4 | src = Glob('*.c') + Glob('*.cpp') 5 | CPPPATH = [cwd] 6 | 7 | group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) 8 | 9 | Return('group') 10 | -------------------------------------------------------------------------------- /smp_skeleton/applications/main.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | int main(int argc, char** argv) 14 | { 15 | printf("Hello RT-Thread!\n"); 16 | 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /smp_skeleton/applications/mnt.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | 12 | int mnt_init(void) 13 | { 14 | return 0; 15 | } 16 | -------------------------------------------------------------------------------- /smp_skeleton/driver/Kconfig: -------------------------------------------------------------------------------- 1 | menu "Hardware Drivers Config" 2 | 3 | menu "On-chip Peripheral Drivers" 4 | 5 | config BSP_USING_UART1 6 | bool "Enable UART1" 7 | select RT_USING_SERIAL 8 | default y 9 | 10 | config BSP_USING_UART2 11 | bool "Enable UART2" 12 | select RT_USING_SERIAL 13 | default n 14 | 15 | config BSP_USING_SPI1 16 | bool "Enable SPI1 BUS" 17 | select RT_USING_SPI 18 | default n 19 | 20 | config BSP_USING_SPI2 21 | bool "Enable SPI2 BUS" 22 | select RT_USING_SPI 23 | default n 24 | 25 | menuconfig BSP_USING_I2C1 26 | bool "Enable I2C1 BUS" 27 | default n 28 | select RT_USING_I2C 29 | 30 | endmenu 31 | 32 | menu "Onboard Peripheral Drivers" 33 | 34 | endmenu 35 | 36 | menu "Offboard Peripheral Drivers" 37 | 38 | endmenu 39 | 40 | endmenu 41 | -------------------------------------------------------------------------------- /smp_skeleton/driver/SConscript: -------------------------------------------------------------------------------- 1 | # RT-Thread building script for component 2 | 3 | from building import * 4 | 5 | cwd = GetCurrentDir() 6 | src = Split(''' 7 | board.c 8 | drv_uart.c 9 | ''') 10 | 11 | CPPPATH = [cwd] 12 | 13 | if GetDepend('RT_USING_ADC'): 14 | src += ['drv_adc.c'] 15 | 16 | if GetDepend('RT_USING_CPUTIME'): 17 | src += ['drv_cputime.c'] 18 | 19 | if GetDepend('RT_USING_LWIP'): 20 | src += ['drv_emac.c'] 21 | 22 | if GetDepend('RT_USING_PIN'): 23 | src += ['drv_gpio.c'] 24 | 25 | if GetDepend('RT_USING_HWTIMER'): 26 | src += ['drv_hwtimer.c'] 27 | 28 | if GetDepend('RT_USING_I2C'): 29 | src += ['drv_i2c.c'] 30 | 31 | if GetDepend('PKG_USING_GUIENGINE'): 32 | src += ['drv_lcd.c'] 33 | 34 | if GetDepend('RT_USING_PWM'): 35 | src += ['drv_pwm.c'] 36 | 37 | if GetDepend('RT_USING_RTC'): 38 | src += ['drv_rtc.c'] 39 | 40 | if GetDepend('RT_USING_SDIO'): 41 | src += ['drv_sdio.c'] 42 | 43 | if GetDepend('RT_USING_SPI'): 44 | src += ['drv_spi.c'] 45 | 46 | if GetDepend('RT_USING_WDT'): 47 | src += ['drv_wdt.c'] 48 | 49 | if GetDepend(['RT_USING_WIFI']): 50 | src += ['drv_wlan.c'] 51 | 52 | group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH) 53 | 54 | Return('group') 55 | -------------------------------------------------------------------------------- /smp_skeleton/driver/board.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | #include "board.h" 14 | 15 | extern void idle_wfi(void); 16 | extern void rt_hw_ipi_handler_install(int ipi_vector, rt_isr_handler_t ipi_isr_handler); 17 | 18 | void rt_hw_timer_isr(int vector, void *param) 19 | { 20 | rt_tick_increase(); 21 | 22 | /*todo: clear interrupt */ 23 | } 24 | 25 | int rt_hw_timer_init(void) 26 | { 27 | /*todo: timer hw init*/ 28 | 29 | /*todo: install timer interrupt 30 | rt_hw_interrupt_install(TIMER_CPU0, rt_hw_timer_isr, RT_NULL, "tick"); 31 | rt_hw_interrupt_umask(IRQ_TIMER_CPU0); 32 | */ 33 | 34 | return 0; 35 | } 36 | INIT_BOARD_EXPORT(rt_hw_timer_init); 37 | 38 | /** 39 | * This function will initialize beaglebone board 40 | */ 41 | void rt_hw_board_init(void) 42 | { 43 | /*initialize hardware interrupt */ 44 | rt_hw_interrupt_init(); 45 | 46 | /* initialize system heap */ 47 | rt_system_heap_init(HEAP_BEGIN, HEAP_END); 48 | 49 | rt_components_board_init(); 50 | rt_console_set_device(RT_CONSOLE_DEVICE_NAME); 51 | 52 | rt_thread_idle_sethook(idle_wfi); 53 | 54 | #ifdef RT_USING_SMP 55 | /* install IPI handle */ 56 | rt_hw_ipi_handler_install(RT_SCHEDULE_IPI, rt_scheduler_ipi_handler); 57 | #endif 58 | } 59 | -------------------------------------------------------------------------------- /smp_skeleton/driver/board.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef __BOARD_H__ 11 | #define __BOARD_H__ 12 | 13 | #if defined(__CC_ARM) 14 | extern int Image$$RW_IRAM1$$ZI$$Limit; 15 | #define HEAP_BEGIN ((void*)&Image$$RW_IRAM1$$ZI$$Limit) 16 | #elif defined(__GNUC__) 17 | extern int __bss_end; 18 | #define HEAP_BEGIN ((void*)&__bss_end) 19 | #endif 20 | 21 | #define HEAP_END (void*)(0x60000000 + 8 * 1024 * 1024) 22 | 23 | void rt_hw_board_init(void); 24 | 25 | #endif 26 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_adc.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "board.h" 13 | #include "drv_adc.h" 14 | 15 | #define SKT_ADC_DEVICE(adc_dev) (struct skt_adc_dev *)(adc_dev) 16 | 17 | struct skt_adc_dev 18 | { 19 | struct rt_adc_device parent; 20 | rt_uint32_t adc_periph; 21 | rt_uint32_t channel; 22 | }; 23 | 24 | static rt_err_t skt_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled) 25 | { 26 | rt_err_t ret = RT_EOK; 27 | struct skt_adc_dev *adc = SKT_ADC_DEVICE(device); 28 | 29 | RT_ASSERT(adc != RT_NULL); 30 | 31 | if (enabled) 32 | { 33 | /* Todo: enable adc->adc_periph */ 34 | } 35 | else 36 | { 37 | /* Todo: disable adc->adc_periph */ 38 | } 39 | return ret; 40 | } 41 | static rt_err_t skt_adc_convert(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value) 42 | { 43 | rt_err_t ret = RT_EOK; 44 | struct skt_adc_dev *adc = SKT_ADC_DEVICE(device); 45 | 46 | RT_ASSERT(adc != RT_NULL); 47 | 48 | /* Todo: convert adc->adc_periph */ 49 | 50 | return ret; 51 | } 52 | 53 | const static struct rt_adc_ops skt_adc_ops = 54 | { 55 | skt_adc_enabled, 56 | skt_adc_convert 57 | }; 58 | 59 | int rt_hw_adc_init(void) 60 | { 61 | rt_err_t ret = RT_EOK; 62 | static struct skt_adc_dev adc_dev0; 63 | 64 | /* Todo: Init adc Hardware */ 65 | 66 | ret = rt_hw_adc_register(&adc_dev0.parent, "adc0", &skt_adc_ops, &adc_dev0); 67 | 68 | return ret; 69 | } 70 | INIT_DEVICE_EXPORT(rt_hw_adc_init); 71 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_adc.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_ADC_H__ 11 | #define DRV_ADC_H__ 12 | 13 | int rt_hw_adc_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_cputime.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | #include "drv_cputime.h" 14 | #include 15 | 16 | static float skt_cputime_getres(void) 17 | { 18 | return 0; 19 | } 20 | 21 | static uint32_t skt_cputime_gettime(void) 22 | { 23 | return 0; 24 | } 25 | 26 | const static struct rt_clock_cputime_ops skt_cputime_ops = 27 | { 28 | skt_cputime_getres, 29 | skt_cputime_gettime 30 | }; 31 | 32 | int rt_hw_cputime_init(void) 33 | { 34 | clock_cpu_setops(&skt_cputime_ops); 35 | 36 | return 0; 37 | } 38 | INIT_BOARD_EXPORT(rt_hw_cputime_init); 39 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_cputime.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_CPUTIME_H__ 11 | #define DRV_CPUTIME_H__ 12 | 13 | int rt_hw_cputime_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_emac.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | #include 14 | 15 | #include 16 | #include "drv_emac.h" 17 | 18 | #define MAX_ADDR_LEN 6 19 | #define SKT_EMAC_DEVICE(eth) (struct skt_emac_dev*)(eth) 20 | 21 | struct skt_emac_dev 22 | { 23 | struct eth_device parent; 24 | 25 | rt_uint8_t dev_addr[MAX_ADDR_LEN]; /* MAC address */ 26 | }; 27 | 28 | static rt_err_t skt_emac_init(rt_device_t dev) 29 | { 30 | rt_err_t ret = RT_EOK; 31 | struct skt_emac_dev *emac = SKT_EMAC_DEVICE(dev); 32 | 33 | RT_ASSERT(emac != RT_NULL); 34 | 35 | /* Todo:init emac */ 36 | return ret; 37 | } 38 | 39 | static rt_err_t skt_emac_open(rt_device_t dev, rt_uint16_t oflag) 40 | { 41 | rt_err_t ret = RT_EOK; 42 | struct skt_emac_dev *emac = SKT_EMAC_DEVICE(dev); 43 | 44 | RT_ASSERT(emac != RT_NULL); 45 | 46 | /* Todo:enable emac */ 47 | return ret; 48 | } 49 | 50 | static rt_err_t skt_emac_close(rt_device_t dev) 51 | { 52 | rt_err_t ret = RT_EOK; 53 | struct skt_emac_dev *emac = SKT_EMAC_DEVICE(dev); 54 | 55 | RT_ASSERT(emac != RT_NULL); 56 | 57 | /* Todo:close emac */ 58 | return ret; 59 | } 60 | 61 | static rt_err_t skt_emac_control(rt_device_t dev, int cmd, void *args) 62 | { 63 | rt_err_t ret = RT_EOK; 64 | struct skt_emac_dev *emac = SKT_EMAC_DEVICE(dev); 65 | 66 | RT_ASSERT(emac != RT_NULL); 67 | 68 | switch (cmd) 69 | { 70 | case NIOCTL_GADDR: 71 | /* get MAC address */ 72 | if (args) 73 | { 74 | rt_memcpy(args, emac->dev_addr, 6); 75 | } 76 | else 77 | { 78 | ret = -RT_ERROR; 79 | } 80 | break; 81 | 82 | default : 83 | break; 84 | } 85 | 86 | return ret; 87 | } 88 | 89 | /* Ethernet device interface */ 90 | /* transmit packet */ 91 | static rt_err_t skt_emac_tx(rt_device_t dev, struct pbuf *p) 92 | { 93 | rt_err_t ret = RT_EOK; 94 | struct skt_emac_dev *emac = SKT_EMAC_DEVICE(dev); 95 | 96 | RT_ASSERT(emac != RT_NULL); 97 | 98 | /* copy pbuf to a whole ETH frame */ 99 | /* pbuf_copy_partial(p, eth_frame, p->tot_len, 0); */ 100 | 101 | /* send it out */ 102 | 103 | return ret; 104 | } 105 | 106 | /* reception packet */ 107 | static struct pbuf *skt_emac_rx(rt_device_t dev) 108 | { 109 | struct pbuf *p = RT_NULL; 110 | struct skt_emac_dev *emac = SKT_EMAC_DEVICE(dev); 111 | 112 | RT_ASSERT(emac != RT_NULL); 113 | 114 | /* take the emac buffer to the pbuf */ 115 | { 116 | int length = 0; 117 | 118 | /* get frame length */ 119 | 120 | /* allocate pbuf */ 121 | p = pbuf_alloc(PBUF_LINK, length, PBUF_RAM); 122 | if (p) 123 | { 124 | /* pbuf_take(p, buffer, length); */ 125 | } 126 | } 127 | 128 | return p; 129 | } 130 | 131 | #ifdef RT_USING_DEVICE_OPS 132 | const static struct rt_device_ops skt_emac_ops = 133 | { 134 | skt_emac_init, 135 | skt_emac_open, 136 | skt_emac_close, 137 | RT_NULL, 138 | RT_NULL, 139 | skt_emac_control 140 | }; 141 | #endif 142 | 143 | int rt_hw_emac_init(void) 144 | { 145 | rt_err_t ret = RT_EOK; 146 | static struct skt_emac_dev emac_dev; 147 | /* test MAC address */ 148 | emac_dev.dev_addr[0] = 0x00; 149 | emac_dev.dev_addr[1] = 0x11; 150 | emac_dev.dev_addr[2] = 0x22; 151 | emac_dev.dev_addr[3] = 0x33; 152 | emac_dev.dev_addr[4] = 0x44; 153 | emac_dev.dev_addr[5] = 0x55; 154 | 155 | #ifdef RT_USING_DEVICE_OPS 156 | emac_dev.parent.parent.ops = &skt_emac_ops; 157 | #else 158 | emac_dev.parent.parent.init = skt_emac_init; 159 | emac_dev.parent.parent.open = skt_emac_open; 160 | emac_dev.parent.parent.close = skt_emac_close; 161 | emac_dev.parent.parent.read = RT_NULL; 162 | emac_dev.parent.parent.write = RT_NULL; 163 | emac_dev.parent.parent.control = skt_emac_control; 164 | #endif 165 | 166 | emac_dev.parent.parent.user_data = RT_NULL; 167 | emac_dev.parent.eth_rx = skt_emac_rx; 168 | emac_dev.parent.eth_tx = skt_emac_tx; 169 | 170 | /* register ETH device */ 171 | ret = eth_device_init(&(emac_dev.parent), "e0"); 172 | 173 | return ret; 174 | } 175 | INIT_DEVICE_EXPORT(rt_hw_emac_init); 176 | 177 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_emac.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_EMAC_H__ 11 | #define DRV_EMAC_H__ 12 | 13 | int rt_hw_emac_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_gpio.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | #include "drv_gpio.h" 14 | 15 | static void skt_pin_mode(struct rt_device *device, rt_base_t pin, rt_base_t mode) 16 | { 17 | /* Todo:set pin mode */ 18 | } 19 | 20 | static void skt_pin_write(struct rt_device *device, rt_base_t pin, rt_base_t value) 21 | { 22 | /* Todo:set pin low or high */ 23 | } 24 | 25 | static int skt_pin_read(struct rt_device *device, rt_base_t pin) 26 | { 27 | /* Todo:get pin status and return status value */ 28 | return 0; 29 | } 30 | 31 | static rt_err_t skt_pin_attach_irq(struct rt_device *device, rt_int32_t pin, 32 | rt_uint32_t mode, void (*hdr)(void *args), void *args) 33 | { 34 | rt_err_t ret = RT_EOK; 35 | 36 | /* Todo:attach hdr to pin ISR */ 37 | 38 | return ret; 39 | } 40 | 41 | static rt_err_t skt_pin_detach_irq(struct rt_device *device, rt_int32_t pin) 42 | { 43 | rt_err_t ret = RT_EOK; 44 | 45 | /* Todo:detach hdr from pin ISR */ 46 | 47 | return ret; 48 | } 49 | 50 | static rt_err_t skt_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled) 51 | { 52 | rt_err_t ret = RT_EOK; 53 | 54 | /* Todo:enable pin ISR */ 55 | 56 | return ret; 57 | } 58 | 59 | const static struct rt_pin_ops skt_pin_ops = 60 | { 61 | skt_pin_mode, 62 | skt_pin_write, 63 | skt_pin_read, 64 | 65 | skt_pin_attach_irq, 66 | skt_pin_detach_irq, 67 | skt_pin_irq_enable 68 | }; 69 | 70 | int rt_hw_pin_init(void) 71 | { 72 | rt_err_t ret = RT_EOK; 73 | 74 | ret = rt_device_pin_register("pin", &skt_pin_ops, RT_NULL); 75 | 76 | return ret; 77 | } 78 | INIT_BOARD_EXPORT(rt_hw_pin_init); 79 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_gpio.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_GPIO_H__ 11 | #define DRV_GPIO_H__ 12 | 13 | int rt_hw_pin_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_hwtimer.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include 13 | #include "drv_hwtimer.h" 14 | 15 | #define SKT_HWTIMER_DEVICE(hwtimer) (struct skt_hwtimer_dev *)(hwtimer) 16 | 17 | struct skt_hwtimer_dev 18 | { 19 | rt_hwtimer_t parent; 20 | rt_uint32_t hwtimer_periph; 21 | rt_uint32_t irqno; 22 | }; 23 | 24 | void skt_hwtimer_isr(int irqno, void *param) 25 | { 26 | struct skt_hwtimer_dev *hwtimer = SKT_HWTIMER_DEVICE(param); 27 | 28 | RT_ASSERT(hwtimer != RT_NULL); 29 | 30 | rt_device_hwtimer_isr(&hwtimer->parent); 31 | } 32 | 33 | static rt_err_t skt_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) 34 | { 35 | rt_err_t ret = RT_EOK; 36 | struct skt_hwtimer_dev *hwtimer = SKT_HWTIMER_DEVICE(timer->parent.user_data); 37 | 38 | RT_ASSERT(hwtimer != RT_NULL); 39 | 40 | switch (cmd) 41 | { 42 | case HWTIMER_CTRL_FREQ_SET: 43 | 44 | /* Todo:set the count frequency */ 45 | break; 46 | 47 | case HWTIMER_CTRL_STOP: 48 | 49 | /* Todo:stop timer */ 50 | break; 51 | 52 | case HWTIMER_CTRL_INFO_GET: 53 | 54 | /* Todo:get a timer feature information */ 55 | break; 56 | 57 | case HWTIMER_CTRL_MODE_SET: 58 | 59 | /* Todo:Set the timing mode(oneshot/period) */ 60 | break; 61 | default: 62 | 63 | break; 64 | } 65 | return ret; 66 | } 67 | 68 | static rt_uint32_t skt_hwtimer_count_get(rt_hwtimer_t *timer) 69 | { 70 | struct skt_hwtimer_dev *hwtimer = SKT_HWTIMER_DEVICE(timer->parent.user_data); 71 | 72 | RT_ASSERT(hwtimer != RT_NULL); 73 | 74 | /* Todo: get hwtimer(hwtimer->hwtimer_periph) counter value*/ 75 | return 0; 76 | } 77 | 78 | static void skt_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) 79 | { 80 | struct skt_hwtimer_dev *hwtimer = SKT_HWTIMER_DEVICE(timer->parent.user_data); 81 | 82 | RT_ASSERT(hwtimer != RT_NULL); 83 | 84 | /* Todo:init hwtimer(hwtimer->hwtimer_periph)*/ 85 | } 86 | 87 | static rt_err_t skt_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) 88 | { 89 | rt_err_t ret = RT_EOK; 90 | struct skt_hwtimer_dev *hwtimer = SKT_HWTIMER_DEVICE(timer->parent.user_data); 91 | 92 | RT_ASSERT(hwtimer != RT_NULL); 93 | 94 | /* Todo:start hwtimer(hwtimer->hwtimer_periph)*/ 95 | 96 | /* install interrupt */ 97 | /* 98 | rt_hw_interrupt_install(hwtimer->irqno, skt_hwtimer_isr, 99 | hwtimer, hwtimer->parent.parent.parent.name); 100 | */ 101 | /* Enable Interrupt */ 102 | /* rt_hw_interrupt_umask(hwtimer->irqno);*/ 103 | 104 | return ret; 105 | } 106 | 107 | static void skt_hwtimer_stop(rt_hwtimer_t *timer) 108 | { 109 | struct skt_hwtimer_dev *hwtimer = SKT_HWTIMER_DEVICE(timer->parent.user_data); 110 | 111 | RT_ASSERT(hwtimer != RT_NULL); 112 | 113 | /* Todo:stop hwtimer(hwtimer->hwtimer_periph)*/ 114 | } 115 | 116 | const static struct rt_hwtimer_ops hwtimer_ops = 117 | { 118 | skt_hwtimer_init, 119 | skt_hwtimer_start, 120 | skt_hwtimer_stop, 121 | skt_hwtimer_count_get, 122 | skt_hwtimer_control 123 | }; 124 | 125 | const static struct rt_hwtimer_info hwtimer_info = 126 | { 127 | 25000000, /* the maximum count frequency can be set */ 128 | 6103, /* the minimum count frequency can be set */ 129 | 0xFFFFFFFF, /* counter maximum value */ 130 | HWTIMER_CNTMODE_UP, /* count mode (inc/dec) */ 131 | }; 132 | 133 | int rt_hw_hwtimer_init(void) 134 | { 135 | rt_err_t ret = RT_EOK; 136 | static struct skt_hwtimer_dev hwtimer0; 137 | hwtimer0.parent.info = &hwtimer_info; 138 | hwtimer0.parent.ops = &hwtimer_ops; 139 | 140 | ret = rt_device_hwtimer_register(&hwtimer0.parent, "timer0", &hwtimer0); 141 | 142 | return ret; 143 | } 144 | INIT_DEVICE_EXPORT(rt_hw_hwtimer_init); 145 | 146 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_hwtimer.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_HWTIMER_H__ 11 | #define DRV_HWTIMER_H__ 12 | 13 | int rt_hw_hwtimer_init(void); 14 | 15 | #endif 16 | 17 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_i2c.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "drv_i2c.h" 13 | 14 | #define SKT_I2C_DEVICE(i2c_bus) (struct skt_i2c_bus *)(i2c_bus) 15 | 16 | struct skt_i2c_bus 17 | { 18 | struct rt_i2c_bus_device parent; 19 | rt_uint32_t i2c_periph; 20 | }; 21 | 22 | static rt_size_t skt_i2c_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num) 23 | { 24 | struct skt_i2c_bus *i2c_bus = SKT_I2C_DEVICE(bus); 25 | 26 | RT_ASSERT(i2c_bus != RT_NULL); 27 | 28 | /* Todo: transfer msgs[] via I2C hardware(bus->i2c_periph) */ 29 | return 0; 30 | } 31 | 32 | const static struct rt_i2c_bus_device_ops skt_i2c_ops = 33 | { 34 | skt_i2c_xfer, 35 | RT_NULL, 36 | RT_NULL 37 | }; 38 | 39 | int rt_hw_i2c_init(void) 40 | { 41 | rt_err_t ret = RT_EOK; 42 | static struct skt_i2c_bus i2c_bus0; 43 | 44 | i2c_bus0.parent.ops = &skt_i2c_ops; 45 | 46 | /* Todo: Init I2C Hardware */ 47 | 48 | ret = rt_i2c_bus_device_register(&i2c_bus0.parent, "i2c0"); 49 | 50 | return ret; 51 | } 52 | INIT_DEVICE_EXPORT(rt_hw_i2c_init); 53 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_i2c.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_I2C_H__ 11 | #define DRV_I2C_H__ 12 | 13 | int rt_hw_i2c_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_i2s.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_i2s.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_I2S_H__ 11 | #define DRV_I2S_H__ 12 | 13 | 14 | #endif 15 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_lcd.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "drv_lcd.h" 13 | 14 | static rt_err_t skt_lcd_init(rt_device_t dev) 15 | { 16 | rt_err_t ret = RT_EOK; 17 | 18 | RT_ASSERT(dev != RT_NULL); 19 | 20 | /* Todo: init LCD */ 21 | 22 | return ret; 23 | } 24 | 25 | static rt_err_t skt_lcd_open(rt_device_t dev, rt_uint16_t oflag) 26 | { 27 | rt_err_t ret = RT_EOK; 28 | 29 | RT_ASSERT(dev != RT_NULL); 30 | 31 | /* Todo: enable LCD */ 32 | 33 | return ret; 34 | } 35 | 36 | static rt_err_t skt_lcd_close(rt_device_t dev) 37 | { 38 | rt_err_t ret = RT_EOK; 39 | 40 | RT_ASSERT(dev != RT_NULL); 41 | 42 | /* Todo: close LCD */ 43 | 44 | return ret; 45 | } 46 | 47 | static rt_size_t skt_lcd_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) 48 | { 49 | RT_ASSERT(dev != RT_NULL); 50 | 51 | /* Todo: read LCD */ 52 | 53 | return 0; 54 | } 55 | 56 | static rt_size_t skt_lcd_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) 57 | { 58 | RT_ASSERT(dev != RT_NULL); 59 | 60 | /* Todo: write LCD */ 61 | return 0; 62 | } 63 | 64 | static rt_err_t skt_lcd_control(rt_device_t dev, int cmd, void *args) 65 | { 66 | rt_err_t ret = RT_EOK; 67 | 68 | RT_ASSERT(dev != RT_NULL); 69 | 70 | switch (cmd) 71 | { 72 | case RTGRAPHIC_CTRL_RECT_UPDATE: 73 | 74 | /* Todo: update LCD data */ 75 | break; 76 | 77 | case RTGRAPHIC_CTRL_POWERON: 78 | /* Todo: power on */ 79 | break; 80 | 81 | case RTGRAPHIC_CTRL_POWEROFF: 82 | /* Todo: power off */ 83 | break; 84 | 85 | case RTGRAPHIC_CTRL_GET_INFO: 86 | /* Todo: get lcd_info and store to args*/ 87 | break; 88 | 89 | case RTGRAPHIC_CTRL_SET_MODE: 90 | 91 | break; 92 | default: 93 | break; 94 | } 95 | 96 | return ret; 97 | } 98 | 99 | #ifdef RT_USING_DEVICE_OPS 100 | const static struct rt_device_ops skt_lcd_ops = 101 | { 102 | skt_lcd_init, 103 | skt_lcd_open, 104 | skt_lcd_close, 105 | skt_lcd_read, 106 | skt_lcd_write, 107 | skt_lcd_control 108 | }; 109 | #endif 110 | 111 | int rt_hw_lcd_init(void) 112 | { 113 | rt_err_t ret = RT_EOK; 114 | static struct rt_device_graphic_info lcd_info; 115 | static struct rt_device lcd_dev; 116 | 117 | /* Todo: Init lcd_info */ 118 | 119 | lcd_dev.type = RT_Device_Class_Graphic; 120 | lcd_dev.rx_indicate = RT_NULL; 121 | lcd_dev.tx_complete = RT_NULL; 122 | 123 | #ifdef RT_USING_DEVICE_OPS 124 | lcd_dev.ops = &skt_lcd_ops; 125 | #else 126 | lcd_dev.init = skt_lcd_init; 127 | lcd_dev.open = skt_lcd_open; 128 | lcd_dev.close = skt_lcd_close; 129 | lcd_dev.read = skt_lcd_read; 130 | lcd_dev.write = skt_lcd_write; 131 | lcd_dev.control = skt_lcd_control; 132 | #endif 133 | 134 | lcd_dev.user_data = (void *)&lcd_info; 135 | 136 | ret = rt_device_register(&lcd_dev, "lcd", RT_DEVICE_FLAG_RDWR); 137 | 138 | return ret; 139 | } 140 | INIT_DEVICE_EXPORT(rt_hw_lcd_init); 141 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_lcd.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_LCD_H__ 11 | #define DRV_LCD_H__ 12 | 13 | int rt_hw_lcd_init(void); 14 | #endif 15 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_pwm.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "drv_pwm.h" 13 | 14 | #define SKT_PWM_DEVICE(pwm) (struct skt_pwm_dev *)(pwm) 15 | 16 | struct skt_pwm_dev 17 | { 18 | struct rt_device_pwm parent; 19 | rt_uint32_t pwm_periph; 20 | }; 21 | 22 | static rt_err_t skt_pwm_enable(void *user_data, struct rt_pwm_configuration *cfg, rt_bool_t enable) 23 | { 24 | rt_err_t ret = RT_EOK; 25 | 26 | /* start/stop pwm_x chanel_x output */ 27 | return ret; 28 | } 29 | 30 | static rt_err_t skt_pwm_get(void *user_data, struct rt_pwm_configuration *cfg) 31 | { 32 | rt_err_t ret = RT_EOK; 33 | 34 | /* get pluse ,period ... */ 35 | return ret; 36 | } 37 | static rt_err_t skt_pwm_set(void *user_data, struct rt_pwm_configuration *cfg) 38 | { 39 | rt_err_t ret = RT_EOK; 40 | 41 | /* set pluse ,period ... */ 42 | return ret; 43 | } 44 | 45 | static rt_err_t skt_pwm_control(struct rt_device_pwm *device, int cmd, void *arg) 46 | { 47 | rt_err_t ret = RT_EOK; 48 | struct skt_pwm_dev *pwm = SKT_PWM_DEVICE(device->parent.user_data); 49 | struct rt_pwm_configuration *cfg = (struct rt_pwm_configuration *)arg; 50 | 51 | RT_ASSERT(pwm != RT_NULL); 52 | 53 | switch (cmd) 54 | { 55 | case PWM_CMD_ENABLE: 56 | 57 | ret = skt_pwm_enable((void *)pwm->pwm_periph, cfg, RT_TRUE); 58 | break; 59 | case PWM_CMD_DISABLE: 60 | 61 | ret = skt_pwm_enable((void *)pwm->pwm_periph, cfg, RT_FALSE); 62 | break; 63 | case PWM_CMD_SET: 64 | 65 | ret = skt_pwm_set((void *)pwm->pwm_periph, cfg); 66 | break; 67 | case PWM_CMD_GET: 68 | 69 | ret = skt_pwm_get((void *)pwm->pwm_periph, cfg); 70 | break; 71 | default: 72 | ret = RT_EINVAL; 73 | break; 74 | } 75 | 76 | return ret; 77 | } 78 | 79 | const static struct rt_pwm_ops skt_pwm_ops = 80 | { 81 | skt_pwm_control 82 | }; 83 | 84 | int rt_hw_pwm_init(void) 85 | { 86 | rt_err_t ret = RT_EOK; 87 | static struct skt_pwm_dev pwm_dev0; 88 | 89 | /* Todo: Init PWM Hardware */ 90 | 91 | ret = rt_device_pwm_register(&pwm_dev0.parent, "pwm0", &skt_pwm_ops, &pwm_dev0); 92 | 93 | return ret; 94 | } 95 | INIT_DEVICE_EXPORT(rt_hw_pwm_init); 96 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_pwm.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_PWM_H__ 11 | #define DRV_PWM_H__ 12 | 13 | int rt_hw_pwm_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_rtc.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include "drv_rtc.h" 13 | 14 | static rt_err_t skt_rtc_init(rt_device_t dev) 15 | { 16 | rt_err_t ret = RT_EOK; 17 | 18 | RT_ASSERT(dev != RT_NULL); 19 | 20 | /* Todo: init RTC */ 21 | 22 | return ret; 23 | } 24 | 25 | static rt_err_t skt_rtc_open(rt_device_t dev, rt_uint16_t oflag) 26 | { 27 | rt_err_t ret = RT_EOK; 28 | RT_ASSERT(dev != RT_NULL); 29 | 30 | /* Todo:enable RTC Hardware */ 31 | return ret; 32 | } 33 | 34 | static rt_err_t skt_rtc_close(rt_device_t dev) 35 | { 36 | rt_err_t ret = RT_EOK; 37 | 38 | RT_ASSERT(dev != RT_NULL); 39 | 40 | /* Todo: close RTC */ 41 | 42 | return ret; 43 | } 44 | 45 | static rt_size_t skt_rtc_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) 46 | { 47 | RT_ASSERT(dev != RT_NULL); 48 | 49 | /* Todo:get RTC time */ 50 | return 0; 51 | } 52 | static rt_size_t skt_rtc_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) 53 | { 54 | RT_ASSERT(dev != RT_NULL); 55 | 56 | /* Todo:set RTC time */ 57 | return 0; 58 | } 59 | static rt_err_t skt_rtc_control(rt_device_t dev, int cmd, void *args) 60 | { 61 | rt_err_t ret = RT_EOK; 62 | 63 | RT_ASSERT(dev != RT_NULL); 64 | 65 | /* Todo:control RTC */ 66 | return ret; 67 | } 68 | 69 | #ifdef RT_USING_DEVICE_OPS 70 | const static struct rt_device_ops skt_rtc_ops = 71 | { 72 | skt_rtc_init, 73 | skt_rtc_open, 74 | skt_rtc_close, 75 | skt_rtc_read, 76 | skt_rtc_write, 77 | skt_rtc_control 78 | }; 79 | #endif 80 | 81 | int rt_hw_rtc_init(void) 82 | { 83 | rt_err_t ret = RT_EOK; 84 | static struct rt_device rtc_dev; 85 | 86 | rtc_dev.type = RT_Device_Class_RTC; 87 | rtc_dev.rx_indicate = RT_NULL; 88 | rtc_dev.tx_complete = RT_NULL; 89 | 90 | #ifdef RT_USING_DEVICE_OPS 91 | lcd_dev.ops = &skt_lcd_ops; 92 | #else 93 | rtc_dev.init = skt_rtc_init; 94 | rtc_dev.open = skt_rtc_open; 95 | rtc_dev.close = skt_rtc_close; 96 | rtc_dev.read = skt_rtc_read; 97 | rtc_dev.write = skt_rtc_write; 98 | rtc_dev.control = skt_rtc_control; 99 | #endif 100 | 101 | rtc_dev.user_data = RT_NULL; 102 | 103 | ret = rt_device_register(&rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR); 104 | 105 | return ret; 106 | } 107 | INIT_DEVICE_EXPORT(rt_hw_rtc_init); 108 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_rtc.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_RTC_H__ 11 | #define DRV_RTC_H__ 12 | 13 | int rt_hw_rtc_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_sdio.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | #include "drv_sdio.h" 14 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_sdio.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_SDIO_H__ 11 | #define DRV_SDIO_H__ 12 | 13 | #endif 14 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_spi.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | #include "drv_spi.h" 14 | 15 | #define SKT_SPI_DEVICE(spi_bus) (struct skt_spi_bus *)(spi_bus) 16 | 17 | struct skt_spi_bus 18 | { 19 | struct rt_spi_bus parent; 20 | rt_uint32_t spi_periph; 21 | }; 22 | 23 | static rt_err_t skt_spi_configure(struct rt_spi_device *device, 24 | struct rt_spi_configuration *configuration) 25 | { 26 | rt_err_t ret = RT_EOK; 27 | struct skt_spi_bus *bus = SKT_SPI_DEVICE(device->bus); 28 | 29 | RT_ASSERT(bus != RT_NULL); 30 | 31 | /* Todo:according to (configuration) set (bus->spi_periph) data_width, prescale, mode. */ 32 | 33 | /* Todo:enable SPI (bus->spi_periph) */ 34 | 35 | return ret; 36 | } 37 | 38 | static rt_uint32_t skt_spi_xfer(struct rt_spi_device *device, struct rt_spi_message *message) 39 | { 40 | struct skt_spi_bus *bus = SKT_SPI_DEVICE(device->bus); 41 | struct rt_spi_configuration *cfg = &device->config; 42 | rt_base_t cs_pin = (rt_base_t)device->parent.user_data; 43 | 44 | RT_ASSERT(bus != RT_NULL); 45 | 46 | (void)cs_pin; 47 | (void)cfg; 48 | /* Todo: transfer message via SPI Hardware(bus->spi_periph) */ 49 | 50 | return 0; 51 | } 52 | 53 | const static struct rt_spi_ops skt_spi_ops = 54 | { 55 | skt_spi_configure, 56 | skt_spi_xfer 57 | }; 58 | 59 | int rt_hw_spi_init(void) 60 | { 61 | rt_err_t ret = RT_EOK; 62 | static struct skt_spi_bus spi_bus0; 63 | 64 | /* Todo: Init SPI Hardware */ 65 | 66 | ret = rt_spi_bus_register(&spi_bus0.parent, "spi0", &skt_spi_ops); 67 | 68 | return ret; 69 | } 70 | INIT_DEVICE_EXPORT(rt_hw_spi_init); 71 | 72 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_spi.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_SPI_H__ 11 | #define DRV_SPI_H__ 12 | 13 | int rt_hw_spi_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_uart.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include 13 | 14 | #include "board.h" 15 | #include "drv_uart.h" 16 | 17 | #define SKT_UART_DEVICE(uart) (struct skt_uart_dev *)(uart) 18 | 19 | struct skt_uart_dev 20 | { 21 | struct rt_serial_device parent; 22 | rt_uint32_t uart_periph; 23 | rt_uint32_t irqno; 24 | }; 25 | 26 | void skt_uart_isr(int irqno, void *param) 27 | { 28 | struct skt_uart_dev *uart = SKT_UART_DEVICE(param); 29 | 30 | RT_ASSERT(uart != RT_NULL); 31 | 32 | /* read interrupt status and clear it */ 33 | if (0) /* rx ind */ 34 | { 35 | rt_hw_serial_isr(&uart->parent, RT_SERIAL_EVENT_RX_IND); 36 | } 37 | 38 | if (0) /* tx done */ 39 | { 40 | rt_hw_serial_isr(&uart->parent, RT_SERIAL_EVENT_TX_DONE); 41 | } 42 | } 43 | 44 | /* 45 | * UART interface 46 | */ 47 | static rt_err_t skt_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg) 48 | { 49 | rt_err_t ret = RT_EOK; 50 | struct skt_uart_dev *uart; 51 | 52 | RT_ASSERT(serial != RT_NULL); 53 | 54 | serial->config = *cfg; 55 | 56 | uart = SKT_UART_DEVICE(serial->parent.user_data); 57 | RT_ASSERT(uart != RT_NULL); 58 | 59 | /* Init UART Hardware(uart->uart_periph) */ 60 | 61 | /* Enable UART clock */ 62 | 63 | /* Set both receiver and transmitter in UART mode (not SIR) */ 64 | 65 | /* according to (cfg) set databits, baudrate, stopbits and parity. (8-bit data, 1 stopbit, no parity) */ 66 | 67 | return ret; 68 | } 69 | 70 | static rt_err_t skt_uart_control(struct rt_serial_device *serial, int cmd, void *arg) 71 | { 72 | rt_err_t ret = RT_EOK; 73 | struct skt_uart_dev *uart = SKT_UART_DEVICE(serial->parent.user_data); 74 | 75 | RT_ASSERT(uart != RT_NULL); 76 | 77 | rt_ubase_t ctrl_arg = (rt_ubase_t)arg; 78 | 79 | switch (cmd) 80 | { 81 | case RT_DEVICE_CTRL_CLR_INT: 82 | /* Disable the UART Interrupt */ 83 | /* rt_hw_interrupt_mask(uart->irqno); */ 84 | break; 85 | 86 | case RT_DEVICE_CTRL_SET_INT: 87 | /* install interrupt */ 88 | /* 89 | rt_hw_interrupt_install(uart->irqno, skt_uart_isr, 90 | serial, serial->parent.parent.name); 91 | */ 92 | /* Enable the UART Interrupt */ 93 | /* rt_hw_interrupt_umask(uart->irqno);*/ 94 | 95 | break; 96 | 97 | case RT_DEVICE_CTRL_CONFIG: 98 | if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX) 99 | { 100 | /* Todo: DMA configuration */ 101 | } 102 | break; 103 | } 104 | 105 | return ret; 106 | } 107 | 108 | static int skt_uart_putc(struct rt_serial_device *serial, char c) 109 | { 110 | struct skt_uart_dev *uart = SKT_UART_DEVICE(serial->parent.user_data); 111 | 112 | RT_ASSERT(uart != RT_NULL); 113 | 114 | /* FIFO status, contain valid data */ 115 | 116 | /* Todo:write data (ch) to (uart->uart_periph) */ 117 | 118 | return 1; 119 | } 120 | 121 | static int skt_uart_getc(struct rt_serial_device *serial) 122 | { 123 | int ch; 124 | struct skt_uart_dev *uart = SKT_UART_DEVICE(serial->parent.user_data); 125 | 126 | RT_ASSERT(uart != RT_NULL); 127 | 128 | ch = -1; 129 | 130 | /* Todo:receive data from (uart->uart_periph) and store it in (ch) */ 131 | 132 | return ch; 133 | } 134 | 135 | static rt_size_t skt_uart_dma_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction) 136 | { 137 | struct skt_uart_dev *uart = SKT_UART_DEVICE(serial->parent.user_data); 138 | 139 | RT_ASSERT(uart != RT_NULL); 140 | 141 | return 0; 142 | } 143 | 144 | const static struct rt_uart_ops _uart_ops = 145 | { 146 | skt_uart_configure, 147 | skt_uart_control, 148 | skt_uart_putc, 149 | skt_uart_getc, 150 | skt_uart_dma_transmit 151 | }; 152 | 153 | /* 154 | * UART Initiation 155 | */ 156 | int rt_hw_uart_init(void) 157 | { 158 | rt_err_t ret = RT_EOK; 159 | static struct skt_uart_dev uart0_dev; 160 | struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; 161 | 162 | uart0_dev.parent.ops = &_uart_ops; 163 | uart0_dev.parent.config = config; 164 | 165 | /* Todo: Init uart0_dev other data */ 166 | 167 | /* Todo: Init uart0 hardware */ 168 | 169 | ret = rt_hw_serial_register(&uart0_dev.parent, 170 | "uart0", 171 | RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, 172 | &uart0_dev); 173 | 174 | return ret; 175 | } 176 | INIT_DEVICE_EXPORT(rt_hw_uart_init); 177 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_uart.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_UART_H__ 11 | #define DRV_UART_H__ 12 | 13 | int rt_hw_uart_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_usbd.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_usbh.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_wdt.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | #include "drv_wdt.h" 14 | 15 | static rt_err_t skt_wdt_init(rt_watchdog_t *wdt) 16 | { 17 | rt_err_t ret = RT_EOK; 18 | 19 | /* Todo: init watchdog */ 20 | return ret; 21 | } 22 | 23 | static rt_err_t skt_wdt_control(rt_watchdog_t *wdt, int cmd, void *arg) 24 | { 25 | rt_err_t ret = RT_EOK; 26 | 27 | switch (cmd) 28 | { 29 | case RT_DEVICE_CTRL_WDT_SET_TIMEOUT: 30 | 31 | /* Todo:set wdt timeout value */ 32 | break; 33 | case RT_DEVICE_CTRL_WDT_START: 34 | 35 | /* Todo:enable wdt */ 36 | break; 37 | case RT_DEVICE_CTRL_WDT_STOP: 38 | 39 | /* Todo:stop wdt */ 40 | break; 41 | 42 | case RT_DEVICE_CTRL_WDT_KEEPALIVE: 43 | 44 | /* Todo:refresh wdt */ 45 | break; 46 | default: 47 | 48 | break; 49 | } 50 | 51 | return ret; 52 | } 53 | 54 | const static struct rt_watchdog_ops skt_wdt_ops = 55 | { 56 | skt_wdt_init, 57 | skt_wdt_control 58 | }; 59 | 60 | int rt_hw_wdt_init(void) 61 | { 62 | rt_err_t ret = RT_EOK; 63 | static struct rt_watchdog_device wdt_dev; 64 | 65 | wdt_dev.ops = &skt_wdt_ops; 66 | 67 | ret = rt_hw_watchdog_register(&wdt_dev, "wdt", RT_DEVICE_FLAG_STANDALONE, RT_NULL); 68 | 69 | return ret; 70 | } 71 | INIT_DEVICE_EXPORT(rt_hw_wdt_init); 72 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_wdt.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_WDT_H__ 11 | #define DRV_WDT_H__ 12 | 13 | int rt_hw_wdt_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /smp_skeleton/driver/drv_wlan.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef DRV_WLAN_H__ 11 | #define DRV_WLAN_H__ 12 | 13 | int rt_hw_wlan_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /smp_skeleton/libcpu/SConscript: -------------------------------------------------------------------------------- 1 | Import('rtconfig') 2 | from building import * 3 | 4 | cwd = GetCurrentDir() 5 | src = Glob('*.c') 6 | CPPPATH = [cwd] 7 | 8 | if rtconfig.PLATFORM == 'iar': 9 | src += Glob('*_iar.S') 10 | elif rtconfig.PLATFORM == 'gcc': 11 | src += Glob('*_gcc.S') 12 | elif rtconfig.PLATFORM == 'armcc': 13 | src += Glob('*_rvds.S') 14 | 15 | group = DefineGroup('CPU', src, depend = [''], CPPPATH = CPPPATH) 16 | 17 | Return('group') 18 | -------------------------------------------------------------------------------- /smp_skeleton/libcpu/context_gcc.S: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include "rtconfig.h" 11 | .section .text, "ax" 12 | 13 | #ifdef RT_USING_SMP 14 | #define rt_hw_interrupt_disable rt_hw_local_irq_disable 15 | #define rt_hw_interrupt_enable rt_hw_local_irq_enable 16 | #endif 17 | 18 | /* 19 | * rt_base_t rt_hw_interrupt_disable(); 20 | */ 21 | .globl rt_hw_interrupt_disable 22 | rt_hw_interrupt_disable: 23 | /* todo: mask interrupt, return previous state 24 | 25 | /* 26 | * void rt_hw_interrupt_enable(rt_base_t level); 27 | */ 28 | .globl rt_hw_interrupt_enable 29 | rt_hw_interrupt_enable: 30 | /* todo: restore interrupt state with given value 31 | 32 | /* 33 | * #ifdef RT_USING_SMP 34 | * void rt_hw_context_switch_to(rt_ubase_t to, stuct rt_thread *to_thread); 35 | * #else 36 | * void rt_hw_context_switch_to(rt_uint32 to); 37 | * #endif 38 | */ 39 | .globl rt_hw_context_switch_to 40 | rt_hw_context_switch_to: 41 | /* todo: sp = *(void*)to; */ 42 | #ifdef RT_USING_SMP 43 | /* todo: rt_cpus_lock_status_restore(to_thread); */ 44 | #endif /*RT_USING_SMP*/ 45 | /* todo: restore thread registers from sp 46 | return from exception 47 | */ 48 | 49 | .section .text.isr, "ax" 50 | /* 51 | * #ifdef RT_USING_SMP 52 | * void rt_hw_context_switch(rt_ubase_t from, rt_ubase_t to, struct rt_thread *to_thread); 53 | * #else 54 | * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to); 55 | * #endif 56 | */ 57 | .globl rt_hw_context_switch 58 | rt_hw_context_switch: 59 | /* todo: push all registers */ 60 | 61 | /* todo: *(void*)from = sp; @ store sp in preempted tasks TCB 62 | sp = *(void*)to; @ get new task stack pointer 63 | */ 64 | 65 | #ifdef RT_USING_SMP 66 | /* todo: call rt_cpus_lock_status_restore(to_thread); */ 67 | #endif /*RT_USING_SMP*/ 68 | 69 | /* todo: restore thread registers from sp 70 | return from exception 71 | */ 72 | 73 | /* 74 | * #ifdef RT_USING_SMP 75 | * void rt_hw_context_switch_interrupt(void *context, rt_ubase_t from, rt_ubase_t to, struct rt_thread *to_thread); 76 | * #else 77 | * void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to); 78 | * #endif 79 | */ 80 | .globl rt_hw_context_switch_interrupt 81 | rt_hw_context_switch_interrupt: 82 | #ifdef RT_USING_SMP 83 | /* Differences with rt_hw_context_switch, in interrupt handle, 84 | registers are almost always stored in the system stack, 85 | So we have to transfer them to the thread stack. */ 86 | 87 | /* todo: pop registers from system stack (param:context) and push to thread sp */ 88 | 89 | /* todo: *(void**)from = sp; @ store sp in preempted tasks TCB 90 | sp = *(void**)to; @ get new task stack pointer 91 | */ 92 | 93 | /* todo: call rt_cpus_lock_status_restore(to); */ 94 | 95 | /* todo: restore thread registers from sp 96 | return from exception 97 | */ 98 | #else /*RT_USING_SMP*/ 99 | /* todo: 100 | if (rt_thread_switch_interrupt_flag == 0) 101 | { 102 | rt_interrupt_from_thread = from; 103 | rt_thread_switch_interrupt_flag = 1; 104 | } 105 | rt_interrupt_to_thread = to; 106 | return; 107 | */ 108 | #endif /*RT_USING_SMP*/ 109 | 110 | -------------------------------------------------------------------------------- /smp_skeleton/libcpu/cpuport.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | #ifdef RT_USING_SMP 14 | int rt_hw_cpu_id(void) 15 | { 16 | int cpu_id = 0; 17 | /*todo: arch get cpu id to cpu_id*/ 18 | return cpu_id; 19 | } 20 | 21 | void rt_hw_spin_lock(rt_hw_spinlock_t *lock) 22 | { 23 | /* todo: */ 24 | } 25 | 26 | void rt_hw_spin_unlock(rt_hw_spinlock_t *lock) 27 | { 28 | /* todo: */ 29 | } 30 | 31 | 32 | void rt_hw_ipi_send(int ipi_vector, unsigned int cpu_mask) 33 | { 34 | /* todo: send ipi */ 35 | /* note: ipi_vector maybe different with irq_vector */ 36 | } 37 | 38 | void rt_hw_ipi_handler_install(int ipi_vector, rt_isr_handler_t ipi_isr_handler) 39 | { 40 | /* todo: set ipi handler */ 41 | /* note: ipi_vector maybe different with irq_vector */ 42 | } 43 | #endif /*RT_USING_SMP*/ 44 | 45 | void idle_wfi(void) 46 | { 47 | /*todo: wait for wakeup or do nothing */ 48 | } 49 | 50 | rt_uint8_t *rt_hw_stack_init(void *entry, 51 | void *parameter, 52 | rt_uint8_t *stack_addr, 53 | void *exit) 54 | { 55 | return RT_NULL; 56 | } 57 | 58 | /** 59 | * @addtogroup CPU 60 | */ 61 | /*@{*/ 62 | 63 | /** shutdown CPU */ 64 | void rt_hw_cpu_shutdown() 65 | { 66 | rt_uint32_t level; 67 | rt_kprintf("shutdown...\n"); 68 | 69 | level = rt_hw_interrupt_disable(); 70 | while (level) 71 | { 72 | RT_ASSERT(0); 73 | } 74 | } 75 | 76 | /*@}*/ 77 | -------------------------------------------------------------------------------- /smp_skeleton/libcpu/cpuport.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef CPUPORT_H__ 11 | #define CPUPORT_H__ 12 | 13 | #endif 14 | -------------------------------------------------------------------------------- /smp_skeleton/libcpu/interrupt.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | /* todo: plat define */ 14 | #define MAX_HANDLERS 128 15 | 16 | /* exception and interrupt handler table */ 17 | struct rt_irq_desc isr_table[MAX_HANDLERS]; 18 | 19 | #ifndef RT_USING_SMP 20 | /* todo: Those varibles will be used in ISR */ 21 | /* 22 | rt_uint32_t rt_interrupt_from_thread; 23 | rt_uint32_t rt_interrupt_to_thread; 24 | rt_uint32_t rt_thread_switch_interrupt_flag; 25 | */ 26 | #endif 27 | /** 28 | * This function will initialize hardware interrupt 29 | */ 30 | void rt_hw_interrupt_init(void) 31 | { 32 | /* initialize exceptions table */ 33 | rt_memset(isr_table, 0x00, sizeof(isr_table)); 34 | #ifndef RT_USING_SMP 35 | /* todo: init those varibles above */ 36 | /* 37 | rt_interrupt_from_thread = 0; 38 | rt_interrupt_to_thread = 0; 39 | rt_thread_switch_interrupt_flag = 0; 40 | */ 41 | #endif 42 | } 43 | 44 | /** 45 | * This function will install a interrupt service routine to a interrupt. 46 | * @param vector the interrupt number 47 | * @param new_handler the interrupt service routine to be installed 48 | * @param old_handler the old interrupt service routine 49 | */ 50 | rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler, 51 | void *param, const char *name) 52 | { 53 | rt_isr_handler_t old_handler = RT_NULL; 54 | 55 | if (vector < MAX_HANDLERS) 56 | { 57 | old_handler = isr_table[vector].handler; 58 | 59 | if (handler != RT_NULL) 60 | { 61 | #ifdef RT_USING_INTERRUPT_INFO 62 | rt_strncpy(isr_table[vector].name, name, RT_NAME_MAX); 63 | #endif /* RT_USING_INTERRUPT_INFO */ 64 | isr_table[vector].handler = handler; 65 | isr_table[vector].param = param; 66 | } 67 | } 68 | 69 | return old_handler; 70 | } 71 | 72 | void rt_hw_trap_irq(void) 73 | { 74 | void *param; 75 | unsigned long ir = 0; 76 | rt_isr_handler_t isr_func; 77 | extern struct rt_irq_desc isr_table[]; 78 | 79 | /* todo: get irq nr */ 80 | /* 81 | ir = get hw nr; 82 | */ 83 | 84 | /* get interrupt service routine */ 85 | isr_func = isr_table[ir].handler; 86 | #ifdef RT_USING_INTERRUPT_INFO 87 | isr_table[ir].counter++; 88 | #endif 89 | if (isr_func) 90 | { 91 | /* Interrupt for myself. */ 92 | param = isr_table[ir].param; 93 | /* turn to interrupt service routine */ 94 | isr_func(ir, param); 95 | } 96 | 97 | /* todo: end of interrupt */ 98 | } 99 | -------------------------------------------------------------------------------- /smp_skeleton/libcpu/interrupt.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #ifndef __INTERRUPT_H__ 11 | #define __INTERRUPT_H__ 12 | 13 | void rt_hw_interrupt_init(void); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /smp_skeleton/libcpu/secondary_cpu.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include 11 | #include 12 | #include 13 | 14 | #include "board.h" 15 | 16 | #ifdef RT_USING_SMP 17 | void rt_hw_timer2_isr(int vector, void *param) 18 | { 19 | rt_tick_increase(); 20 | /* todo: clear interrupt */ 21 | } 22 | 23 | void set_secondary_cpu_boot_address(void) 24 | { 25 | /* todo: Set the startup address of the secondary cpu to */ 26 | } 27 | 28 | void rt_hw_secondary_cpu_up(void) 29 | { 30 | 31 | set_secondary_cpu_boot_address(); 32 | /* todo: arch_mb() */ 33 | /* todo: plat secondary cpu start up */ 34 | } 35 | 36 | void secondary_cpu_c_start(void) 37 | { 38 | /* todo: this cpu interrupt vector init */ 39 | 40 | rt_hw_spin_lock(&_cpus_lock); 41 | 42 | /* todo: this cpu interrupt controller init */ 43 | /* todo: this cpu timer init */ 44 | /* todo: this cpu timer interrupt config */ 45 | 46 | rt_system_scheduler_start(); 47 | } 48 | 49 | void rt_hw_secondary_cpu_idle_exec(void) 50 | { 51 | /* todo: wait for wakeup or do nothing*/ 52 | } 53 | #endif /*RT_USING_SMP*/ -------------------------------------------------------------------------------- /smp_skeleton/libcpu/startup_gcc.S: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include "rtconfig.h" 11 | .text 12 | /* reset entry */ 13 | .globl _reset 14 | _reset: 15 | /* todo: arch init */ 16 | 17 | /* todo: set stack */ 18 | 19 | /* todo: clear .bss */ 20 | 21 | /* todo: call C++ constructors of global objects */ 22 | 23 | /* start RT-Thread Kernel */ 24 | /* todo: call _rtthread_startup*/ 25 | 26 | /*todo: exception vector */ 27 | 28 | #ifdef RT_USING_SMP 29 | .global secondary_cpu_start 30 | secondary_cpu_start: 31 | /* todo: this cpu init */ 32 | 33 | /* todo: init stack of this cpu*/ 34 | 35 | /* todo: jump to secondary_cpu_c_start*/ 36 | #endif -------------------------------------------------------------------------------- /smp_skeleton/libcpu/traps_gcc.S: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2006-2018, RT-Thread Development Team 3 | * 4 | * SPDX-License-Identifier: Apache-2.0 5 | * 6 | * Change Logs: 7 | * Date Author Notes 8 | */ 9 | 10 | #include "rtconfig.h" 11 | .text 12 | /*irq routine*/ 13 | .globl vector_irq 14 | vector_irq: 15 | /* todo: save regs */ 16 | 17 | /* todo: call rt_interrupt_enter() */ 18 | 19 | /* todo: call rt_hw_trap_irq() */ 20 | 21 | /* todo: call rt_interrupt_leave() */ 22 | 23 | #ifdef RT_USING_SMP 24 | 25 | /* todo: call rt_scheduler_do_irq_switch(context) */ 26 | /* note: context is the address of saved regs 27 | note: if need scheduler, rt_scheduler_do_irq_switch will not return 28 | */ 29 | 30 | #else /*RT_USING_SMP*/ 31 | /* todo: 32 | if (rt_thread_switch_interrupt_flag != 0) 33 | { 34 | rt_thread_switch_interrupt_flag = 0; 35 | 36 | todo: push regs to [sp] 37 | 38 | todo: *rt_interrupt_from_thread = sp; 39 | 40 | todo: sp = *rt_interrupt_to_thread; 41 | } 42 | */ 43 | #endif /*RT_USING_SMP*/ 44 | 45 | /* todo: restore thread registers from sp 46 | return from exception 47 | */ 48 | -------------------------------------------------------------------------------- /smp_skeleton/link.lds: -------------------------------------------------------------------------------- 1 | OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") 2 | OUTPUT_ARCH(arm) 3 | SECTIONS 4 | { 5 | . = 0x00000000; 6 | 7 | __text_start = .; 8 | .text : 9 | { 10 | *(.vectors) 11 | *(.text) 12 | *(.text.*) 13 | 14 | /* section information for finsh shell */ 15 | . = ALIGN(4); 16 | __fsymtab_start = .; 17 | KEEP(*(FSymTab)) 18 | __fsymtab_end = .; 19 | . = ALIGN(4); 20 | __vsymtab_start = .; 21 | KEEP(*(VSymTab)) 22 | __vsymtab_end = .; 23 | . = ALIGN(4); 24 | 25 | /* section information for modules */ 26 | . = ALIGN(4); 27 | __rtmsymtab_start = .; 28 | KEEP(*(RTMSymTab)) 29 | __rtmsymtab_end = .; 30 | 31 | /* section information for initialization */ 32 | . = ALIGN(4); 33 | __rt_init_start = .; 34 | KEEP(*(SORT(.rti_fn*))) 35 | __rt_init_end = .; 36 | } =0 37 | __text_end = .; 38 | 39 | __exidx_start = .; 40 | .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } 41 | __exidx_end = .; 42 | 43 | __rodata_start = .; 44 | .rodata : { *(.rodata) *(.rodata.*) } 45 | __rodata_end = .; 46 | 47 | . = ALIGN(4); 48 | .ctors : 49 | { 50 | PROVIDE(__ctors_start__ = .); 51 | KEEP(*(SORT(.ctors.*))) 52 | KEEP(*(.ctors)) 53 | PROVIDE(__ctors_end__ = .); 54 | } 55 | 56 | .dtors : 57 | { 58 | PROVIDE(__dtors_start__ = .); 59 | KEEP(*(SORT(.dtors.*))) 60 | KEEP(*(.dtors)) 61 | PROVIDE(__dtors_end__ = .); 62 | } 63 | 64 | __data_start = .; 65 | . = ALIGN(4); 66 | .data : 67 | { 68 | *(.data) 69 | *(.data.*) 70 | } 71 | __data_end = .; 72 | 73 | . = ALIGN(4); 74 | __bss_start = __data_end; 75 | .bss : 76 | { 77 | *(.bss) 78 | *(.bss.*) 79 | *(COMMON) 80 | . = ALIGN(4); 81 | } 82 | . = ALIGN(4); 83 | __bss_end = .; 84 | 85 | /* Stabs debugging sections. */ 86 | .stab 0 : { *(.stab) } 87 | .stabstr 0 : { *(.stabstr) } 88 | .stab.excl 0 : { *(.stab.excl) } 89 | .stab.exclstr 0 : { *(.stab.exclstr) } 90 | .stab.index 0 : { *(.stab.index) } 91 | .stab.indexstr 0 : { *(.stab.indexstr) } 92 | .comment 0 : { *(.comment) } 93 | 94 | _end = .; 95 | } 96 | -------------------------------------------------------------------------------- /smp_skeleton/rtconfig.h: -------------------------------------------------------------------------------- 1 | #ifndef RT_CONFIG_H__ 2 | #define RT_CONFIG_H__ 3 | 4 | /* Automatically generated file; DO NOT EDIT. */ 5 | /* RT-Thread Project Configuration */ 6 | 7 | /* RT-Thread Kernel */ 8 | 9 | #define RT_NAME_MAX 8 10 | #define RT_USING_SMP 11 | #define RT_CPUS_NR 2 12 | #define RT_ALIGN_SIZE 4 13 | /* RT_THREAD_PRIORITY_8 is not set */ 14 | #define RT_THREAD_PRIORITY_32 15 | /* RT_THREAD_PRIORITY_256 is not set */ 16 | #define RT_THREAD_PRIORITY_MAX 32 17 | #define RT_TICK_PER_SECOND 100 18 | #define RT_USING_OVERFLOW_CHECK 19 | #define RT_USING_HOOK 20 | #define RT_USING_IDLE_HOOK 21 | #define RT_IDEL_HOOK_LIST_SIZE 4 22 | #define IDLE_THREAD_STACK_SIZE 256 23 | /* RT_USING_TIMER_SOFT is not set */ 24 | #define RT_DEBUG 25 | /* RT_DEBUG_INIT_CONFIG is not set */ 26 | /* RT_DEBUG_THREAD_CONFIG is not set */ 27 | /* RT_DEBUG_SCHEDULER_CONFIG is not set */ 28 | /* RT_DEBUG_IPC_CONFIG is not set */ 29 | /* RT_DEBUG_TIMER_CONFIG is not set */ 30 | /* RT_DEBUG_IRQ_CONFIG is not set */ 31 | /* RT_DEBUG_MEM_CONFIG is not set */ 32 | /* RT_DEBUG_SLAB_CONFIG is not set */ 33 | /* RT_DEBUG_MEMHEAP_CONFIG is not set */ 34 | /* RT_DEBUG_MODULE_CONFIG is not set */ 35 | 36 | /* Inter-Thread communication */ 37 | 38 | #define RT_USING_SEMAPHORE 39 | #define RT_USING_MUTEX 40 | #define RT_USING_EVENT 41 | #define RT_USING_MAILBOX 42 | #define RT_USING_MESSAGEQUEUE 43 | /* RT_USING_SIGNALS is not set */ 44 | 45 | /* Memory Management */ 46 | 47 | #define RT_USING_MEMPOOL 48 | /* RT_USING_MEMHEAP is not set */ 49 | /* RT_USING_NOHEAP is not set */ 50 | #define RT_USING_SMALL_MEM 51 | /* RT_USING_SLAB is not set */ 52 | /* RT_USING_MEMTRACE is not set */ 53 | #define RT_USING_HEAP 54 | 55 | /* Kernel Device Object */ 56 | 57 | #define RT_USING_DEVICE 58 | /* RT_USING_DEVICE_OPS is not set */ 59 | /* RT_USING_INTERRUPT_INFO is not set */ 60 | #define RT_USING_CONSOLE 61 | #define RT_CONSOLEBUF_SIZE 128 62 | #define RT_CONSOLE_DEVICE_NAME "uart" 63 | #define RT_VER_NUM 0x40000 64 | #define ARCH_ARM 65 | #define ARCH_ARM_CORTEX_A 66 | #define ARCH_ARM_CORTEX_A9 67 | /* ARCH_CPU_STACK_GROWS_UPWARD is not set */ 68 | 69 | /* RT-Thread Components */ 70 | 71 | #define RT_USING_COMPONENTS_INIT 72 | #define RT_USING_USER_MAIN 73 | #define RT_MAIN_THREAD_STACK_SIZE 2048 74 | #define RT_MAIN_THREAD_PRIORITY 10 75 | 76 | /* C++ features */ 77 | 78 | /* RT_USING_CPLUSPLUS is not set */ 79 | 80 | /* Command shell */ 81 | 82 | #define RT_USING_FINSH 83 | #define FINSH_THREAD_NAME "tshell" 84 | #define FINSH_USING_HISTORY 85 | #define FINSH_HISTORY_LINES 5 86 | #define FINSH_USING_SYMTAB 87 | #define FINSH_USING_DESCRIPTION 88 | /* FINSH_ECHO_DISABLE_DEFAULT is not set */ 89 | #define FINSH_THREAD_PRIORITY 20 90 | #define FINSH_THREAD_STACK_SIZE 4096 91 | #define FINSH_CMD_SIZE 80 92 | /* FINSH_USING_AUTH is not set */ 93 | #define FINSH_USING_MSH 94 | #define FINSH_USING_MSH_DEFAULT 95 | /* FINSH_USING_MSH_ONLY is not set */ 96 | #define FINSH_ARG_MAX 10 97 | 98 | /* Device virtual file system */ 99 | 100 | #define RT_USING_DFS 101 | #define DFS_USING_WORKDIR 102 | #define DFS_FILESYSTEMS_MAX 2 103 | #define DFS_FILESYSTEM_TYPES_MAX 2 104 | #define DFS_FD_MAX 16 105 | /* RT_USING_DFS_MNTTABLE is not set */ 106 | /* RT_USING_DFS_ELMFAT is not set */ 107 | #define RT_USING_DFS_DEVFS 108 | /* RT_USING_DFS_ROMFS is not set */ 109 | /* RT_USING_DFS_RAMFS is not set */ 110 | /* RT_USING_DFS_UFFS is not set */ 111 | /* RT_USING_DFS_JFFS2 is not set */ 112 | 113 | /* Device Drivers */ 114 | 115 | #define RT_USING_DEVICE_IPC 116 | #define RT_PIPE_BUFSZ 512 117 | #define RT_USING_SERIAL 118 | #define RT_SERIAL_USING_DMA 119 | /* RT_USING_CAN is not set */ 120 | /* RT_USING_HWTIMER is not set */ 121 | /* RT_USING_CPUTIME is not set */ 122 | /* RT_USING_I2C is not set */ 123 | #define RT_USING_PIN 124 | /* RT_USING_ADC is not set */ 125 | /* RT_USING_PWM is not set */ 126 | /* RT_USING_MTD_NOR is not set */ 127 | /* RT_USING_MTD_NAND is not set */ 128 | /* RT_USING_MTD is not set */ 129 | /* RT_USING_PM is not set */ 130 | /* RT_USING_RTC is not set */ 131 | /* RT_USING_SDIO is not set */ 132 | /* RT_USING_SPI is not set */ 133 | /* RT_USING_WDT is not set */ 134 | /* RT_USING_AUDIO is not set */ 135 | 136 | /* Using WiFi */ 137 | 138 | /* RT_USING_WIFI is not set */ 139 | 140 | /* Using USB */ 141 | 142 | /* RT_USING_USB_HOST is not set */ 143 | /* RT_USING_USB_DEVICE is not set */ 144 | 145 | /* POSIX layer and C standard library */ 146 | 147 | #define RT_USING_LIBC 148 | /* RT_USING_PTHREADS is not set */ 149 | #define RT_USING_POSIX 150 | /* RT_USING_POSIX_MMAP is not set */ 151 | /* RT_USING_POSIX_TERMIOS is not set */ 152 | /* RT_USING_POSIX_AIO is not set */ 153 | /* RT_USING_MODULE is not set */ 154 | 155 | /* Network */ 156 | 157 | /* Socket abstraction layer */ 158 | 159 | /* RT_USING_SAL is not set */ 160 | 161 | /* light weight TCP/IP stack */ 162 | 163 | /* RT_USING_LWIP is not set */ 164 | 165 | /* Modbus master and slave stack */ 166 | 167 | /* RT_USING_MODBUS is not set */ 168 | 169 | /* AT commands */ 170 | 171 | /* RT_USING_AT is not set */ 172 | 173 | /* VBUS(Virtual Software BUS) */ 174 | 175 | /* RT_USING_VBUS is not set */ 176 | 177 | /* Utilities */ 178 | 179 | /* RT_USING_LOGTRACE is not set */ 180 | /* RT_USING_RYM is not set */ 181 | /* RT_USING_ULOG is not set */ 182 | /* RT_USING_LWP is not set */ 183 | 184 | /* RT-Thread online packages */ 185 | 186 | /* IoT - internet of things */ 187 | 188 | /* PKG_USING_PAHOMQTT is not set */ 189 | /* PKG_USING_WEBCLIENT is not set */ 190 | /* PKG_USING_WEBNET is not set */ 191 | /* PKG_USING_MONGOOSE is not set */ 192 | /* PKG_USING_WEBTERMINAL is not set */ 193 | /* PKG_USING_CJSON is not set */ 194 | /* PKG_USING_JSMN is not set */ 195 | /* PKG_USING_LJSON is not set */ 196 | /* PKG_USING_EZXML is not set */ 197 | /* PKG_USING_NANOPB is not set */ 198 | 199 | /* Wi-Fi */ 200 | 201 | /* Marvell WiFi */ 202 | 203 | /* PKG_USING_WLANMARVELL is not set */ 204 | 205 | /* Wiced WiFi */ 206 | 207 | /* PKG_USING_WLAN_WICED is not set */ 208 | /* PKG_USING_COAP is not set */ 209 | /* PKG_USING_NOPOLL is not set */ 210 | /* PKG_USING_NETUTILS is not set */ 211 | /* PKG_USING_AT_DEVICE is not set */ 212 | /* PKG_USING_WIZNET is not set */ 213 | 214 | /* IoT Cloud */ 215 | 216 | /* PKG_USING_ONENET is not set */ 217 | /* PKG_USING_GAGENT_CLOUD is not set */ 218 | /* PKG_USING_ALI_IOTKIT is not set */ 219 | /* PKG_USING_AZURE is not set */ 220 | /* PKG_USING_TENCENT_IOTKIT is not set */ 221 | 222 | /* security packages */ 223 | 224 | /* PKG_USING_MBEDTLS is not set */ 225 | /* PKG_USING_libsodium is not set */ 226 | /* PKG_USING_TINYCRYPT is not set */ 227 | 228 | /* language packages */ 229 | 230 | /* PKG_USING_LUA is not set */ 231 | /* PKG_USING_JERRYSCRIPT is not set */ 232 | /* PKG_USING_MICROPYTHON is not set */ 233 | 234 | /* multimedia packages */ 235 | 236 | /* PKG_USING_OPENMV is not set */ 237 | /* PKG_USING_MUPDF is not set */ 238 | 239 | /* tools packages */ 240 | 241 | /* PKG_USING_CMBACKTRACE is not set */ 242 | /* PKG_USING_EASYFLASH is not set */ 243 | /* PKG_USING_EASYLOGGER is not set */ 244 | /* PKG_USING_SYSTEMVIEW is not set */ 245 | /* PKG_USING_RDB is not set */ 246 | /* PKG_USING_QRCODE is not set */ 247 | /* PKG_USING_ULOG_EASYFLASH is not set */ 248 | 249 | /* system packages */ 250 | 251 | /* PKG_USING_GUIENGINE is not set */ 252 | /* PKG_USING_PERSIMMON is not set */ 253 | /* PKG_USING_CAIRO is not set */ 254 | /* PKG_USING_PIXMAN is not set */ 255 | /* PKG_USING_LWEXT4 is not set */ 256 | /* PKG_USING_PARTITION is not set */ 257 | /* PKG_USING_FAL is not set */ 258 | /* PKG_USING_SQLITE is not set */ 259 | /* PKG_USING_RTI is not set */ 260 | /* PKG_USING_LITTLEVGL2RTT is not set */ 261 | /* PKG_USING_CMSIS is not set */ 262 | /* PKG_USING_DFS_YAFFS is not set */ 263 | /* PKG_USING_LITTLEFS is not set */ 264 | 265 | /* peripheral libraries and drivers */ 266 | 267 | /* PKG_USING_REALTEK_AMEBA is not set */ 268 | /* PKG_USING_SHT2X is not set */ 269 | /* PKG_USING_AHT10 is not set */ 270 | /* PKG_USING_AP3216C is not set */ 271 | /* PKG_USING_STM32_SDIO is not set */ 272 | /* PKG_USING_ICM20608 is not set */ 273 | /* PKG_USING_U8G2 is not set */ 274 | /* PKG_USING_BUTTON is not set */ 275 | /* PKG_USING_MPU6XXX is not set */ 276 | /* PKG_USING_PCF8574 is not set */ 277 | /* PKG_USING_KENDRYTE_SDK is not set */ 278 | 279 | /* miscellaneous packages */ 280 | 281 | /* PKG_USING_LIBCSV is not set */ 282 | /* PKG_USING_OPTPARSE is not set */ 283 | /* PKG_USING_FASTLZ is not set */ 284 | /* PKG_USING_MINILZO is not set */ 285 | /* PKG_USING_QUICKLZ is not set */ 286 | /* PKG_USING_MULTIBUTTON is not set */ 287 | /* PKG_USING_CANFESTIVAL is not set */ 288 | /* PKG_USING_ZLIB is not set */ 289 | /* PKG_USING_DSTR is not set */ 290 | /* PKG_USING_TINYFRAME is not set */ 291 | 292 | /* samples: kernel and components samples */ 293 | 294 | /* PKG_USING_KERNEL_SAMPLES is not set */ 295 | /* PKG_USING_FILESYSTEM_SAMPLES is not set */ 296 | /* PKG_USING_NETWORK_SAMPLES is not set */ 297 | /* PKG_USING_PERIPHERAL_SAMPLES is not set */ 298 | /* PKG_USING_HELLO is not set */ 299 | 300 | /* Privated Packages of RealThread */ 301 | 302 | /* PKG_USING_CODEC is not set */ 303 | /* PKG_USING_PLAYER is not set */ 304 | /* PKG_USING_PERSIMMON_SRC is not set */ 305 | /* PKG_USING_JS_PERSIMMON is not set */ 306 | /* PKG_USING_JERRYSCRIPT_WIN32 is not set */ 307 | 308 | /* Network Utilities */ 309 | 310 | /* PKG_USING_WICED is not set */ 311 | /* PKG_USING_CLOUDSDK is not set */ 312 | /* PKG_USING_COREMARK is not set */ 313 | /* PKG_USING_POWER_MANAGER is not set */ 314 | /* PKG_USING_RT_OTA is not set */ 315 | /* PKG_USING_RDBD_SRC is not set */ 316 | /* PKG_USING_RTINSIGHT is not set */ 317 | /* PKG_USING_SMARTCONFIG is not set */ 318 | /* PKG_USING_RTX is not set */ 319 | #define BOARD_SKELETON 320 | 321 | /* Hardware Drivers Config */ 322 | 323 | /* On-chip Peripheral Drivers */ 324 | 325 | #define BSP_USING_UART1 326 | /* BSP_USING_UART2 is not set */ 327 | /* BSP_USING_SPI1 is not set */ 328 | /* BSP_USING_SPI2 is not set */ 329 | /* BSP_USING_I2C1 is not set */ 330 | 331 | /* Onboard Peripheral Drivers */ 332 | 333 | /* Offboard Peripheral Drivers */ 334 | 335 | 336 | #endif 337 | -------------------------------------------------------------------------------- /smp_skeleton/rtconfig.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | # toolchains options 4 | ARCH='arm' 5 | CPU='TBD' 6 | CROSS_TOOL='gcc' 7 | 8 | if os.getenv('RTT_CC'): 9 | CROSS_TOOL = os.getenv('RTT_CC') 10 | 11 | PLATFORM = 'gcc' 12 | EXEC_PATH = '/opt/gcc-arm-none-eabi-4_8-2014q1_gri/bin' 13 | 14 | if os.getenv('RTT_EXEC_PATH'): 15 | EXEC_PATH = os.getenv('RTT_EXEC_PATH') 16 | 17 | BUILD = 'debug' 18 | 19 | if PLATFORM == 'gcc': 20 | # toolchains 21 | PREFIX = 'arm-none-eabi-' 22 | CC = PREFIX + 'gcc' 23 | AS = PREFIX + 'gcc' 24 | AR = PREFIX + 'ar' 25 | CXX = PREFIX + 'g++' 26 | LINK = PREFIX + 'gcc' 27 | TARGET_EXT = 'elf' 28 | SIZE = PREFIX + 'size' 29 | OBJDUMP = PREFIX + 'objdump' 30 | OBJCPY = PREFIX + 'objcopy' 31 | STRIP = PREFIX + 'strip' 32 | 33 | DEVICE = ' -march=armv7-a -marm -msoft-float' 34 | CFLAGS = DEVICE + ' -Wall' 35 | AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__ASSEMBLY__ -I.' 36 | LINK_SCRIPT = 'link.lds' 37 | LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,system_vectors'+\ 38 | ' -T %s' % LINK_SCRIPT 39 | 40 | CPATH = '' 41 | LPATH = '' 42 | 43 | # generate debug info in all cases 44 | AFLAGS += ' -gdwarf-2' 45 | CFLAGS += ' -g -gdwarf-2' 46 | 47 | if BUILD == 'debug': 48 | CFLAGS += ' -O0' 49 | else: 50 | CFLAGS += ' -O2' 51 | 52 | CXXFLAGS = CFLAGS + ' -Woverloaded-virtual -fno-exceptions -fno-rtti' 53 | 54 | M_CFLAGS = CFLAGS + ' -mlong-calls -fPIC ' 55 | M_CXXFLAGS = CXXFLAGS + ' -mlong-calls -fPIC' 56 | M_LFLAGS = DEVICE + CXXFLAGS + ' -Wl,--gc-sections,-z,max-page-size=0x4' +\ 57 | ' -shared -fPIC -nostartfiles -nostdlib -static-libgcc' 58 | M_POST_ACTION = STRIP + ' -R .hash $TARGET\n' + SIZE + ' $TARGET \n' 59 | 60 | POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' +\ 61 | SIZE + ' $TARGET \n' 62 | --------------------------------------------------------------------------------